Для реализации такой функции в наших тестах нам потребуется класс WebDriverWait и класс Predicate.
Пишем следующую функцию:
public void waitUntilElementPresent(final String xpath){
new WebDriverWait(this.driver, 10).until(new Predicate<WebDriver>() {
public boolean apply(WebDriver arg0) {
return !arg0.findElement(By.xpath(xpath)).isDisplayed();
}
});
}
new WebDriverWait(this.driver, 10).until(new Predicate<WebDriver>() {
public boolean apply(WebDriver arg0) {
return !arg0.findElement(By.xpath(xpath)).isDisplayed();
}
});
}
При вызове этой функции браузер будет ждать до тех пор пока элемент с xpath, который мы передали, существует.
PS: Небольшая поправка, в данном случае браузер будет ждать 10 секунд.
PS: Небольшая поправка, в данном случае браузер будет ждать 10 секунд.
Лучше не привязываться к xpath а использовать тип By для большей гибкости.
ОтветитьУдалитьЛучше конечно ) Код взят из проекта в котором все атрибуты элементов генерируются динамически. Поэтому и xpath.
Удалитьhttp://selenium.googlecode.com/svn/trunk/docs/api/java/org/openqa/selenium/support/ui/ExpectedConditions.html#invisibilityOfElementLocated(org.openqa.selenium.By)
ОтветитьУдалитьЕсли честно то не знал. Огромное спасибо)
УдалитьКстати, предложенная реализация слишком проста -- надо ещё перехватывать исключения NoSuchElementException и StaleElementReferenceException, их появление также свидетельствует о том, что элемента нет (ExpectedConditions.invisibilityOfElementLocated делает такие проверки).
ОтветитьУдалитьЛибо надо использовать не WebDriverWait, а FluentWait и самостоятельно настраивать игнорируемые исключения, в этом случае можно будет использовать предикаты более простого вида.
На проекте попробовал через ExpectedConditions и браузер стал зависать по непонятной причине и не видеть явно видных элементов, как только вернул свой вариант проблема разрешилась. В чем было дело если честно не знаю )
ОтветитьУдалить