Что такое 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?