Выбор выпадающего списка Ajax с использованием Selenium для Firefox - PullRequest
0 голосов
/ 03 июля 2011

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

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

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

Ответы [ 2 ]

1 голос
/ 21 июня 2018

У меня была похожая проблема, при которой селену удалось найти выпадающее меню, но он не смог щелкнуть видимый текст.Позже я узнал, что был вызов 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);
    }
}
0 голосов
/ 04 июля 2011

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

. Похоже, элемент отключен.(Java-кодирование)

, если это так 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 до тех пор, пока он не вернет истину или не будет предоставлено время ожидания

здесь важно проанализировать элемент 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");

и тд .....

...