Что такое Selenium Waits? Какие есть и чем отличаются?


🔹 Что такое Waits?

Это механизмы ожидания, которые Selenium использует, чтобы дождаться доступности элемента или события перед выполнением следующего шага. Без них тест может упасть с ошибкой NoSuchElementException или ElementNotInteractableException.


🔹 Виды ожиданий в Selenium (Python)

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

  • Устанавливается один раз для всего драйвера.

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

  • Если элемент найден раньше — идём дальше.

  • Работает для всех элементов.

📌 Пример:

from selenium import webdriver

driver = webdriver.Chrome()
driver.implicitly_wait(10)  # ждать до 10 секунд

driver.get("https://example.com")
element = driver.find_element("id", "username")  # будет ждать появления до 10 сек.

✅ Плюсы: просто, минимум кода. ❌ Минусы: применяется ко всем элементам, не всегда гибко.


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

  • Более гибкий подход.

  • Ждём конкретное условие для конкретного элемента.

  • Используем WebDriverWait + expected_conditions.

📌 Пример:

from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver.get("https://example.com")

# Ждать максимум 15 сек, пока кнопка не станет кликабельной
button = WebDriverWait(driver, 15).until(
    EC.element_to_be_clickable((By.ID, "submit"))
)
button.click()

✅ Плюсы: гибкость, можно ждать конкретные состояния (видимость, кликабельность, исчезновение). ❌ Минусы: больше кода, чем implicit wait.


3. Fluent Wait (Расширенное явное ожидание)

  • Это разновидность Explicit Wait.

  • Позволяет задать:

    • максимальное время ожидания,

    • частоту опроса (polling),

    • список игнорируемых исключений.

📌 Пример:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import NoSuchElementException

wait = WebDriverWait(driver, 20, poll_frequency=2, ignored_exceptions=[NoSuchElementException])

element = wait.until(
    EC.presence_of_element_located((By.ID, "dynamic_element"))
)
print(element.text)

✅ Плюсы: настраиваемый, можно игнорировать ошибки. ❌ Минусы: сложнее в использовании.


🔹 Разница между ними

Вид ожидания
Применение
Время ожидания
Где задаётся

Implicit

Для всех элементов

Один раз на драйвер

driver.implicitly_wait()

Explicit

Для конкретного элемента

При вызове

WebDriverWait + until()

Fluent

То же, что explicit, но с гибкой настройкой (polling, исключения)

При вызове

WebDriverWait(..., poll_frequency, ignored_exceptions)


👉 Обычно в проектах не смешивают implicit и explicit waits (это может вызывать непредсказуемые задержки). На практике:

  • Explicit и Fluent → для динамических элементов.

  • Implicit → если проект простой и динамики мало.

Last updated

Was this helpful?