【问题标题】:C#: Selecting Dropdown Items with Marionette DriverC#:使用 Marionette 驱动程序选择下拉项
【发布时间】:2016-11-10 09:39:18
【问题描述】:

我正在使用 Selenium WebdriverC# 绑定,并尝试从旧的 FirefoxDriver(FF 47 之前)切换到新的 Marionette driver(FF47 及更高版本),并且在一些似乎出现的初期问题之后它运行良好通过发布Selenium 2.53.1FF 47.0.1 进行修复。

现在唯一的问题是在选择标签下选择选项标签似乎有问题。以下代码适用于我正在测试的所有其他浏览器(FF 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 驱动程序仍在解决这个问题?

【问题讨论】:

  • 你有同样的工作吗?我面临着完全相同的问题,我已经尝试了所有我能找到的解决这个问题的方法,任何帮助都会很棒

标签: javascript c# selenium firefox-marionette


【解决方案1】:

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

}

希望它会起作用...:)

【讨论】:

  • 部分有效。似乎只要下拉列表没有依赖关系,它就可以正常工作。但是,如果存在依赖关系(即所选下拉列表中的值取决于先前填充的下拉列表中的值),则选择该值,并且一旦选择了提交值的按钮,依赖框中的下拉值就会消失 Good回答,虽然!!快到了!!
  • 这个选项对我也不起作用,你让司机等了吗?
【解决方案2】:

我只是通过使用类似于上面描述的 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 是下拉菜单的选择标签

似乎是一种迂回的方式来执行其他 Selenium 驱动程序自动执行的操作,但它确实有效

【讨论】:

    猜你喜欢
    • 2016-12-25
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 2014-06-06
    • 2020-08-11
    • 2018-01-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多