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

Какие знаешь принципы программирования?

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

  1. Используй Explicit Wait — самый надежный способ
  2. Избегай sleep() — только в крайнем случае
  3. Подходящее время ожидания — 5-30 секунд зависит от контекста
  4. Специфичные условия — не жди просто наличия элемента
  5. Пользовательское ожидание — если встроенное не подходит

Для 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 тестов используй явные ожидания с конкретными условиями.