FireFox中使用Selenium WebDriver的下拉行为问题

时间:2013-10-11 07:47:24

标签: firefox selenium selenium-webdriver

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

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

这在Chrome和IE中完美运行。但是,在FireFox中,单击打开选项(我可以选择的项目显示),我想要选择的项目被点击(获得突出显示为选定项目),但是当选择了不同的选择元素并且选择项目是'关闭',默认值会一直显示在选择项中。当我在调试模式中单步执行这段代码时,它的工作原理应该如此!这表明答案可能是在步骤之间所花费的时间,但是尝试不同长度的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配置文件并禁用本机事件无法解决问题。

2 个答案:

答案 0 :(得分: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;
        }
    }

答案 1 :(得分:-1)

使用 WebDriverWait 而不是 sleep()总是更好,因为您不知道下一个元素出现的确切时间。

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

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