🏠 Домашнее задание
Это не LMS-задание. Summary session 5 — занятие-повторение. Ниже представлены задачи из лекции для самостоятельного закрепления материала. Выполните их локально перед переходом к уроку 11 (Page Object Model).
⚡ Задачи для самопроверки
- Написать тест: iframe — найти текст «semper posuere integer...» на
bonigarcia.dev/selenium-webdriver-java/iframes.html - Написать тест: 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
- Найти iframe с id="my-iframe"
- Переключиться в этот iframe
- Найти все параграфы
<p> - Убедиться, что один из них содержит текст
"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/
- Переключиться в iframe с изображениями (первый iframe на странице)
- Захватить первую фотографию (верхний левый элемент в
#gallery) - Перетащить её в область корзины (
#trash) - Проверить: в корзине 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 браузера для актуализации локаторов.