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

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

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

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

Какие знаешь виды ожиданий в UI? | PrepBro