← Назад к вопросам
Какие знаешь принципы программирования?
1.0 Junior🔥 141 комментариев
#Архитектура приложений
Комментарии (1)
🐱
claude-haiku-4.5PrepBro AI26 мар. 2026 г.(ред.)
Ответ сгенерирован нейросетью и может содержать ошибки
Виды ожиданий в UI тестировании
1. 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")
Преимущества:
- Просто в использовании
- Глобально для всех элементов
Недостатки:
- Медленно (всегда ждет timeout)
- Нет гибкости
- Может привести к False Positive
2. Explicit Wait (Явное ожидание)
Проверка условия перед взаимодействием с элементом
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)
# Ждем, пока элемент станет видимым
element = wait.until(
EC.presence_of_element_located((By.ID, "button"))
)
element.click()
Условия:
# Элемент присутствует в DOM
EC.presence_of_element_located((By.ID, "id"))
# Элемент видимый
EC.visibility_of_element_located((By.ID, "id"))
# Элемент кликабельный
EC.element_to_be_clickable((By.ID, "id"))
# Текст в элементе
EC.text_to_be_present_in_element((By.TAG_NAME, "h1"), "Welcome")
# URL изменился
EC.url_changes(url)
# Элемент исчез
EC.invisibility_of_element_located((By.ID, "loading"))
3. Fluent Wait
Максимальная гибкость в проверке условий
from selenium.webdriver.support.ui import FluentWait
from selenium.common.exceptions import TimeoutException
import time
wait = FluentWait(driver, timeout=10, poll_frequency=0.5)
element = wait.until(
lambda d: d.find_element(By.ID, "dynamic_element")
if d.find_element(By.ID, "dynamic_element").is_displayed()
else None
)
4. Thread.sleep() (Фиксированное ожидание)
Не рекомендуется!
import time
time.sleep(5) # Ждем 5 секунд всегда
element = driver.find_element(By.ID, "button")
Проблемы:
- Медленно
- Непредсказуемо
- Может привести к flaky тестам
5. Custom Wait
Свой обработчик ожидания
from selenium.webdriver.support.ui import WebDriverWait
from selenium.common.exceptions import TimeoutException
def wait_for_element_and_get_text(driver, locator, timeout=10):
wait = WebDriverWait(driver, timeout)
element = wait.until(
lambda d: d.find_element(*locator)
)
return element.text
text = wait_for_element_and_get_text(driver, (By.ID, "message"))
Практические примеры
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
class LoginTest:
def setup(self):
self.driver = webdriver.Chrome()
self.wait = WebDriverWait(self.driver, 10)
def test_successful_login(self):
self.driver.get("https://example.com/login")
# Ждем, пока форма загрузится
username = self.wait.until(
EC.presence_of_element_located((By.ID, "username"))
)
password = self.driver.find_element(By.ID, "password")
username.send_keys("user@test.com")
password.send_keys("password")
login_btn = self.wait.until(
EC.element_to_be_clickable((By.ID, "login_btn"))
)
login_btn.click()
# Ждем редиректа на dashboard
self.wait.until(
EC.url_contains("/dashboard")
)
# Проверяем, что приветственное сообщение видимо
welcome = self.wait.until(
EC.visibility_of_element_located(
(By.CLASS_NAME, "welcome-message")
)
)
assert "Welcome" in welcome.text
Best Practices
- Используй Explicit Wait — самый надежный способ
- Избегай sleep() — только в крайнем случае
- Подходящее время ожидания — 5-30 секунд зависит от контекста
- Специфичные условия — не жди просто наличия элемента
- Пользовательское ожидание — если встроенное не подходит
Для Playwright
from playwright.sync_api import sync_playwright
with sync_playwright() as p:
browser = p.chromium.launch()
page = browser.new_page()
page.goto("https://example.com")
# Автоматическое ожидание (по умолчанию 30 сек)
page.click("button#submit")
# Явное ожидание
page.wait_for_selector("div.success-message")
# Ожидание условия
page.wait_for_function("window.myCondition === true")
browser.close()
Для надежных UI тестов используй явные ожидания с конкретными условиями.