← Назад к вопросам

Какие знаешь типы ожиданий 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

Три основных типа:

  1. Implicit Wait - глобальное, не рекомендуется
  2. Explicit Wait - лучший вариант (Best Practice)
  3. Fluent Wait - полный контроль для сложных сценариев

Правило: Используй Explicit Wait с нужным условием вместо слепых пауз.

Это обеспечивает надежность, скорость и простоту поддержки тестов.

Какие знаешь типы ожиданий Selenium? | PrepBro