Расскажи про виды ожидания (waits) в Selenium WebDriver

«Расскажи про виды ожидания (waits) в Selenium WebDriver» — вопрос из категории Selenium и Selenide, который задают на 24% собеседований AQA / Automation. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В Selenium WebDriver есть три основных типа ожиданий, которые я использую для стабилизации автотестов при работе с динамическим контентом.

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

    • Что это: Глобальная настройка для экземпляра WebDriver. При поиске любого элемента, если он не найден сразу, драйвер будет опрашивать DOM в течение заданного времени.
    • Когда использовать: Редко. Я избегаю его, так как он применяется ко всем операциям findElement и может маскировать реальные проблемы, увеличивая общее время выполнения тестов. Не сочетается с явными ожиданиями.
      // Java пример (лучше не использовать или установить в 0)
      driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
  2. Явное ожидание (Explicit Wait)

    • Что это: Ожидание с конкретным условием для определённого элемента. Это основной инструмент, который я применяю.
    • Почему лучше: Позволяет ждать наступления конкретного состояния (видимость, кликабельность, наличие текста), что делает тесты стабильными и быстрыми.
      // Java: Ожидание видимости элемента в течение 10 секунд
      WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
      WebElement header = wait.until(
      ExpectedConditions.visibilityOfElementLocated(By.id("main-header"))
      );
      header.click();
      
      # Python: Ожидание кликабельности кнопки
      from selenium.webdriver.support.ui import WebDriverWait
      from selenium.webdriver.support import expected_conditions as EC

    wait = WebDriverWait(driver, 10) button = wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".submit-btn"))) button.click()

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

    • Что это: Расширенная версия явного ожидания с настройкой частоты опроса (polling) и игнорированием специфичных исключений.
    • Когда использовать: Для элементов, которые появляются через нерегулярные промежутки времени или когда нужно тонко контролировать процесс ожидания.
      
      // Java: Ожидание с опросом каждые 2 секунды и игнорированием NoSuchElementException
      Wait<WebDriver> fluentWait = new FluentWait<>(driver)
      .withTimeout(Duration.ofSeconds(30))
      .pollingEvery(Duration.ofSeconds(2))
      .ignoring(NoSuchElementException.class);

    WebElement dynamicElement = fluentWait.until( driver -> driver.findElement(By.id("dynamic-content")) );

Моя практика: Я почти всегда использую явные ожидания (Explicit Waits) для ключевых взаимодействий. Это делает код понятнее, а тесты — быстрее и надёжнее, чем использование Thread.sleep() или неявных ожиданий.