Лучше всего ждать перемен с 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++;
}
}
Я думаю, вы могли бы реализовать что-то вроде этого. Я не проверял его, но вы поняли, что вы думаете.