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

时间:2016-07-07 22:17:37

标签: javascript c# selenium firefox-marionette

我正在使用带有Selenium Webdriver绑定的C#并尝试从旧的FirefoxDriver(FF 47之前版本)切换到新的Marionette driver(FF47及以上版本),之后它运行良好Selenium 2.53.1FF 47.0.1的释放似乎解决了一些问题。

现在唯一的问题是在select标签下选择选项标签似乎有问题。以下代码适用于我正在测试的所有其他浏览器(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()获取选项的集合并滚动浏览集合:

IJavaScriptExecutor js = driver as IJavaScriptExecutor;
ReadOnlyCollection<IWebElement> optDropdown;

optDropdown = inObject.FindElements(By.TagName("option"));

foreach (IWebElement thsItem in optDropdown)
 {
   //check for matching text
    if (thsItem.Text == inText)
     {
       // 1/4 second wait
       Thread.Sleep(250);

       thsItem.Click()

       //exit foreach loop
       break;
     }
 }

javascript点击代替thsItem.Click()代码

//click option element
js.ExecuteScript("arguments[0].click();", thsItem);

没有选择任何内容,也没有抛出任何错误或异常。它只是继续它的快乐方式而没有选择任何东西

我做错了什么或者是否仍在使用新的Marionette驱动程序解决这个问题?

2 个答案:

答案 0 :(得分:0)

使用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);

}

希望它能奏效...... :)

答案 1 :(得分:0)

我通过使用类似于上面描述的Javascript来解决这个问题。由于在更改时对此下拉列表存在依赖性,因此在Selenium中找到它时选择了相应的选项,即使使用Javascript也会触发onchange

这里是选择框的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">

执行操作的Javascript

//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);

使用IWebElement thsItem是选中的选项,IWebElement inObject是下拉列表的select标签

看起来像是一种迂回的方式来做其他Selenium驱动程序自动执行的操作,但它可以正常工作