✅ Решения заданий самопроверки

← К оглавлению урока

⚡ Краткие ответы

  1. Три метода: implicitly_wait (глобальное), WebDriverWait+EC (явное), time.sleep (антипаттерн).
  2. Ждать текст: EC.text_to_be_present_in_element.
  3. AJAX: данные без перезагрузки. Implicit не знает когда появится нужный текст.
  4. Смешивание: таймауты складываются → непредсказуемое поведение.

Блок 1: Ожидания в Selenium

Ответ 1: Что такое ожидания в Selenium?

Ожидания в Selenium — механизм задержки выполнения теста до момента, пока нужный элемент или состояние не появятся на странице. Без ожиданий тест падает с NoSuchElementException или ElementNotInteractableException, потому что ищет элемент раньше, чем он загрузился.

Ответ 2: Три метода ожидания

  • Неявное (implicitly_wait) — глобальная задержка для всех find_element. Просто, но не гибко.
  • Явное (WebDriverWait + EC) — ожидает конкретное условие. Рекомендуется.
  • Жёсткое (time.sleep) — фиксированная пауза. Антипаттерн.

Ответ 3: Рекомендуемый метод

WebDriverWait + EC. Причины: завершается сразу после выполнения условия (быстро), умеет ждать конкретных состояний (надёжно), явно документирует намерение (читаемо).

Ответ 4: Плюсы и минусы implicitly_wait

Плюсы: простая настройка (одна строка), подходит если сайт загружается стабильно.

Минусы: применяется ко всем элементам (даже быстрым), не умеет ждать специфических условий (текст, URL, выбор чекбокса).

Ответ 5: Минусы time.sleep()

  • Неэффективен: ждёт полное время, даже если элемент появился раньше
  • Ненадёжен: если страница медленнее паузы — тест упадёт
  • Замедляет весь тестовый набор

Блок 2: Expected Conditions

Ответ 6: Ожидание кликабельности и клик

# test_clickable.py
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)
button = wait.until(EC.element_to_be_clickable((By.ID, "login-btn")))
button.click()

Ответ 7: presence vs visibility

  • presence_of_element_located — элемент появился в DOM, но может быть скрыт (display:none)
  • visibility_of_element_located — элемент в DOM и видим пользователю (ненулевой размер, не скрыт)

Правило: если нужно кликнуть или прочитать текст — используйте visibility. Если просто проверить наличие в DOM — presence.

Ответ 8: Проверка перехода на Dashboard

Два варианта:

# Вариант 1: по URL
wait.until(EC.url_contains("dashboard"))

# Вариант 2: по заголовку
wait.until(EC.text_to_be_present_in_element((By.TAG_NAME, "h6"), "Dashboard"))

Ответ 9: EC из лекции — когда использовать

EC Когда
presence_of_element_locatedЭлемент в DOM, м.б. скрыт
visibility_of_element_locatedЭлемент виден
element_to_be_clickableНужно кликнуть
text_to_be_present_in_elementЖдём конкретный текст
url_containsПроверить переход по URL
title_containsПроверить title страницы
frame_to_be_available_and_switch_to_itНужен iframe
alert_is_presentПоявится JS alert
staleness_ofЭлемент должен исчезнуть из DOM
element_located_to_be_selectedЧекбокс/radio должен быть выбран

Блок 3: AJAX

Ответ 10: Что такое AJAX?

AJAX — технология загрузки данных с сервера без перезагрузки страницы. Примеры: автодополнение в поиске Google, загрузка ленты постов при скролле, обновление счётчика непрочитанных сообщений.

Ответ 11: Почему implicitly_wait не справляется с AJAX?

implicitly_wait ждёт только появления элемента в DOM. AJAX может добавить элемент в DOM немедленно (пустым или с плейсхолдером), а заполнить его данными только через несколько секунд. Implicit видит элемент и сразу возвращает его — тест получает пустое значение и падает.

Ответ 12: Тест с AJAX

# test_ajax_solution.py
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

@pytest.fixture
def driver():
    driver = webdriver.Chrome()
    driver.get("https://example.com")  # URL страницы с кнопкой AJAX
    yield driver
    driver.quit()

def test_ajax(driver):
    wait = WebDriverWait(driver, 15)

    driver.find_element(By.ID, "ajaxButton").click()

    result = wait.until(
        EC.text_to_be_present_in_element(
            (By.CLASS_NAME, "bg-success"), "Data loaded"
        )
    )
    assert result, "Текст AJAX-ответа не появился"

Блок 4: Взаимодействие с элементами

Ответ 13: Методы взаимодействия

# send_keys — ввод текста
field = driver.find_element(By.NAME, "username")
field.send_keys("Admin")

# clear — очистка поля
field.clear()

# click — клик
button = driver.find_element(By.XPATH, "//button[@type='submit']")
button.click()

Ответ 14: Фикстура OrangeHRM

# test_orangehrm_fixture.py
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

@pytest.fixture
def logged_in_driver():
    driver = webdriver.Chrome()
    driver.get("https://opensource-demo.orangehrmlive.com/web/index.php/auth/login")

    driver.find_element(By.NAME, "username").send_keys("Admin")
    driver.find_element(By.NAME, "password").send_keys("admin123")
    driver.find_element(By.XPATH, "//button[@type='submit']").click()

    wait = WebDriverWait(driver, 10)
    wait.until(EC.url_contains("dashboard"))

    yield driver
    driver.quit()

Ответ 15: Почему timeout > 45?

Страница slow calculator вычисляет результат ровно через 45 секунд после нажатия «=». WebDriverWait(driver, 45) с таймаутом ровно 45 секунд может не успеть — реальная задержка может варьироваться из-за скорости сети и браузера. Запас в 5–10 секунд (timeout=50) гарантирует, что ожидание не закончится раньше, чем появится результат.