1. Основы Pytest и взаимодействие с элементами в Playwright
Основы Pytest и взаимодействие с элементами в Playwright
В предыдущих этапах обучения мы подготовили рабочее окружение. Теперь настало время перейти к практике: написанию кода, который будет открывать браузер, находить элементы и проверять их состояние. В этой статье мы разберем фундамент современной автоматизации: связку тест-раннера Pytest и инструментов взаимодействия Playwright.
Роль Pytest в автоматизации
Playwright сам по себе — это библиотека для управления браузером. Он умеет «кликать» и «печатать», но он не знает, что такое «тест», «успех» или «провал». Эту роль берет на себя Pytest.
Pytest — это стандарт де-факто в мире тестирования на Python. Он отвечает за:
Правила именования
Чтобы Pytest автоматически нашел ваши тесты, нужно соблюдать простые соглашения: * Файлы должны начинаться сtest_ или заканчиваться на _test.py (например, test_login.py).
* Функции внутри файлов должны начинаться с префикса test_ (например, def test_submit_form():).Пример простейшего теста:
Локаторы в Playwright: Как найти элемент?
Самая частая задача в UI-тестах — найти кнопку, поле ввода или текст. Для этого используются локаторы. От качества локаторов зависит стабильность ваших тестов. Если вы привяжетесь к случайному CSS-классу, который разработчики изменят завтра, тест упадет.
Философия User-Facing Locators
Playwright продвигает подход, ориентированный на пользователя. Тест должен взаимодействовать со страницей так, как это делает реальный человек. Пользователь не ищет кнопку по div > span:nth-child(3), он ищет кнопку с текстом «Войти».
Согласно документации и практике сообщества, приоритет выбора локаторов выглядит так:
page.get_by_role() — самый надежный метод. Использует семантические роли ARIA (button, link, heading).page.get_by_text() — поиск по видимому тексту.page.get_by_label() — для полей ввода, связанных с тегом <label>.page.get_by_placeholder() — поиск по атрибуту placeholder.И только если эти методы не подходят, стоит использовать CSS (page.locator("css-selector")) или XPath.
> Playwright — это мощное средство автоматизации, дающее широкий набор возможностей для взаимодействия с браузерами, и встроенный класс expect упрощает работу с ассертами. > > habr.com
Примеры использования
Предположим, у нас есть кнопка <button>Отправить</button>.
Плохой вариант (хрупкий):
Хороший вариант (устойчивый):
Если на странице несколько элементов с одинаковой ролью, Playwright выдаст ошибку. Это полезно, так как заставляет вас уточнять критерии поиска, делая тест более предсказуемым.
Взаимодействие с элементами (Actions)
После того как элемент найден, с ним нужно выполнить действие. Playwright автоматически ждет, пока элемент станет «активным» (Actionability checks). Это означает, что вам не нужно писать time.sleep() — фреймворк сам убедится, что кнопка видима, не перекрыта другим элементом и готова к клику.
Основные команды
* Клик:
* Ввод текста:
Используйте fill() вместо посимвольного ввода, если не требуется эмуляция нажатия клавиш.
* Нажатие клавиш:
* Выбор из списка:
Ожидания (Auto-waiting)
Одной из главных проблем старых инструментов (например, Selenium) была необходимость ручных ожиданий. Как отмечают в сообществе, Playwright решает эту проблему архитектурно.
> У Playwright есть много крутых фич, с которыми он рвет Selenium в пух... Playwright удобнее и современнее. > > vc.ru
Перед выполнением действия Playwright проверяет, что элемент:
Проверки (Assertions) с использованием expect
Тест без проверки — это просто скрипт. В Pytest есть стандартный оператор assert, но для UI-тестов его недостаточно. Веб-страницы динамичны: элемент может появиться не сразу.
Для этого Playwright предоставляет синхронный модуль expect. Он работает по принципу Web-First Assertions: если условие не выполняется сразу, он будет повторять проверку (retry) в течение заданного тайм-аута (по умолчанию 5 секунд).
Синтаксис
Почему не обычный assert?
Рассмотрим пример:
Если в момент выполнения этой строки текст еще не подгрузился (например, спиннер крутится 0.5 секунды), тест упадет мгновенно. expect же будет опрашивать элемент до истечения тайм-аута, делая тест стабильным без лишних пауз.
Собираем всё вместе: Первый полноценный тест
Напишем тест для сценария логина. Мы будем использовать фикстуру page, которую предоставляет плагин pytest-playwright (подробнее о фикстурах мы поговорим в следующих статьях, пока просто знайте, что она дает готовый объект страницы).
Файл: test_login_scenario.py
Запуск теста
В терминале выполните команду:
pytest
Чтобы увидеть браузер вживую (по умолчанию тесты запускаются в headless режиме, то есть без интерфейса), добавьте флаг --headed:
pytest --headed
Чтобы замедлить выполнение для отладки, используйте --slowmo (в миллисекундах):
pytest --headed --slowmo 1000
Итоги
test_.get_by_role, get_by_text) как основной способ поиска элементов. Это делает тесты устойчивыми к изменениям верстки.expect(). Это обеспечивает автоматические повторные попытки (retries) при динамическом контенте, в отличие от стандартного assert.fill() предпочтительнее для быстрого заполнения форм, чем эмуляция нажатия клавиш.