🏠 Домашнее задание
Это не LMS-задание. Summary session 4 — занятие-повторение. Ниже представлены практические задачи из лекции для самостоятельного закрепления материала. Выполните их локально в своём проекте перед переходом к уроку 09.
⚡ Задачи для самопроверки
- Написать тест: load delay — дождаться появления кнопки (
uitestingplayground.com/loaddelay). - Написать тест: OrangeHRM login — авторизация + проверка URL с «dashboard».
- Написать тест: slow calculator — 7+8 с задержкой 45 с, результат 15.
Подготовка окружения
# PowerShell — создать проект и окружение
mkdir autoqa-hw-waits
cd autoqa-hw-waits
python -m venv venv
.\venv\Scripts\Activate.ps1
pip install selenium pytest webdriver-manager
Selenium 4 включает встроенный Selenium Manager для автоматической загрузки ChromeDriver. Если используете
webdriver_manager явно — добавьте его через pip install webdriver-manager. Оба варианта работают.
Задача 1: Load Delay — ожидание появления кнопки
Постановка
На странице http://www.uitestingplayground.com/loaddelay кнопка «Button Appearing After Delay» появляется только после истечения задержки.
- Перейти на страницу
- Дождаться появления кнопки (до 15 секунд)
- Убедиться, что кнопка отображается
Пошаговое решение
Шаг 1: Создать файл теста
# test_load_delay.py
Шаг 2: Импорты и фикстура
# test_load_delay.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
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
@pytest.fixture
def driver():
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
driver.get("http://www.uitestingplayground.com/loaddelay")
yield driver
driver.quit()
Шаг 3: Тест с явным ожиданием
# test_load_delay.py (продолжение)
def test_wait_for_button(driver):
wait = WebDriverWait(driver, 15)
button = wait.until(
EC.presence_of_element_located(
(By.XPATH, "//button[text()='Button Appearing After Delay']")
)
)
assert button.is_displayed(), "Кнопка не появилась!"
Логика: используем
presence_of_element_located, потому что нам нужно дождаться появления кнопки в DOM. Затем is_displayed() дополнительно проверяет видимость.
Задача 2: OrangeHRM — авторизация с проверкой URL
Постановка
Сайт: https://opensource-demo.orangehrmlive.com/web/index.php/auth/login
- Открыть сайт OrangeHRM
- Ввести Username: «Admin», Password: «admin123»
- Нажать кнопку Login
- Дождаться, пока URL содержит «dashboard»
- Проверить, что «dashboard» в
driver.current_url
Пошаговое решение
# test_orangehrm.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
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
@pytest.fixture
def driver():
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
driver.get("https://opensource-demo.orangehrmlive.com/web/index.php/auth/login")
yield driver
driver.quit()
def test_login_and_check_url(driver):
wait = WebDriverWait(driver, 10)
# Ввод логина
driver.find_element(By.NAME, "username").send_keys("Admin")
# Ввод пароля
driver.find_element(By.NAME, "password").send_keys("admin123")
# Клик по Login
driver.find_element(By.XPATH, "//button[@type='submit']").click()
# Ждём URL с "dashboard"
wait.until(EC.url_contains("dashboard"))
assert "dashboard" in driver.current_url, \
f"URL не содержит 'dashboard': {driver.current_url}"
Логика:
EC.url_contains("dashboard") — надёжный способ проверить успешную авторизацию, не привязываясь к конкретному тексту заголовка, который может меняться.
Задача 3: Slow Calculator — 7+8 с задержкой 45 секунд
Постановка
Сайт: https://bonigarcia.dev/selenium-webdriver-java/slow-calculator.html
- Открыть страницу Slow Calculator
- В поле
#delayввести «45» - Нажать кнопки: 7, +, 8, =
- Дождаться результата «15» в
.screen(до 50 секунд) - Проверить, что результат — «15»
Пошаговое решение
# test_slow_calculator.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
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.chrome.service import Service
@pytest.fixture
def driver():
service = Service(ChromeDriverManager().install())
driver = webdriver.Chrome(service=service)
driver.get("https://bonigarcia.dev/selenium-webdriver-java/slow-calculator.html")
yield driver
driver.quit()
def test_slow_calculator(driver):
wait = WebDriverWait(driver, 50) # 45 сек задержка + 5 сек запас
# Устанавливаем задержку
delay_input = driver.find_element(By.CSS_SELECTOR, "#delay")
delay_input.clear()
delay_input.send_keys("45")
# Нажимаем кнопки
driver.find_element(By.XPATH, "//span[text()='7']").click()
driver.find_element(By.XPATH, "//span[text()='+']").click()
driver.find_element(By.XPATH, "//span[text()='8']").click()
driver.find_element(By.XPATH, "//span[text()='=']").click()
# Ждём результата
result = wait.until(
EC.text_to_be_present_in_element((By.CSS_SELECTOR, ".screen"), "15")
)
assert result, "Результат '15' не появился!"
Ключевой момент:
WebDriverWait(driver, 50) — timeout на 5 секунд больше задержки. Это обязательно. Если сделать timeout = 45, тест может упасть из-за сетевых задержек браузера.
Запуск и проверка в VS Code
Запуск из терминала
# PowerShell — запустить все тесты с verbosity
pytest -v
# Запустить конкретный файл
pytest test_slow_calculator.py -v
# Запустить с выводом print
pytest test_orangehrm.py -v -s
Настройка запуска через F5 (launch.json)
# .vscode/launch.json
{
"version": "0.2.0",
"configurations": [
{
"name": "pytest current file",
"type": "debugpy",
"request": "launch",
"module": "pytest",
"args": ["${file}", "-v"],
"justMyCode": false
}
]
}
Ожидаемый результат
test_load_delay.py::test_wait_for_button PASSED
test_orangehrm.py::test_login_and_check_url PASSED
test_slow_calculator.py::test_slow_calculator PASSED
3 passed in ~55.XXs
Медленный тест (
test_slow_calculator) занимает около 45–50 секунд — это нормально. Slow Calculator специально создан для тестирования явных ожиданий.