WebDriver Select Option из выпадающего меню Javascript CSS работает в IDE, а не в коде

У меня возникли проблемы с выбором элемента из раскрывающегося списка Javascript (т. е. элементы в раскрывающемся списке не скрыты в дереве DOM, их вообще нет, пока не будет нажата ссылка). Я пытался использовать класс Actions следующим образом:

    Actions cursor = new Actions(driver);
    cursor.moveToElement(linkThataDropsMenu).perform();
    cursor.click();

Я пытался использовать функцию clickAndWait(), но, по-видимому, ее нет в библиотеках Java webDriver, и я пробовал множество вариантов приостановки и щелчка в своем коде, включая двойной щелчок. clickAndHold() также ничего не делает.

Ниже показано дерево DOM после создания меню. Единственное, что меняется при нажатии, это вставка div class="menu"

<div id="divIdActive_2" class="data number active" style="min-height: 21px;">
<a class="opencnl" href="#">
    <span id="opencnlSpan" class="active" style="background-color: 
                             transparent;">800-852-2222</span>
</a>
<img class="tollFree" title="Display name(s) for Toll free function properly on 
                     Verizon Wireless devices, but may be omitted by other carriers on 
                     their devices." src="img/nil.gif">
<input id="customNum" type="hidden" value="8008522222" name="number_2">
<div class="menu">
    <a class="edit" href="#">Change Custom Number</a>
    <a class="copy" href="#">Copy Settings for 0 Selected Lines</a>
    <a class="clear" href="#">Clear Settings For this Line</a>
</div>
</div>

Вот что странно: я могу заставить меню выпасть из IDE, используя click() или clickAndWait() и точно такой же локатор. Из моего Java-кода я могу использовать свои локаторы для сбора текста элемента, который я хочу щелкнуть, но я не могу щелкнуть элемент. В моем Java-коде есть сотни других команд щелчка, которые отлично работают, но не здесь. Есть идеи? Спасибо хотя бы за то, что прочитали!


person TenFour    schedule 13.01.2012    source источник


Ответы (2)


Вы пробовали использовать функцию isDisplayed()? Какой бы вариант вы ни выбрали, он должен быть виден до того, как его можно будет щелкнуть. Итак, вместо clickAndWait(), который был у селена 1, у нас есть element.isDisplayed(). Это имеет неявное ожидание (устанавливается при создании драйвера браузера, см. документацию). По умолчанию, когда Selenium встречает функцию isDisplayed, он ждет столько же времени, прежде чем двигаться дальше.

person crazyaboutliv    schedule 16.01.2012
comment
Эй, спасибо за ответ. Часть моей проблемы заключается в том, что isDisplayed() не будет работать для меня, потому что элемент создается (не отображается/скрывается) с помощью Javascript. Но помимо этого не похоже, что что-либо основанное на ожидании поможет, потому что я захватываю новый элемент сразу после щелчка, и он уже ушел, поэтому должно быть так, что к тому времени, когда я применил функцию ожидания, он исчезнет тогда тоже верно? Ожидание только отдаляет меня от микросекунды, когда эти элементы существовали (если они вообще когда-либо были сгенерированы). - person TenFour; 20.01.2012

Я понял! Хитрость заключалась в том, чтобы навести указатель мыши на элемент, затем щелкнуть, затем снова навести указатель мыши на элемент, в результате чего курсор останется там, а затем захватить только что отрендеренные объекты. Теперь я предполагаю, что до того, как я добавил этот второй moveToElement(), как только произошел щелчок, курсор сделал все, что его просили, и был собран мусор. Вот мой код для этого - надеюсь, это кому-нибудь поможет!

    Actions cursor = new Actions(driver);
    cursor.moveToElement(customNumberLink).perform();
    cursor.click();     

    // move to SAME element to leave cursor where it is while Javascript runs.
    cursor.moveToElement(customNumberLink).perform();

    // now grab newly generated elements
    WebElement clearLink = customNumberCell.findElement(By.cssSelector("a.clear"));
    clearLink.click();
person TenFour    schedule 19.01.2012