Javascript C#:使用木偶驱动程序选择下拉项

Javascript C#:使用木偶驱动程序选择下拉项,javascript,c#,selenium,firefox-marionette,Javascript,C#,Selenium,Firefox Marionette,我正在使用带有C#绑定的Selenium Webdriver,并尝试从旧的FirefoxDriver(FF 47之前)切换到新的木偶驱动程序(FF47及以上版本)而且它在一些初期问题之后工作得很好,这些问题似乎随着Selenium 2.53.1和FF 47.0.1的发布而得到了解决 现在唯一的问题是,在选择标记下选择选项标记似乎有问题。以下代码适用于我正在测试的所有其他浏览器(FF

我正在使用带有
C#
绑定的
Selenium Webdriver
,并尝试从旧的FirefoxDriver(FF 47之前)切换到新的
木偶驱动程序(FF47及以上版本)而且它在一些初期问题之后工作得很好,这些问题似乎随着
Selenium 2.53.1
FF 47.0.1
的发布而得到了解决

现在唯一的问题是,在选择标记下选择选项标记似乎有问题。以下代码适用于我正在测试的所有其他浏览器(FF<46,Chrome,IE)。我正在将以下参数传递到我的
dropdownSelect
函数中。选择
IWebElement
和要搜索的文本。以下是函数定义:

public static void dropdownSelect(IWebDriver driver, IWebElement inObject, string inText)
我尝试过使用
SelectElement()
类,就像我在所有其他浏览器中一样

select = new SelectElement(inObject);

//select the matching element
select.SelectByText(inText);
我还尝试获取该选项的集合,并使用
Click()
滚动该集合:

不会选择任何内容,也不会引发错误或异常。它只是继续它的快乐之路,没有选择任何东西


我是做错了什么,还是新的木偶驱动程序仍在解决这一问题?

使用
ExecuteScript()
尝试整个操作,如下所示:-

public static void dropdownSelect(IWebDriver driver, IWebElement inObject, string inText) {

   IJavaScriptExecutor js = driver as IJavaScriptExecutor;
   js.ExecuteScript("var select = arguments[0]; for(var i = 0; i < select.options.length; i++){ if(select.options[i].text == arguments[1]){ select.options[i].selected = true; } }", inObject, inText);

}
publicstaticvoiddropdownselect(IWebDriver驱动程序、IWebElement inObject、string inText){
IJavaScriptExecutor js=驱动程序作为IJavaScriptExecutor;
js.ExecuteScript(“var select=arguments[0];for(var i=0;i

希望它能起作用……:)

ExecuteScript()
尝试整个操作,如下所示:-

public static void dropdownSelect(IWebDriver driver, IWebElement inObject, string inText) {

   IJavaScriptExecutor js = driver as IJavaScriptExecutor;
   js.ExecuteScript("var select = arguments[0]; for(var i = 0; i < select.options.length; i++){ if(select.options[i].text == arguments[1]){ select.options[i].selected = true; } }", inObject, inText);

}
publicstaticvoiddropdownselect(IWebDriver驱动程序、IWebElement inObject、string inText){
IJavaScriptExecutor js=驱动程序作为IJavaScriptExecutor;
js.ExecuteScript(“var select=arguments[0];for(var i=0;i

希望它能工作…:)

我通过使用类似于上面描述的Javascript来解决这个问题。因为当这个下拉列表发生变化时,它有一个依赖关系,所以当它在Selenium中被找到时,我选择了适当的选项,并启动了onchange,甚至使用Javascript

下面是选择框的HTML

<select class="T2FormControl"   id="ctl00_pageContent_TableList_T2DropDownList_DropDownList" onchange="javascript:setTimeout('__doPostBack(\'ctl00$pageContent$TableList$T2DropDownList$DropDownList\',\'\')', 0)" name="ctl00$pageContent$TableList$T2DropDownList$DropDownList">
IWebElement thsItem是选中的选项,IWebElement inObject是下拉列表的选择标记


似乎是一种迂回的方式来完成其他Selenium驱动程序自动完成的事情,但它可以工作

我通过使用类似于上面所述的Javascript来解决这个问题。因为当这个下拉列表发生变化时,它有一个依赖关系,所以当它在Selenium中被找到时,我选择了适当的选项,并启动了onchange,甚至使用Javascript

下面是选择框的HTML

<select class="T2FormControl"   id="ctl00_pageContent_TableList_T2DropDownList_DropDownList" onchange="javascript:setTimeout('__doPostBack(\'ctl00$pageContent$TableList$T2DropDownList$DropDownList\',\'\')', 0)" name="ctl00$pageContent$TableList$T2DropDownList$DropDownList">
IWebElement thsItem是选中的选项,IWebElement inObject是下拉列表的选择标记


似乎是一种迂回的方式来完成其他Selenium驱动程序自动完成的事情,但它可以部分工作。似乎只要不依赖下拉列表,它就可以正常工作。但是,如果存在相关性(即所选下拉列表中的值取决于先前填充的下拉列表中的值),则会选择该值,并且一旦选择提交值的按钮,则“相关性”框中的下拉列表值将消失。不过,回答正确!!快到了!!这个选项对我也不起作用,你让司机等了吗?部分有效。似乎只要不依赖下拉列表,它就可以正常工作。但是,如果存在相关性(即所选下拉列表中的值取决于先前填充的下拉列表中的值),则会选择该值,并且一旦选择提交值的按钮,则“相关性”框中的下拉列表值将消失。不过,回答正确!!快到了!!这个选项对我也不起作用,你让司机等了吗?你得到同样的效果了吗?我面临着完全相同的问题,我已经尝试了我能找到的解决这个问题的每一个选项,任何帮助都将是巨大的你得到同样的工作吗?我面临着完全相同的问题,我已经尝试了所有我能找到的解决这个问题的方法,任何帮助都会很好
//click option element and for change event
js.ExecuteScript("arguments[0].selected = true;" +
                 "var element=arguments[1];" +
                 "var event=document.createEvent(\"HTMLEvents\");" + 
                 "event.initEvent('change', false, true);" +
                 "element.dispatchEvent(event);", thsItem, inObject);