← Назад к вопросам
Какие знаешь типы ожиданий Selenium?
2.2 Middle🔥 211 комментариев
#Selenium и UI автоматизация
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Типы ожиданий в Selenium
Обзор
Selenium предоставляет три основных типа ожиданий для синхронизации автоматизированных тестов с веб-приложением.
1. Implicit Wait (Неявное ожидание)
Глобальное ожидание для всех операций поиска элементов.
from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.implicitly_wait(10) # Ждёт до 10 сек для каждого find_element()
element = driver.find_element(By.ID, "button") # Ждёт до 10 сек
Java:
WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));
WebElement element = driver.findElement(By.id("button"));
Как работает:
- Применяется ко всем find_element и find_elements
- Проверяет каждые 500ms по умолчанию
- Если элемент не найден - ждёт до истечения timeout
- Не применяется к операциям с элементом (click, sendKeys)
Плюсы:
- Просто использовать
- Глобальное решение
Минусы:
- Замедляет тесты (каждый поиск ждёт полное время)
- Может быть непредсказуем с Explicit Wait
- Нет гибкости
- Не работает для условий
2. Explicit Wait (Явное ожидание) - Best Practice
Ожидание конкретного условия перед продолжением.
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10) # 10 сек максимум
element = wait.until(
EC.element_to_be_clickable((By.ID, "submit"))
)
element.click()
Java:
WebDriver driver = new ChromeDriver();
WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement element = wait.until(
ExpectedConditions.elementToBeClickable(By.id("submit"))
);
element.click();
Основные Expected Conditions:
# Основной набор
EC.presence_of_element_located((By.ID, "id")) # Есть в DOM
EC.visibility_of_element_located((By.ID, "id")) # Видим
EC.element_to_be_clickable((By.ID, "id")) # Кликабелен
# Text conditions
EC.text_to_be_present_in_element((By.ID, "id"), "text") # Текст есть
EC.text_to_be_present_in_element_value((By.ID, "id"), "value") # В значении
# Invisibility
EC.invisibility_of_element_located((By.CLASS_NAME, "spinner")) # Исчез
# Selection
EC.element_to_be_selected((By.ID, "checkbox")) # Выбран
EC.element_located_to_be_selected((By.ID, "id")) # Выбран (локатор)
# Multiple elements
EC.presence_of_all_elements_located((By.CLASS_NAME, "item")) # Все есть
EC.visibility_of_all_elements_located((By.CLASS_NAME, "item")) # Все видны
# Title and URL
EC.title_contains("Home") # Заголовок
EC.url_contains("/login") # URL
# Frame/Window
EC.frame_to_be_available_and_switch_to_it((By.ID, "frame")) # iframe
EC.number_of_windows_to_be(2) # Количество окон
# Custom
EC.presence_of_element_located((By.ID, "id")) # Любое
Плюсы:
- Гибкое и мощное
- Работает только нужное время
- Можно ловить исключения
- Много встроенных условий
- Best Practice
Минусы:
- Немного больше кода
- Нужно знать какое условие использовать
Обработка исключений
from selenium.common.exceptions import TimeoutException
try:
element = wait.until(
EC.visibility_of_element_located((By.ID, "button"))
)
except TimeoutException:
print("Элемент не появился в течение 10 сек")
# Дополнительные действия
3. Fluent Wait (Плавное ожидание)
Явное ожидание с полной контролем параметров.
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import NoSuchElementException
wait = WebDriverWait(
driver,
timeout=10, # Максимум 10 сек
poll_frequency=0.5 # Проверяем каждые 0.5 сек
)
wait.ignore_exceptions((NoSuchElementException,)) # Какие исключения игнорировать
element = wait.until(
EC.visibility_of_element_located((By.ID, "button"))
)
Java:
Wait<WebDriver> wait = new FluentWait<>(driver)
.withTimeout(Duration.ofSeconds(10))
.pollingEvery(Duration.ofMillis(500))
.ignoring(NoSuchElementException.class);
WebElement element = wait.until(driver ->
driver.findElement(By.id("button"))
);
Custom Wait Conditions
Создание собственных условий.
class ElementTextChanged:
def __init__(self, locator, original_text):
self.locator = locator
self.original_text = original_text
def __call__(self, driver):
element = driver.find_element(*self.locator)
new_text = element.text
return new_text != self.original_text
wait = WebDriverWait(driver, 10)
wait.until(
ElementTextChanged((By.ID, "counter"), "0")
)
Hard Wait (Не используй!)
import time
time.sleep(5) # Просто ждём 5 секунд
Очень плохая идея:
- Медленно
- Ненадежно
- Элемент может загрузиться раньше
- Может потребоваться ждать дольше
Сравнение всех типов
| Тип | Использование | Скорость | Гибкость | Рекомендация |
|---|---|---|---|---|
| Implicit | Глобально все find | Медленная | Низкая | Не рекомендуется |
| Explicit | Конкретное условие | Быстрая | Высокая | Best Practice |
| Fluent | Полный контроль | Быстрая | Максимальная | Для сложных |
| Hard | Просто пауза | Медленная | Нет | Избегать |
Best Practices
✅ Правильно:
# Явное ожидание конкретного условия
wait = WebDriverWait(driver, 10)
button = wait.until(EC.element_to_be_clickable((By.ID, "submit")))
button.click()
# С обработкой ошибок
try:
message = wait.until(
EC.visibility_of_element_located((By.CLASS_NAME, "success"))
)
assert "Success" in message.text
except TimeoutException:
print("Сообщение об успехе не появилось")
❌ Неправильно:
# Жёсткая пауза
time.sleep(5)
driver.find_element(By.ID, "button").click()
# Implicit wait для всего
driver.implicitly_wait(30)
element = driver.find_element(By.ID, "button")
# Слишком долгое ожидание
wait = WebDriverWait(driver, 60)
Рекомендуемые таймауты
# Быстрые элементы
quick_wait = WebDriverWait(driver, 5)
# Стандартные элементы
standard_wait = WebDriverWait(driver, 10)
# Медленные операции
slow_wait = WebDriverWait(driver, 20)
# Очень медленные (загрузка файлов)
very_slow_wait = WebDriverWait(driver, 30)
Практический пример
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.common.exceptions import TimeoutException
driver = webdriver.Chrome()
wait = WebDriverWait(driver, 10)
try:
# Ждём загрузки страницы
driver.get("https://example.com/login")
# Ждём пока форма будет видима
form = wait.until(
EC.visibility_of_element_located((By.ID, "login-form"))
)
# Вводим данные
email_input = wait.until(
EC.element_to_be_clickable((By.NAME, "email"))
)
email_input.send_keys("test@test.com")
password_input = driver.find_element(By.NAME, "password")
password_input.send_keys("password123")
# Кликаем кнопку отправки
submit_button = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "button[type=submit]"))
)
submit_button.click()
# Ждём сообщение об успехе
success_message = wait.until(
EC.visibility_of_element_located((By.CLASS_NAME, "success"))
)
assert "Login successful" in success_message.text
except TimeoutException:
print("Операция заняла слишком много времени")
except Exception as e:
print(f"Ошибка: {e}")
finally:
driver.quit()
Резюме типов ожиданий Selenium
Три основных типа:
- Implicit Wait - глобальное, не рекомендуется
- Explicit Wait - лучший вариант (Best Practice)
- Fluent Wait - полный контроль для сложных сценариев
Правило: Используй Explicit Wait с нужным условием вместо слепых пауз.
Это обеспечивает надежность, скорость и простоту поддержки тестов.