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

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

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

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

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

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

Ответ 1

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

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

Ответ 2

Я предлагаю использовать 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"));

(документы)

Ответ 3

Вы можете использовать неявное ожидание WebDriver:

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

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

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

Ответ 4

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

webelement.isDisplayed(); 

вместо получения атрибута style.

Ответ 5

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

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

}

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