Выбор раскрывающегося списка предложений Ajax с использованием Selenium для Firefox

Как я могу выбрать элемент списка предложений Ajax Dropdown, используя код селена для Firefox?

Моя проблема: раскрывающийся список Ajax виден, но он не выбран, и следующие шаги застревают. Может быть, селен чего-то ждет.

список, который заполняет страница, является динамическим и содержит теги bla bla. Помогите с примером кода. Как я могу использовать waitfor* здесь. Помните, что я не использую Firefox IDE, но я пишу код. Пожалуйста помоги.


person RosAng    schedule 03.07.2011    source источник


Ответы (2)


У меня была аналогичная проблема, из-за которой селен смог найти раскрывающееся меню, но не смог щелкнуть видимый текст. Позже я узнал, что был вызов Ajax, который заполнял данные раскрывающегося меню, и в результате селен, похоже, не мог выбрать предполагаемый видимый текст, потому что элементы списка не были полностью заполнены. То есть к моменту, когда скрипт выбирал значение моей опции, Ajax не полностью загрузил опции меню. Вот мое решение:

public void nameOfCollegeList(String optionItem) {
    // declare the dropdownMenu web element
    WebElement dropDownMenu = driver.findElement(By.cssSelector("#CollegeNames"));
    // click on the dropdownMenu element to initiate Ajax call
    dropDownMenu.click();
    // keep checking the drop down menu item list until you find the desired text that indicates that the menu has
    // been fully loaded. In this example I always expect "Other (please specify)" to be the last item in the drop down menu.
    // If I don't find the expected last item in the list in my if condition, execute the else condition by calling the 
    // same method(recursively). Please note that if the "if" statement is never satisfied then you'll end up with an
    // infinite loop.
    if (dropDownMenu.getText().contains("Other (please specify)")) {
        new Select(dropDownMenu).selectByVisibleText(optionItem);
    }
    else {
        nameOfCollegeList(optionItem);
    }
}
person a_myze    schedule 21.06.2018

меня немного смущает ваш вопрос в «: выпадающий список Ajax виден, но не выбран»

это звучит так, как будто элемент отключен. (Java-кодирование)

if so selenium.isElementDisabled()

если не тогда,

1) решение языка программирования с использованием цикла while и isElementPresent() ИЛИ isElementDisabled()

 //trigger the Ajax request and then
long initialTime = System.currentTimeMillis(); 

 do{
    thread.sleep(1000);
 }while((!selenium.isElementPresent("AjaxElement")) && (System.getCurrentTimeMillis() - initialTime <= 5000)) ;

// что-то вроде вышеприведенного решения для клиентского программирования... но для,

2) встроенное решение селена

у нас есть метод с именем waitForCondition("java script to be executed", "time out value"); этот метод зацикливает оператор javascript до тех пор, пока он не вернет true или не произойдет предоставленный тайм-аут

здесь важно проанализировать элемент application/Ajax, чтобы выяснить, какое именно состояние элемента изменяется.

из вашего объяснения я предполагаю, что display=none будет изменено на display=block ИЛИ disabled=true будет изменено на disabled=false ИЛИ isReadOnly будет изменено на отсутствие такого атрибута и т. д...... (вам нужно это выяснить)

а затем используйте этот attribute = value для создания функции javascript как,

selenium.waitForCondition("window.document.getElementById('AJAX ELEMENT').disabled == 'false'", "3000");

вы можете отработать приведенное выше утверждение, как хотите, на своем языке программирования.

try {
//do the action which triggers the Ajax call
  selenium.waitForCondition("window.document.getElementById('AJAX ELEMENT[drop down element]').disabled == 'false'", "3000");
//OR
  selenium.waitForCondition("window.document.getElementById('AJAX ELEMENT').disabled == 'false'", "3000");
}
catch(SeleniumException se) 
{
  if((se.getMessage()).toLowerCase().contains("timed out")
    throw //..some a custom exception however your organisation requires
}
selenium.select("drop down element id", "option id");

и так далее.....

person sudarsan    schedule 04.07.2011