🔖 Справочник: ожидания и EC в Selenium

← К оглавлению урока

⚡ Быстрая шпаргалка

# Импорт
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# Создать объект ожидания
wait = WebDriverWait(driver, 10)  # до 10 секунд

# Основные EC
wait.until(EC.presence_of_element_located((By.ID, "id")))
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, ".cls")))
wait.until(EC.element_to_be_clickable((By.XPATH, "//button")))
wait.until(EC.text_to_be_present_in_element((By.TAG_NAME, "h1"), "Text"))
wait.until(EC.url_contains("dashboard"))

# Взаимодействие
element.clear()
element.send_keys("текст")
element.click()

Три метода ожидания

Метод Синтаксис Рекомендация
Неявное driver.implicitly_wait(10) Простое, но негибкое
Явное WebDriverWait(driver, 10).until(EC.xxx(...)) Рекомендуется
Жёсткое time.sleep(5) Антипаттерн — не использовать

Expected Conditions: полная таблица

EC-условие Что ждёт Пример
presence_of_element_located Элемент появился в DOM (м.б. скрыт) EC.presence_of_element_located((By.ID, "id"))
visibility_of_element_located Элемент в DOM и видим EC.visibility_of_element_located((By.CLASS_NAME, "cls"))
element_to_be_clickable Элемент виден и кликабелен EC.element_to_be_clickable((By.XPATH, "//button"))
text_to_be_present_in_element Текст появился внутри элемента EC.text_to_be_present_in_element((By.TAG_NAME, "h6"), "Dashboard")
url_contains URL содержит подстроку EC.url_contains("dashboard")
title_contains Заголовок страницы содержит текст EC.title_contains("Dashboard")
frame_to_be_available_and_switch_to_it iframe доступен + переключение EC.frame_to_be_available_and_switch_to_it((By.TAG_NAME, "iframe"))
alert_is_present Появился JavaScript alert EC.alert_is_present()
staleness_of Элемент удалён из DOM EC.staleness_of(old_element)
element_located_to_be_selected Чекбокс / radio-button выбран EC.element_located_to_be_selected((By.NAME, "cb"))

Взаимодействие с элементами

# test_interactions_ref.py
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

driver = webdriver.Chrome()
driver.get("https://example.com")
wait = WebDriverWait(driver, 10)

# Ввод текста в поле
field = wait.until(EC.element_to_be_clickable((By.NAME, "username")))
field.clear()              # Очистить поле
field.send_keys("Admin")   # Ввести текст

# Клик по кнопке
button = wait.until(EC.element_to_be_clickable((By.XPATH, "//button[@type='submit']")))
button.click()

driver.quit()
Метод Что делает
element.send_keys("текст") Вводит текст в поле
element.clear() Очищает поле ввода
element.click() Кликает по элементу
element.is_displayed() Проверяет видимость
element.text Возвращает видимый текст

Шаблон pytest с явным ожиданием

# test_template.py
import pytest
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

@pytest.fixture
def driver():
    driver = webdriver.Chrome()
    yield driver
    driver.quit()

def test_example(driver):
    driver.get("https://example.com")
    wait = WebDriverWait(driver, 10)

    element = wait.until(EC.visibility_of_element_located((By.ID, "some_id")))
    assert element.is_displayed(), "Элемент не отображается"