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

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

Это не LMS-задание. Summary session 5 — занятие-повторение. Ниже представлены задачи из лекции для самостоятельного закрепления материала. Выполните их локально перед переходом к уроку 11 (Page Object Model).

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

  1. Написать тест: iframe — найти текст «semper posuere integer...» на bonigarcia.dev/selenium-webdriver-java/iframes.html
  2. Написать тест: drag&drop — перетащить фото в корзину на globalsqa.com, проверить количество элементов

Подготовка окружения

# PowerShell — создать проект и окружение
mkdir autoqa-hw-advanced
cd autoqa-hw-advanced
python -m venv venv
.\venv\Scripts\Activate.ps1
pip install selenium pytest
Selenium 4 включает встроенный Selenium Manager — ChromeDriver загрузится автоматически. Дополнительные пакеты не нужны.

Задача 1: Тест iframe — проверка наличия текста

Постановка (из лекции)

Страница: https://bonigarcia.dev/selenium-webdriver-java/iframes.html

  1. Найти iframe с id="my-iframe"
  2. Переключиться в этот iframe
  3. Найти все параграфы <p>
  4. Убедиться, что один из них содержит текст "semper posuere integer et senectus justo curabitur."

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

Шаг 1: Создать файл теста

# test_iframe.py

Шаг 2: Фикстура и импорты

# test_iframe.py
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By

@pytest.fixture
def browser():
    """Создает и закрывает браузер после теста."""
    driver = webdriver.Chrome()
    driver.maximize_window()
    yield driver
    driver.quit()

Шаг 3: Тест с переключением iframe

# test_iframe.py (продолжение)
def test_iframe_text(browser):
    """Проверяет наличие текста в iframe."""
    # Открываем страницу
    browser.get("https://bonigarcia.dev/selenium-webdriver-java/iframes.html")

    # Находим iframe и переключаемся в него
    iframe = browser.find_element(By.ID, "my-iframe")
    browser.switch_to.frame(iframe)

    # Находим все параграфы внутри iframe
    paragraphs = browser.find_elements(By.TAG_NAME, "p")

    # Проверяем наличие нужного текста в одном из параграфов
    expected_text = "semper posuere integer et senectus justo curabitur."
    found = any(expected_text in p.text for p in paragraphs)
    assert found, f"Текст '{expected_text}' не найден в iframe"

    print("Тест пройден: текст найден в iframe")
Логика: используем any() для поиска текста в любом из параграфов. Это надёжнее, чем проверять только первый элемент — текст может оказаться в любом абзаце.

Задача 2: Тест drag and drop — фотографии в корзину

Постановка (из лекции)

Страница: https://www.globalsqa.com/demo-site/draganddrop/

  1. Переключиться в iframe с изображениями (первый iframe на странице)
  2. Захватить первую фотографию (верхний левый элемент в #gallery)
  3. Перетащить её в область корзины (#trash)
  4. Проверить: в корзине 1 фотография, в галерее 3 фотографии

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

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

@pytest.fixture
def browser():
    driver = webdriver.Chrome()
    driver.maximize_window()
    yield driver
    driver.quit()

def test_drag_photo_to_trash(browser):
    """Перетаскивает первое фото в корзину, проверяет количество."""
    url = "https://www.globalsqa.com/demo-site/draganddrop/"
    browser.get(url)

    # Ждём загрузки страницы и iframe
    wait = WebDriverWait(browser, 15)
    wait.until(EC.presence_of_element_located((By.TAG_NAME, "iframe")))

    # Переключение в iframe с изображениями
    iframe = browser.find_element(By.TAG_NAME, "iframe")
    browser.switch_to.frame(iframe)

    # Определяем элементы
    photo = browser.find_element(By.XPATH, "//ul[@id='gallery']/li[1]")
    trash = browser.find_element(By.ID, "trash")

    # Выполняем drag and drop
    actions = ActionChains(browser)
    actions.drag_and_drop(photo, trash).perform()

    # Ждём перемещения (явное ожидание лучше time.sleep)
    wait.until(EC.presence_of_element_located(
        (By.XPATH, "//div[@id='trash']/ul/li")
    ))

    # Проверяем количество фотографий
    photos_in_trash = len(browser.find_elements(
        By.XPATH, "//div[@id='trash']/ul/li"
    ))
    photos_in_gallery = len(browser.find_elements(
        By.XPATH, "//ul[@id='gallery']/li"
    ))

    assert photos_in_trash == 1, \
        f"В корзине {photos_in_trash} фото, ожидалось 1"
    assert photos_in_gallery == 3, \
        f"В галерее {photos_in_gallery} фото, ожидалось 3"

    print("Тест пройден: фото перемещено в корзину")
Улучшение относительно лекции: вместо time.sleep(2) используется явное ожидание появления элемента в корзине. Это делает тест надёжнее при медленном соединении.

Запуск и проверка в VS Code

Запуск из терминала (PowerShell)

# Запустить все тесты
pytest -v

# Запустить только iframe-тест
pytest test_iframe.py -v

# Запустить drag&drop тест с выводом print
pytest test_drag_and_drop.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", "-s"],
            "justMyCode": false
        }
    ]
}

Ожидаемый результат

test_iframe.py::test_iframe_text PASSED
test_drag_and_drop.py::test_drag_photo_to_trash PASSED

2 passed in ~10.XXs
Тест drag&drop зависит от доступности внешнего сайта (globalsqa.com). Если тест нестабильно падает — проверьте структуру DOM страницы: она могла измениться. Используйте DevTools браузера для актуализации локаторов.

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