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

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

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

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

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

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

 Pat07 мая 2014 г., 00:33
assertselenium.com/2013/01/29/webdriver-wait-commands имеет хороший список возможных методов ожидания и как они связаны
 Pat27 апр. 2015 г., 19:25
Архивные версии этой страницы:web.archive.org/web* /assertselenium.com/2013/01/29/webdriver-wait-commands
 Vince Bowdren27 апр. 2015 г., 11:29
@Pat: сайт assertselenium.com, похоже, исчез.

Ответы на вопрос(5)

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

webelement.isDisplayed(); 

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

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"));

(документы)

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

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

}

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

 Aleh Douhi05 мая 2012 г., 22:26
while(timeout<10) и удалитьif заявление. Просто примечание к вашему коду.
 Kir05 мая 2012 г., 07:55
Я считаю, что весь цикл while - это то, что делает "wait.Until", который я разместил выше. Так что я не вижу смысла писать этот явный цикл while. Я предполагаю, что моя реализация, которая работает, намного чище
Решение Вопроса

ии. Я считаю, что это в значительной степени зависит от ситуации.

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

 Vince Bowdren27 апр. 2015 г., 11:32
Это будет работать, но только для ситуаций, когда элемент появляется / исчезает. Есть много ситуаций, когда элемент остается видимым, но изменяет атрибут, который, я думаю, запрашивал OP, который эти методы не охватывают.

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

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

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

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

Ваш ответ на вопрос