Что такое Fluent Wait в контексте Selenium?

«Что такое Fluent Wait в контексте Selenium?» — вопрос из категории Selenium и Selenide, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Fluent Wait — это гибкая и настраиваемая реализация явного ожидания (Explicit Wait) в Selenium WebDriver. Он позволяет задать условие, которое драйвер будет проверять с заданной частотой в течение максимального времени, игнорируя указанные исключения.

Ключевые отличия от простого WebDriverWait:

  • Настраиваемая частота опроса (polling interval): Можно указать, как часто проверять условие (например, каждые 500 мс).
  • Игнорирование исключений: Можно указать, какие исключения (например, NoSuchElementException) игнорировать во время ожидания, пока не истечёт таймаут.
  • Кастомизация сообщения об ошибке: Возможность добавить понятное сообщение, если условие не выполнилось.

Пример использования Fluent Wait на Java:

import org.openqa.selenium.support.ui.FluentWait;
import java.time.Duration;

// Создание и настройка FluentWait
Wait<WebDriver> wait = new FluentWait<>(driver)
    .withTimeout(Duration.ofSeconds(30))     // Максимальное время ожидания
    .pollingEvery(Duration.ofMillis(500))   // Проверять условие каждые 500 мс
    .ignoring(NoSuchElementException.class) // Игнорировать это исключение в процессе ожидания
    .ignoring(StaleElementReferenceException.class)
    .withMessage("Элемент с id='dynamic-widget' не появился за 30 секунд"); // Сообщение при таймауте

// Применение ожидания. Условие (ExpectedCondition) будет переоцениваться каждые 500 мс.
WebElement dynamicElement = wait.until(
    d -> d.findElement(By.id("dynamic-widget"))
);
// После появления элемента можно с ним взаимодействовать
dynamicElement.click();

Когда использовать: Для ожидания сложных, кастомных условий появления или изменения элементов в динамическом веб-интерфейсе, где стандартные ожидания недостаточно гибки.