Вопрос по webdriver – Лучше всего ждать перемен с Selenium Webdriver?

12

После события щелчка мне нужно подождать, пока атрибут элементов изменится, прежде чем продолжить (событие щелчка приводит к тому, что определенные элементы смещаются из фокуса, а другие получают фокус через JS)

Потратив время на поиск надежной альтернативы & quot; waitForAttribute & quot; (команда селена 1) в веб-драйвере ... Я мог бы заставить работать следующий код. Но я не уверен, что это лучшая реализация ....

Любое другое лучшее решение ??

wait = new WebDriverWait(wedriver1, TimeSpan.FromSeconds(5));
.....
button.Click();
wait.Until(webdriver1 => webdriver2.webelement.GetAttribute("style").Contains("display: block"));

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

assertselenium.com/2013/01/29/webdriver-wait-commands имеет хороший список возможных методов ожидания и как они связаны Pat
@Pat: сайт assertselenium.com, похоже, исчез. Vince Bowdren
Архивные версии этой страницы:web.archive.org/web*/assertselenium.com/2013/01/29/webdriver-wait-commands Pat

Ваш Ответ

5   ответов
0

Вот..Вы можете использовать их реализации для решения вашей проблемы.

    public void waitFor(Webdriver driver,,WebElement welElem, String attributeValue){
    int timeout=0;
    while(true){
        if(driver.webElem.getAttribute(attribute)!=null){
        break;
        }
        if(timeout>=10){
        break;
        }
        Thread.sleep(100);
        timeout++;
    }

}

Я думаю, что вы могли бы реализовать что-то вроде этого. Я не проверял это, но вы поняли.

Я полагаю, что весь цикл while - это то, что "wait.Until" Я написал выше, делает. Так что я не вижу смысла в написании этого явного цикла while. Я предполагаю, что моя реализация, которая работает, намного чище Kir
while(timeout<10) и удалитьif заявление. Просто примечание к вашему коду.
5

Я не уверен в "лучшем" реализация существует. Я полагаю, что это в значительной степени зависит от ситуации.

Что касается изменений, управляемых AJAX, я бы обычно использовал waitForElementPresent или waitForElementNotPresent в зависимости от изменений, которые вызов AJAX произведет на странице.

Это будет работать, но только для ситуаций, когда элемент появляется / исчезает. Во многих ситуациях элемент остается видимым, но изменяет атрибут, который, как я думаю, запрашивал OP, который эти методы не охватывают.
5

driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);

Неявное ожидание - указать WebDriver опросить DOM в течение определенного периода времени при попытке найти элемент или элементы, если они не доступны сразу.

Больше здесь:http://seleniumhq.org/docs/04_webdriver_advanced.html#implicit-waits

Извините, я не думаю, что вы поняли мой вопрос. Атрибут моих элементов изменяется при событии щелчка (управляется JS). Я не вижу, как неявное ожидание полезно здесь. Насколько я понимаю, неявное ожидание более актуально в случае, когда элементы видны после события. Kir
2

что использование WebDriverWait довольно полезно. Одно из изменений, которое вы можете сделать в своем коде - это использование -

webelement.isDisplayed(); 

вместо того, чтобы получить атрибут стиля.

6

org.openqa.selenium.support.ui.ExpectedConditions.attributeToBe(WebElement element, String attribute, String value).

например

WebDriverWait wait = new WebDriverWait(driver, 5); // time out after 5 seconds
someElement.click();
wait.until(ExpectedConditions.attributeToBe(someElement, "sort-attribute", "ascending"));

(документы)

Похожие вопросы