Какие типы ожиданий (waits) существуют в Selenium WebDriver и в чём их различия?

Ответ

В Selenium WebDriver существует три основных типа ожиданий для синхронизации тестов с состоянием веб-страницы.

1. Неявное ожидание (Implicit Wait)

Глобальная настройка для драйвера. Применяется ко всем последующим операциям поиска элементов. Если элемент не найден сразу, драйвер будет опрашивать DOM в течение заданного времени.

// Установка неявного ожидания (Java)
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

Недостаток: Может замедлять выполнение теста, так как ожидание срабатывает для каждого неудачного поиска, даже когда это не требуется.

2. Явное ожидание (Explicit Wait)

Ожидание конкретного условия для определенного элемента. Рекомендуемый подход для большинства сценариев.

// Ожидание появления элемента (Java)
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement element = wait.until(
    ExpectedConditions.visibilityOfElementLocated(By.id("dynamicElement"))
);

Преимущество: Точно нацелено на конкретное условие (видимость, кликабельность и т.д.), что делает тесты более стабильными и быстрыми.

3. Гибкое ожидание (Fluent Wait)

Наиболее гибкий тип. Позволяет настроить таймаут, интервал опроса и исключения для игнорирования.

// Настройка гибкого ожидания (Java)
Wait<WebDriver> wait = new FluentWait<>(driver)
    .withTimeout(Duration.ofSeconds(30))
    .pollingEvery(Duration.ofSeconds(2))
    .ignoring(NoSuchElementException.class);

WebElement foo = wait.until(driver -> driver.findElement(By.id("foo")));

Применение: Полезно для элементов, которые появляются с непостоянной задержкой или требуют кастомных условий проверки.

Рекомендация: Используйте явные ожидания для точного контроля. Неявные и явные ожидания, примененные вместе, могут привести к непредсказуемому увеличению общего времени ожидания.

Ответ 18+ 🔞

Да ты посмотри, какие хитрые штуки придумали, чтобы наш брат-автоматизатор не сходил с ума, пока страница грузится! Три вида ожиданий, блядь, как в аптеке — выбирай, что тебе больше пиздеца подходит.

Первое — неявное ожидание, оно же Implicit Wait.
Поставил один раз — и пошла пиздец-пляска. Драйвер, как дурак терпеливый, будет каждый чих, каждый поиск элемента обсасывать заданное время. Поставил десять секунд — сиди, блядь, десять секунд каждый раз, если элемент не нашёлся сразу, даже если он через полсекунды должен выскочить.

driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

А потом удивляешься, почему тесты ползут, как рак по шерсти, блядь. Всё потому, что он везде эту паузу впендюривает, даже где не надо! Удобно, конечно, но тормозит конкретно, ёпта.

Второе — явное ожидание, Explicit Wait.**
Вот это уже ближе к телу, блядь! Тут ты не просто в пустоту пялишься, а ждёшь конкретного пиздюка — чтобы элемент стал видимым, кликабельным, или там хуй знает каким.

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement element = wait.until(
    ExpectedConditions.visibilityOfElementLocated(By.id("dynamicElement"))
);

Вот это, сука, подход! Точно знаешь, чего ждёшь, и не тратишь время на всю хуйню вокруг. Тесты стабильнее, быстрее — красота, блядь!

Третье — гибкое ожидание, Fluent Wait.
Это уже для извращенцев, которые любят всё настроить под себя, блядь. Хочешь — опрашивай раз в две секунды, хочешь — игнорируй какие-то исключения, как собака блох.

Wait<WebDriver> wait = new FluentWait<>(driver)
    .withTimeout(Duration.ofSeconds(30))
    .pollingEvery(Duration.ofSeconds(2))
    .ignoring(NoSuchElementException.class);

WebElement foo = wait.until(driver -> driver.findElement(By.id("foo")));

Полезно, когда элемент появляется с такими задержками, что хочется уже вилкой в глаз себе ткнуть, блядь. Или когда нужно кастомное условие проверить — тут он, этот Fluent Wait, выручает, как родной.

А теперь, сука, главное правило, чтоб тебе в сраку чих-пых!
Не смешивай неявные и явные ожидания в одном тесте, а то получишь овердохуища общего времени. Представь: неявное стоит на 10 секунд, явное тоже на 10 — и в худшем случае будешь ждать нихуя не 10, а все 20, блядь! Так что бери явные ожидания, настраивай их точечно — и будет тебе счастье, а не ебаный насос.