3

当我尝试使用 Selenium WebDriver 在下拉列表中选择一个值时,我在 FireFox 中遇到了一些奇怪的行为。我正在尝试采取的步骤:

  • 单击打开选择元素
  • 点击我要选择的项目
  • 单击打开下一个选择元素

这在 Chrome 和 IE 中完美运行。However, in FireFox, the select is clicked open (the items I can choose from are shown), the item I want to select ís clicked (get's highlighted as selected item), but when a different select element is selected and the select item is '关闭',默认值一直显示在选择项中。当我在调试模式下单步执行这段代码时,它的工作方式就像它应该的那样!这表明也许答案可能在于步骤之间的时间,但尝试不同长度的 Sleep() 并没有给出任何结果。

总结一下:

我想要的是:

  • 单击打开选择元素
  • 点击我要选择的项目
  • 单击打开下一个选择元素

什么时候起作用:

  • Chrome中的运行场景
  • Internet Explorer 中的运行场景
  • 逐步浏览 FireFox 中的场景

什么时候不起作用:

  • FireFox 中的运行场景

处理这部分场景的代码:

// GetRandomValue() is a simplified representation of the code that just gives me a 
// random value from the dropdown to select
var randomDropdownValue = GetRandomValue();

Driver.FindElement(By.Id(dropdownId)).Click();

SelectElement dropdownList = new SelectElement(Driver.FindElement(By.Id(dropdownId)));
dropdownList.SelectByValue(randomDropdownValue);

更新

创建自定义 FireFox 配置文件并禁用本机事件并不能解决问题。

4

2 回答 2

3

这个问题的解决方案似乎非常简单!

当它不起作用时我做了什么:

  • 点击打开下拉菜单
  • 在下拉列表中选择元素
  • 继续下一个下拉菜单

我现在做什么工作:

  • 在下拉列表中选择元素
  • 继续下一个下拉菜单

我试图模仿用户的行为。在选择我希望在 Chrome 和 Internet Explorer 中工作的下拉选项之前单击打开下拉列表时,FireFox 的“宽容度较低”并表现出“奇怪”的行为。该解决方案在 FireFox、Chrome 和 Internet Explorer 的所有情况下都有效(据我现在所见)!

更新(@aaa90210 询问我用来选择元素的代码)

如果创建了一个可以从我项目中的任何位置调用的方法。此方法的精简版是:

 internal static void SelectOption(OptionType optionType, string dropdownId, string option)
    {                     
        try
        {
            switch (optionType)
            {
                case OptionType.ByText:
                    new SelectElement(WebElement.Get(WebElement.Identifiers.Id, dropdownId)).SelectByText(option);
                    break;

                case OptionType.ByValue:
                    new SelectElement(WebElement.Get(WebElement.Identifiers.Id, dropdownId)).SelectByValue(option);
                    break;
            }
        }
        catch (Exception exception)
        {                
            throw;
        }
    }
于 2013-10-17T12:58:12.893 回答
-1

使用WebDriverWait而不是sleep()总是更好,因为您不会确切知道下一个元素出现需要多少秒。

new WebDriverWait(driver,100).until(ExpectedConditions.visibilityOfElementLocated(By.Id("id_of_element")));

此代码将等到所需元素可见,如果它在 100 秒后仍未显示,则会引发异常。

于 2013-10-12T04:26:09.753 回答