2011-12-01 123 views
1

在我的应用程序中,我有两个<select>标签。第一个更改第二个选项中的选项,并在onchange事件中启用它。Selenium2的选择对象不会在IE8中触发onchange事件

当我使用Selenium2提供的Select对象时,它不会在IE8中运行时触发该事件(在FF中工作良好,而且手动执行时)。

Select select = new Select(getElementByName(name)); 
element.selectByValue(value); 

第一个<select>按预期变化。但是,第二个<select>保持空白并被禁用。我试过这个作为解决方法:

if(ie) { 
    WebElement select = getElementByName(name); 
    WebElement option = select.findElement(By.cssSelector("[value='"+value+"']")); 

    List<WebElement> options = select.findElements(By.cssSelector("option")); 
    //select the first element 
    options.get(0).click(); 

    //make sure the select is focused 
    select.click(); //open 
    select.click(); //close 

    Keyboard keyboard = getWebDriver().getKeyboard(); 
    for(int i = 0; i < options.size() && option.getAttribute("selected") == null; i++) { 
     keyboard.pressKey(Keys.DOWN); 
     //note: if i do a Thread.sleep(100); here, it works more consistently, but still not 100% 
    } 
} else { 
    // Do the above snippet 
} 

但现在我得到不一致的结果。所需的<option>总是被选中,而有时只有事件被触发。

很明显,最好的选择是让选择在IE8中工作。有其他人看过这个问题吗?看起来像Selenium2中的一个错误。有没有已知的解决方法?

+0

我都没有这个确切的问题,但我有问题,其中硒工作的最时间,但有时由于该元素尚未出现在页面上而大部分时间都会失败。我写了一个方法,等待元素加载,然后再试一次。如果再次失败,我会自动重新测试失败。不是最佳的,但它的工作原理。 –

回答

1

与一些#selenium IRC聊天室我在此修复程序解决的硒民间的交谈后:

WebElement selectElement = getElementByName(name); 
Select select = new Select(selectElement); 
element.selectByValue(value); 
if(usingIE) { 
    webDriver.executeScript("$(arguments[0]).fireEvent('change');", selectElement); 
} 
0

看起来你已经实现SelectElement类,以便让你尝试使用下面的代码此

WebElement element = getElementByName(name); 
element.FindElement(By.CssSelector("option[value='" + value + "']").Select(); 
0

AM,选择在“国家”列表中的值(一旦“国家”价值选择,相应的“状态'列表正在加载):

WebElement selectCountry = driver.findElement(By.id("country")); 
List<WebElement> options = selectCountry.findElements(By.tagName("option")); 
for(WebElement option : options){ 
    if(option.getText().equalsIgnoreCase("India")){ 
     option.click(); 
     break; 
    } 
} 

注 - 与FF相比,此选择操作需要更多时间IE。您可能需要使用driver.manage()来增加命令超时时间。

相关问题