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

Какие бывают ожидания?

2.0 Middle🔥 281 комментариев
#Selenium и UI автоматизация#Фреймворки тестирования

Комментарии (1)

🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)

Ответ сгенерирован нейросетью и может содержать ошибки

Типы ожиданий (Waits) в автотестировании

Определение

Ожидание (wait) — это механизм, который позволяет тесту подождать, пока определённое условие не будет выполнено, прежде чем продолжить выполнение. Это критично для работы с асинхронными UI элементами.

Три основных типа ожиданий

1. Hard Wait (Жёсткое ожидание)

Это просто пауза на фиксированное время.

import time

# Просто ждём 5 секунд
time.sleep(5)

# В Java
Thread.sleep(5000);  // миллисекунды

Характеристики:

  • ✅ Просто понять
  • ❌ Медленно (ждём всегда полное время)
  • ❌ Ненадежно (элемент может загрузиться раньше)
  • ❌ Можно долго ждать для медленных систем

Когда использовать:

  • Редко! Это признак плохого кода
  • Только если нет другого способа

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

Глобальное ожидание для всех операций поиска элементов.

from selenium import webdriver
from selenium.webdriver.common.by import By

driver = webdriver.Chrome()
driver.implicitly_wait(10)  # Ждёт до 10 сек для каждого элемента

# Этот поиск будет ждать до 10 сек, если элемента нет
element = driver.find_element(By.ID, "button")

Java пример:

WebDriver driver = new ChromeDriver();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(10));

WebElement element = driver.findElement(By.id("button"));  // Ждёт до 10 сек

Характеристики:

  • ✅ Просто использовать
  • ✅ Работает для всех find_element()
  • ❌ Одинаков для всех элементов
  • ❌ Может замедлить тесты (каждый поиск ждёт полное время)
  • ❌ Может быть непредсказуем при комбинации с явными ожиданиями

3. 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

# Ждёт максимум 10 секунд, пока кнопка не будет видима
wait = WebDriverWait(driver, 10)
element = wait.until(
    EC.visibility_of_element_located((By.ID, "button"))
)
element.click()

Java пример:

WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(10));
WebElement element = wait.until(
    ExpectedConditions.visibilityOfElementLocated(By.id("button"))
);
element.click();

Доступные условия:

# Элемент присутствует в DOM (может быть невидимым)
EC.presence_of_element_located((By.ID, "button"))

# Элемент видим (видим и включен)
EC.visibility_of_element_located((By.ID, "button"))

# Элемент кликабелен
EC.element_to_be_clickable((By.ID, "button"))

# Текст появился в элементе
EC.text_to_be_present_in_element((By.ID, "message"), "Success")

# Элемент выбран (checkbox, radio)
EC.element_to_be_selected((By.ID, "checkbox"))

# Заголовок страницы содержит текст
EC.title_contains("Home")

# Условие False (элемент исчезнет)
EC.invisibility_of_element_located((By.ID, "spinner"))

# Количество элементов
EC.presence_of_all_elements_located((By.CLASS_NAME, "item"))

Практический пример:

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()
driver.get("https://example.com")

wait = WebDriverWait(driver, 10)

# Ждём, пока кнопка не будет видима
button = wait.until(
    EC.element_to_be_clickable((By.XPATH, "//button[@id=\"submit\"]"))
)
button.click()

# Ждём сообщение об успехе
message = wait.until(
    EC.presence_of_element_located((By.CLASS_NAME, "success-message"))
)
assert "Success" in message.text

4. Fluent Wait (Плавное ожидание)

Явное ожидание с настраиваемой частотой проверок.

from selenium.webdriver.support.ui import WebDriverWait

wait = WebDriverWait(
    driver,
    timeout=10,  # Максимум 10 сек
    poll_frequency=0.5  # Проверяем каждые 0.5 сек
)

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"))
);

Сравнение ожиданий

ТипВремяГибкостьПроизводительностьРекомендация
Hard WaitФиксированноеНетПлохоИзбегать
Implicit WaitГлобальноеНизкаяСреднееОсторожно
Explicit WaitНастраиваемоеВысокаяХорошоBest Practice
Fluent WaitНастраиваемоеОчень высокаяОтличноеPremium

Практические примеры для QA

❌ Плохой код (Hard wait):

driver.get(url)
time.sleep(5)  # Всегда ждём 5 сек
button = driver.find_element(By.ID, "button")
button.click()

⚠️ Приемлемо (Implicit wait):

driver = webdriver.Chrome()
driver.implicitly_wait(10)
driver.get(url)
button = driver.find_element(By.ID, "button")  # Ждёт до 10 сек
button.click()

✅ Хорошо (Explicit wait):

driver = webdriver.Chrome()
driver.get(url)
wait = WebDriverWait(driver, 10)
button = wait.until(
    EC.element_to_be_clickable((By.ID, "button"))
)
button.click()

Рекомендации

  1. Избегайте Hard Wait — это признак неправильного подхода
  2. Минимизируйте Implicit Wait — может замедлить тесты
  3. Используйте Explicit Wait — это standard в индустрии
  4. Настраивайте timeout в зависимости от сценария
  5. Ловите TimeoutException — для корректной обработки ошибок
from selenium.common.exceptions import TimeoutException

try:
    element = wait.until(EC.visibility_of_element_located((By.ID, "button")))
except TimeoutException:
    print("Элемент не появился в течение 10 секунд")

Резюме

Ожидания в тестировании:

  • Hard Wait — просто пауза (избегайте)
  • Implicit Wait — глобальное ожидание (осторожно)
  • Explicit Wait — ожидание условия (best practice)
  • Fluent Wait — настраиваемое ожидание (premium)

Всегда выбирайте explicit wait с конкретным условием вместо слепых пауз.