Перейти к основному содержимому

Написание тестов

Введение

Тесты Playwright просты, они

  • выполняют действия, и
  • проверяют состояние на соответствие ожиданиям.

Нет необходимости ждать чего-либо перед выполнением действия: Playwright автоматически ожидает, пока не пройдут различные проверки доступности перед выполнением каждого действия.

Также нет необходимости иметь дело с условиями гонки при выполнении проверок - утверждения Playwright разработаны таким образом, чтобы описывать ожидания, которые должны быть в конечном итоге выполнены.

Вот и все! Эти проектные решения позволяют пользователям Playwright полностью забыть о ненадежных таймаутах и гонках в своих тестах.

Вы узнаете

Первый тест

Посмотрите на следующий пример, чтобы увидеть, как написать тест. Обратите внимание, как имя файла следует соглашению с префиксом test_, а также каждое имя теста.

test_example.py
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 основан на концепции фикстур тестов, таких как встроенная фикстура страницы, которая передается в ваш тест. Страницы изолированы между тестами благодаря контексту браузера, который эквивалентен совершенно новому профилю браузера, где каждый тест получает свежую среду, даже когда несколько тестов выполняются в одном браузере.

test_example.py
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, которая выполняется перед всеми и после всех тестов.

test_example.py
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/")

Что дальше