Какие бывают ожидания?
Комментарии (1)
Ответ сгенерирован нейросетью и может содержать ошибки
Типы ожиданий (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()
Рекомендации
- Избегайте Hard Wait — это признак неправильного подхода
- Минимизируйте Implicit Wait — может замедлить тесты
- Используйте Explicit Wait — это standard в индустрии
- Настраивайте timeout в зависимости от сценария
- Ловите 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 с конкретным условием вместо слепых пауз.