✅ Решения заданий самопроверки
⚡ Краткие ответы
- Три метода:
implicitly_wait(глобальное),WebDriverWait+EC(явное),time.sleep(антипаттерн). - Ждать текст:
EC.text_to_be_present_in_element. - AJAX: данные без перезагрузки. Implicit не знает когда появится нужный текст.
- Смешивание: таймауты складываются → непредсказуемое поведение.
Блок 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) гарантирует, что ожидание не закончится раньше, чем появится результат.