Написание тестов
Введение
Тесты Playwright просты, они
- выполняют действия, и
- проверяют состояние на соответствие ожиданиям.
Нет необходимости ждать чего-либо перед выполнением действия: Playwright автоматически ожидает, пока не пройдут различные проверки доступности перед выполнением каждого действия.
Также нет необходимости иметь дело с условиями гонки при выполнении проверок - утверждения Playwright разработаны таким образом, чтобы описывать ожидания, которые должны быть в конечном итоге выполнены.
Вот и все! Эти проектные решения позволяют пользователям Playwright полностью забыть о ненадежных таймаутах и гонках в своих тестах.
Вы узнаете
- Как написать первый тест
- Как выполнять действия
- Как использовать утверждения
- Как тесты выполняются изолированно
- Как использовать хуки тестов
Первый тест
Посмотрите на следующий пример, чтобы увидеть, как написать тест. Обратите внимание, как имя файла следует соглашению с префиксом test_
, а также каждое имя теста.
import re
from playwright.sync_api import Page, expect
def test_has_title(page: Page):
page.goto("https://playwright.dev/")
# Ожидаем, что заголовок "содержит" подстроку.
expect(page).to_have_title(re.compile("Playwright"))
def test_get_started_link(page: Page):
page.goto("https://playwright.dev/")
# Кликните по ссылке "Get started".
page.get_by_role("link", name="Get started").click()
# Ожидаем, что на странице будет заголовок с именем Installation.
expect(page.get_by_role("heading", name="Installation")).to_be_visible()
Действия
Навигация
Большинство тестов начнется с перехода на страницу по URL. После этого тест сможет взаимодействовать с элементами страницы.
page.goto("https://playwright.dev/")
Playwright будет ждать, пока страница достигнет состояния загрузки, прежде чем двигаться дальше. Узнайте больше о параметрах page.goto().
Взаимодействия
Выполнение действий начинается с поиска элементов. Для этого Playwright использует API локаторов. Локаторы представляют собой способ найти элемент(ы) на странице в любой момент, узнайте больше о различных типах доступных локаторов. Playwright будет ждать, пока элемент станет доступным для действия, прежде чем выполнять действие, поэтому нет необходимости ждать, пока он станет доступным.
# Создайте локатор.
get_started = page.get_by_role("link", name="Get started")
# Кликните по нему.
get_started.click()
В большинстве случаев это будет написано в одну строку:
page.get_by_role("link", name="Get started").click()
Основные действия
Это список самых популярных действий Playwright. Обратите внимание, что их гораздо больше, поэтому обязательно ознакомьтесь с разделом API локаторов, чтобы узнать о них больше.
Действие | Описание |
---|---|
locator.check() | Установить флажок ввода |
locator.click() | Кликнуть по элементу |
locator.uncheck() | Снять флажок ввода |
locator.hover() | Навести курсор мыши на элемент |
locator.fill() | Заполнить поле формы, ввести текст |
locator.focus() | Сфокусироваться на элементе |
locator.press() | Нажать одну клавишу |
locator.set_input_files() | Выбрать файлы для загрузки |
locator.select_option() | Выбрать опцию в выпадающем списке |
Утверждения
Playwright включает утверждения, которые будут ждать, пока ожидаемое условие не будет выполнено. Использование этих утверждений позволяет сделать тесты надежными и устойчивыми. Например, этот код будет ждать, пока страница не получит заголовок, содержащий "Playwright":
import re
from playwright.sync_api import expect
expect(page).to_have_title(re.compile("Playwright"))
Вот список самых популярных асинхронных утверждений. Обратите внимание, что есть много других, с которыми стоит ознакомиться:
Утверждение | Описание |
---|---|
expect(locator).to_be_checked() | Флажок установлен |
expect(locator).to_be_enabled() | Элемент управления включен |
expect(locator).to_be_visible() | Элемент виден |
expect(locator).to_contain_text() | Элемент содержит текст |
expect(locator).to_have_attribute() | Элемент имеет атрибут |
expect(locator).to_have_count() | Список элементов имеет заданную длину |
expect(locator).to_have_text() | Элемент соответствует тексту |
expect(locator).to_have_value() | Элемент ввода имеет значение |
expect(page).to_have_title() | Страница имеет заголовок |
expect(page).to_have_url() | Страница имеет URL |
Изоляция тестов
Плагин Playwright для Pytest основан на концепции фикстур тестов, таких как встроенная фикстура страницы, которая передается в ваш тест. Страницы изолированы между тестами благодаря контексту браузера, который эквивалентен совершенно новому профилю браузера, где каждый тест получает свежую среду, даже когда несколько тестов выполняются в одном браузере.
from playwright.sync_api import Page
def test_example_test(page: Page):
pass
# "page" принадлежит изолированному BrowserContext, созданному для этого конкретного теста.
def test_another_test(page: Page):
pass
# "page" во втором тесте полностью изолирована от первого теста.
Использование фикстур
Вы можете использовать различные фикстуры для выполнения кода до или после ваших тестов и для совместного использования объектов между ними. Фикстура с областью действия function
, например, с autouse, ведет себя как beforeEach/afterEach. А фикстура с областью действия module
с autouse ведет себя как beforeAll/afterAll, которая выполняется перед всеми и после всех тестов.
import pytest
from playwright.sync_api import Page, expect
@pytest.fixture(scope="function", autouse=True)
def before_each_after_each(page: Page):
print("перед выполнением теста")
# Переходите на начальный URL перед каждым тестом.
page.goto("https://playwright.dev/")
yield
print("после выполнения теста")
def test_main_navigation(page: Page):
# Утверждения используют API expect.
expect(page).to_have_url("https://playwright.dev/")