Объект Selenium2 Select не запускает событие onchange в IE8 - PullRequest
1 голос
/ 01 декабря 2011

В моем приложении есть два тега <select>.Первый изменяет параметры внутри второго и включает его в событии onchange.

Когда я использую объект Select, предоставленный Selenium2, это событие не запускается при работе в 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> всегда выбирается, в то время как событие запускается только иногда.

Очевидно, что лучшим вариантом является выбор Select для работы в IE8.Кто-нибудь еще видел эту проблему?Похоже, ошибка в Selenium2.Есть ли известный обходной путь для этого?

Ответы [ 3 ]

1 голос
/ 02 декабря 2011

Поговорив с людьми из Selenium в чате #selenium IRC, я остановился на этом исправлении:

WebElement selectElement = getElementByName(name);
Select select = new Select(selectElement);
element.selectByValue(value);
if(usingIE) {
    webDriver.executeScript("$(arguments[0]).fireEvent('change');", selectElement);
}
0 голосов
/ 02 декабря 2011

Использую приведенный ниже код для выбора значения в списке «Страна» (после выбора значения «Страна» загружается соответствующий список «Состояние»):

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;
    }
}

Примечание. Эта операция выбора занимает гораздо больше времени IE, если сравнивать с FF. Вам может потребоваться увеличить время ожидания команды с помощью driver.manage ().

0 голосов
/ 02 декабря 2011

Похоже, вы уже реализуете класс SelectElement, поэтому вы пробовали это

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