🏠 Домашнее задание

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

Это не LMS-задание. Summary session 4 — занятие-повторение. Ниже представлены практические задачи из лекции для самостоятельного закрепления материала. Выполните их локально в своём проекте перед переходом к уроку 09.

⚡ Задачи для самопроверки

  1. Написать тест: load delay — дождаться появления кнопки (uitestingplayground.com/loaddelay).
  2. Написать тест: OrangeHRM login — авторизация + проверка URL с «dashboard».
  3. Написать тест: 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» появляется только после истечения задержки.

  1. Перейти на страницу
  2. Дождаться появления кнопки (до 15 секунд)
  3. Убедиться, что кнопка отображается

Пошаговое решение

Шаг 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

  1. Открыть сайт OrangeHRM
  2. Ввести Username: «Admin», Password: «admin123»
  3. Нажать кнопку Login
  4. Дождаться, пока URL содержит «dashboard»
  5. Проверить, что «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

  1. Открыть страницу Slow Calculator
  2. В поле #delay ввести «45»
  3. Нажать кнопки: 7, +, 8, =
  4. Дождаться результата «15» в .screen (до 50 секунд)
  5. Проверить, что результат — «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 специально создан для тестирования явных ожиданий.

Связь с теорией и примерами