← Назад к вопросам
Какие знаешь виды ожиданий в UI?
2.2 Middle🔥 211 комментариев
#Selenium и UI автоматизация#Фреймворки тестирования
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Виды ожиданий в UI автотестировании
Обзор
Ожидания (waits) в UI тестировании - критический компонент для стабильности тестов. Есть несколько типов ожиданий для разных сценариев.
1. Implicit Wait (Неявное ожидание)
Глобальное ожидание для всех операций поиска элементов.
from selenium import webdriver
driver = webdriver.Chrome()
driver.implicitly_wait(10) # Ждёт до 10 сек
element = driver.find_element(By.ID, "button")
Характеристики:
- Применяется ко всем find_element() операциям
- Проверяет каждые 500ms по умолчанию
- Может замедлить тесты
- Не очень гибкий
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
wait = WebDriverWait(driver, 10)
element = wait.until(
EC.element_to_be_clickable((By.ID, "submit-button"))
)
element.click()
Основные условия:
# Элемент присутствует в DOM
EC.presence_of_element_located((By.ID, "button"))
# Элемент видим (видимый размер > 0)
EC.visibility_of_element_located((By.ID, "button"))
# Элемент невидим или отсутствует
EC.invisibility_of_element_located((By.ID, "spinner"))
# Элемент кликабелен
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.visibility_of_all_elements_located((By.CLASS_NAME, "item"))
# Заголовок содержит текст
EC.title_contains("Home")
# URL содержит строку
EC.url_contains("/login")
# Количество элементов
EC.presence_of_all_elements_located((By.TAG_NAME, "button"))
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
wait = WebDriverWait(driver, 10, poll_frequency=0.5)
wait.until(EC.visibility_of_element_located((By.ID, "button")))
Параметры:
- timeout: максимальное время ожидания
- poll_frequency: как часто проверять условие
- ignored_exceptions: какие исключения игнорировать
4. Hard Wait (Жёсткое ожидание)
Просто пауза на фиксированное время.
import time
time.sleep(5) # Ждём 5 секунд
Минусы:
- Всегда ждём полное время
- Очень медленно
- Ненадежно
- Признак плохого кода
Использовать только в критичных случаях!
5. Custom Wait Condition
Создание собственных условий ожидания.
class ElementTextChanged:
def __init__(self, locator, old_text):
self.locator = locator
self.old_text = old_text
def __call__(self, driver):
element = driver.find_element(*self.locator)
return element.text != self.old_text
wait = WebDriverWait(driver, 10)
wait.until(ElementTextChanged((By.ID, "counter"), "0"))
Для разных UI сценариев
Ожидание загрузки страницы
# Ждём пока документ будет готов
wait.until(
lambda driver: driver.execute_script(
"return document.readyState"
) == "complete"
)
# Ждём jQuery загруженный
wait.until(
lambda driver: driver.execute_script(
"return jQuery.active == 0"
)
)
# Ждём Angular загруженный
wait.until(
lambda driver: driver.execute_script(
"return window.getAllAngularTestabilities().findIndex(x=> !x.isStable()) === -1"
)
)
Ожидание исчезновения загрузчика
# Спиннер исчезает
wait.until(
EC.invisibility_of_element_located((By.CLASS_NAME, "spinner"))
)
# Или с timeout
wait.until(
EC.invisibility_of_element_located((By.CSS_SELECTOR, ".loading")),
timeout=30
)
Ожидание отправки формы
# Кнопка отправки включена и кликабельна
submit_btn = wait.until(
EC.element_to_be_clickable((By.CSS_SELECTOR, "button[type=submit]"))
)
submit_btn.click()
# Сообщение об успехе
wait.until(
EC.visibility_of_element_located((By.CLASS_NAME, "success-message"))
)
Ожидание открытия модального окна
# Модальное окно видимо
wait.until(
EC.visibility_of_element_located((By.CLASS_NAME, "modal"))
)
# Backdrop видимо
wait.until(
EC.presence_of_element_located((By.CLASS_NAME, "modal-backdrop"))
)
Ожидание динамических элементов
# Ждём пока список не заполнится
wait.until(
lambda driver: len(
driver.find_elements(By.CSS_SELECTOR, "[data-testid=item]")
) > 0
)
# Ждём определённое количество элементов
wait.until(
lambda driver: len(
driver.find_elements(By.CSS_SELECTOR, ".item")
) == 5
)
Сравнение всех типов
| Тип | Время | Гибкость | Производительность | Используй когда |
|---|---|---|---|---|
| Hard Wait | Фиксированное | Нет | Плохо | Очень редко |
| Implicit | Глобальное | Низкая | Среднее | Не рекомендуется |
| Explicit | Настраиваемое | Высокая | Хорошо | Обычно |
| Fluent | Настраиваемое | Очень высокая | Отличное | Сложные сценарии |
| Custom | Любое | Максимальная | Зависит | Специальные случаи |
Best Practices для UI тестов
✅ Хорошо:
# Явное ожидание нужного условия
wait = WebDriverWait(driver, 10)
element = wait.until(EC.element_to_be_clickable((By.ID, "button")))
element.click()
# С обработкой ошибок
try:
element = wait.until(EC.visibility_of_element_located((By.ID, "success")))
except TimeoutException:
print("Элемент не появился")
❌ Плохо:
# Жёсткая пауза
time.sleep(5)
driver.find_element(By.ID, "button").click()
# Слишком долгое ожидание
driver.implicitly_wait(30)
Оптимальные таймауты
# Для быстрых элементов (обычно видны сразу)
quick_wait = WebDriverWait(driver, 5)
# Для стандартных операций
standard_wait = WebDriverWait(driver, 10)
# Для медленных операций (API запросы и т.п.)
slow_wait = WebDriverWait(driver, 20)
# Для очень медленных (загрузка файлов)
very_slow_wait = WebDriverWait(driver, 30)
Резюме
Виды ожиданий в UI:
- Hard Wait - избегайте
- Implicit Wait - не рекомендуется
- Explicit Wait - стандарт (Best Practice)
- Fluent Wait - когда нужна гибкость
- Custom Wait - для специальных случаев
Всегда используйте explicit wait с конкретным условием вместо слепых пауз. Это обеспечивает надежность и скорость тестов.