В предыдущей части мы описывали методы явного ожидания и использовали класс WebDriverWait для примера. Здесь нужно отметить, что WebDriverWait является прямым потомком класса FluentWait<WebDriver>, а значит, расширяет его функционал, хотя, на данный момент( Selenium 4 ) WebDriverWait отличается от своего родителя всего на один Deprecated(устаревший) метод protected timeoutException.
Итак, что же такое ожидание с переменной длительностью(Fluent Wait) ?
Ожидание с переменной длительностью, по сути является расширенным случаем явного ожидания (Explicit Wait). Методы Fluent Wait определяют максимальную величину времени в течение которого Selenium WebDriver будет ожидать выполнения определенного условия(например, окончание работы Ajax-запроса). Они также определяют частоту, с которой, вейтер будет проверять исполнение условия, так называемый период опроса. Если условие не будет выполнено в срок WebDriver выбросит исключение TimeoutException.
FluentWait может быть настроен таким образом, чтобы игнорировать, возникающие в течение периода опроса, исключения. Длительность периода опроса можно оставить по умолчанию, в этом случае вейтер будет опрашивать веб-страницу раз в 0.5 секунды.
Пример инициализации FluentWait
Wait wait = new FluentWait<WebDriver>(driver)
.withTimeout(50, TimeUnit.SECONDS)
.pollingevery(3, TimeUnit.SECONDS)
.ignoring(NoSuchElementException.class);
В следующем примере показано, как можно использовать собственную функцию в качестве параметра метода until, эта функция возвращает веб-элемент с id="foo", как только он загрузится в браузере. Обратите внимание на метод ignoring, который позволяет игнорировать выбрасываемые во время опроса исключения.
Wait wait = new FluentWait(WebDriver reference)
.withTimeout(timeout, SECONDS)
.pollingEvery(timeout, SECONDS)
.ignoring(Exception.class);
WebElement foo=wait.until(new Function<WebDriver, WebElement>() {
public WebElement applyy(WebDriver driver) {
return driver.findElement(By.id("foo"));
}});