Python: Selenium
Теория: Структуризация тестов
Когда автотестов становится много, важно держать порядок. Отдельные файлы и папки помогают быстро найти нужный тест, локатор или фикстуру. Pytest сам найдёт тесты, если они начинаются с test_ и лежат в папке tests.
Создание проекта
pytest.ini задаёт общие параметры запуска:
Папка tests/ — сценарии
Здесь лежат сами тесты. Каждый модуль — отдельная часть функциональности.
В conftest.py хранятся фикстуры — общий код для всех тестов.
Так браузер создаётся и закрывается автоматически, без повторений в каждом тесте.
Папка pages/ — страницы
Страницы описывают элементы и действия. Это шаблон Page Object: тест обращается к методам страницы, а не к локаторам напрямую.
Пример теста:
Папка core/ — базовые классы и ожидания
Здесь лежит общий код, который используется на всех страницах.
Папка data/ — тестовые данные
Все логины, пароли и тестовые значения удобно хранить отдельно:
Папка utils/ — утилиты
Общие функции, не зависящие от страниц и тестов.
Папка reports/ — результаты
Сюда сохраняются отчёты, скриншоты и HTML-файлы с результатами тестов.
Минимальная структура проекта
Такой шаблон подходит для любого проекта на Selenium.
Использование conftest.py и фикстур Pytest
Файл conftest.py — это центральное место, где хранятся общие настройки, фикстуры и хуки. Pytest автоматически видит этот файл, если он находится в папке с тестами или выше по дереву. Благодаря этому фикстуры не нужно импортировать вручную — они доступны во всех тестах проекта.
Что делает фикстура
Фикстура — это функция, которая подготавливает окружение для теста: создаёт браузер, логинится, подключается к базе или очищает данные. После завершения теста фикстура может выполнить обратные действия — закрыть браузер, удалить временные файлы или очистить сессию.
Пример фикстуры для Selenium
Теперь любой тест может просто принять аргумент driver, и Pytest сам подставит туда экземпляр браузера.
Фикстура создаёт браузер перед тестом и закрывает его автоматически после завершения.
Область действия фикстуры
Pytest позволяет задавать, как часто создаётся фикстура — это называется scope. Значения:
"function"— создаётся для каждого теста (по умолчанию);"class"— один раз для всех тестов в классе;"module"— один раз для всех тестов в файле;"session"— один раз на всю сессию тестов.
Вложенные фикстуры
Фикстура может использовать другую фикстуру. Например, можно отделить создание браузера от открытия сайта:
В тесте можно использовать только login_page, и браузер создастся автоматически.
Автоматический запуск (autouse)
Если фикстура нужна всем тестам, можно задать autouse=True. Тогда её не придётся передавать в аргументах.
Передача параметров
Фикстуры можно параметризовать. Например, запускать тесты в разных браузерах:
Pytest выполнит каждый тест по одному разу на каждом браузере.
Хуки и отчёты
В conftest.py можно добавлять хуки — специальные функции, которые Pytest вызывает в определённые моменты. Например, можно сохранять скриншот при падении теста:
Теперь при любой ошибке Selenium сделает снимок экрана, а Pytest положит его в папку reports/screenshots.
Пример структуры
Фикстуры в conftest.py автоматически доступны всем тестам. Если добавить conftest.py в каждую подпапку, можно создавать локальные фикстуры только для этой области (например, отдельные данные для блока профиля).
Пример полного цикла
Так conftest.py становится центром управления проектом: здесь создаются браузеры, подключаются данные, формируются отчёты и логика запуска тестов.
Инициализация WebDriver в фикстурах
При работе с Selenium в каждом тесте нужно запускать браузер, открывать страницы и корректно завершать сессию. Делать это вручную в каждом файле неудобно — код повторяется, тесты становятся громоздкими. Поэтому инициализацию браузера выносят в фикстуру, обычно в файл conftest.py.
Базовая инициализация
Простейший пример — создание экземпляра Chrome перед тестом и закрытие после выполнения:
Теперь тест просто принимает driver как аргумент — Pytest сам подставит созданный экземпляр браузера:
Это избавляет от повторяющегося кода и гарантирует, что браузер всегда закроется даже при падении теста.
Добавление опций к драйверу
Чтобы сделать тесты стабильнее, в фикстуру часто добавляют параметры браузера: размер окна, язык, headless-режим, отключение уведомлений.
Что это даёт:
- headless — браузер работает без интерфейса, удобно для CI;
- window-size — одинаковая ширина и высота окна во всех тестах;
- disable-notifications — отключает всплывающие запросы;
- lang — задаёт язык интерфейса, чтобы сайт открывался на нужной локали.
Передача базового URL
Иногда тестам нужно знать, где расположен тестируемый сайт. Это можно задать в отдельной фикстуре:
Тогда тест можно записать так:
Параметризация фикстуры для разных браузеров
Если проект тестируется на нескольких браузерах, фикстура может принимать параметр request.param и запускать нужный вариант:
Pytest выполнит каждый тест по одному разу на каждом браузере.
Инициализация через setup_class (если нужен класс)
Иногда тесты организуют в класс, тогда фикстуру можно объявить с областью scope="class" — она создаст браузер один раз для всех тестов внутри класса:
Использование:
Безопасное закрытие браузера
Чтобы избежать ошибок, если браузер уже закрыт или тест упал раньше, можно добавить обработку исключений:
Так тесты не прер��утся из-за сбоя при завершении сессии.
Пример полного conftest.py
Фикстура для инициализации WebDriver — основа всех автотестов на Selenium.
Повторное использование шагов и утилит
Когда тестов становится десятки или сотни, в коде начинают повторяться одни и те же действия: открыть страницу, авторизоваться, загрузить файл, кликнуть по кнопке. Решение — вынести повторяющиеся части в отдельные функции, классы и утилиты. Это делает тесты короче, понятнее и облегчает поддержку.
Шаги как функции
Любое действие, которое встречается в нескольких тестах, стоит оформить как функцию.
Теперь тест становится проще:
Такой приём уменьшает дублирование и делает код читаемым: шаги можно переиспользовать в любом тесте.
Повторяющиеся проверки
Проверки часто одинаковые: убедиться, что элемент виден, текст совпадает, URL содержит подстроку. Их тоже удобно оформить как функции.
Теперь тест выглядит как инструкция:
Шаги в виде классов
Если шагов становится много, удобно объединять их в классы — по смыслу или по разделу сайта.
Использование:
Теперь тесты читаются как последовательность действий пользователя, а сами шаги можно использовать в любых сценариях.
Утилиты для ожиданий и времени
Некоторые задачи повторяются в каждом проекте: подождать появления элемента, проверить наличие файла, замерить время шага. Это тоже можно вынести в общий модуль.
Теперь в тестах можно использовать короткие вызовы:
Общие фикстуры
Иногда полезно объединить шаги и утилиты в фикстуры — чтобы подготовка окружения происходила автоматически.
Теперь любой тест, которому нужен авторизованный пользователь, просто использует authorized_user:


