当我尝试使用Selenium WebDriver在下拉列表中选择一个值时,我在FireFox中遇到了一些奇怪的行为。我正在尝试采取的步骤:
这在Chrome和IE中完美运行。但是,在FireFox中,单击打开选项(我可以选择的项目显示),我想要选择的项目被点击(获得突出显示为选定项目),但是当选择了不同的选择元素并且选择项目是'关闭',默认值会一直显示在选择项中。当我在调试模式中单步执行这段代码时,它的工作原理应该如此!这表明答案可能是在步骤之间所花费的时间,但是尝试不同长度的Sleep()并没有给出任何结果。
总结一下:
我想要的是什么:
什么时候起作用:
何时不起作用:
处理此部分场景的代码:
// 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配置文件并禁用本机事件无法解决问题。
答案 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秒后仍未显示,则会抛出异常..