Написание тестов
Введение
Тесты Playwright просты, они
- выполняют действия, и
- проверяют состояние на соответствие ожиданиям.
Нет необходимости ждать чего-либо перед выполнением действия: Playwright автоматически ждет, пока пройдет широкий спектр проверок доступности перед выполнением каждого действия.
Также нет необходимости иметь дело с условиями гонки при выполнении проверок - утверждения Playwright разработаны таким образом, что они описывают ожидания, которые в конечном итоге должны быть выполнены.
Вот и все! Эти дизайнерские решения позволяют пользователям Playwright забыть о ненадежных таймаутах и гонках в своих тестах.
Вы узнаете
- Как написать первый тест
- Как выполнять действия
- Как использовать утверждения
- Как тесты выполняются изолированно
- Как использовать хуки тестов
Первый тест
Посмотрите на следующий пример, чтобы увидеть, как написать тест.
import { test, expect } from '@playwright/test';
test('has title', async ({ page }) => {
await page.goto('https://playwright.dev/');
// Ожидаем, что заголовок "содержит" подстроку.
await expect(page).toHaveTitle(/Playwright/);
});
test('get started link', async ({ page }) => {
await page.goto('https://playwright.dev/');
// Нажимаем на ссылку "Начать".
await page.getByRole('link', { name: 'Get started' }).click();
// Ожидаем, что на странице есть заголовок с именем "Установка".
await expect(page.getByRole('heading', { name: 'Installation' })).toBeVisible();
});
Добавьте // @ts-check
в начале каждого тестового файла при использовании JavaScript в VS Code, чтобы получить автоматическую проверку типов.
Действия
Навигация
Большинство тестов начинается с навигации страницы по URL. После этого тест сможет взаимодействовать с элементами страницы.
await page.goto('https://playwright.dev/');
Playwright будет ждать, пока страница достигнет состояния загрузки, прежде чем продолжить. Узнайте больше о параметрах page.goto().
Взаимодействия
Выполнение действий начинается с поиска элементов. Playwright использует API локаторов для этого. Локаторы представляют собой способ находить элемент(ы) на странице в любой момент, узнайте больше о разных типах доступных локаторов. Playwright будет ждать, пока элемент станет доступным для действий, прежде чем выполнять действие, поэтому нет необходимости ждать, пока он станет доступным.
// Создаем локатор.
const getStarted = page.getByRole('link', { name: 'Get started' });
// Нажимаем на него.
await getStarted.click();
В большинстве случаев это будет записано в одну строку:
await page.getByRole('link', { name: 'Get started' }).click();
Основные действия
Это список самых популярных действий Playwright. Обратите внимание, что их гораздо больше, поэтому обязательно ознакомьтесь с разделом API локаторов, чтобы узнать о них больше.
Действие | Описание |
---|---|
locator.check() | Установить флажок в поле ввода |
locator.click() | Нажать на элемент |
locator.uncheck() | Снять флажок с поля ввода |
locator.hover() | Навести курсор на элемент |
locator.fill() | Заполнить поле формы, ввести текст |
locator.focus() | Установить фокус на элемент |
locator.press() | Нажать на одну клавишу |
locator.setInputFiles() | Выбрать файлы для загрузки |
locator.selectOption() | Выбрать опцию в выпадающем списке |
Утверждения
Playwright включает тестовые утверждения в виде функции expect
. Чтобы сделать утверждение, вызовите expect(value)
и выберите сопоставитель, который отражает ожидание.
Существует множество универсальных сопоставителей, таких как toEqual
, toContain
, toBeTruthy
, которые можно использовать для утверждения любых условий.
expect(success).toBeTruthy();
Playwright также включает асинхронные сопоставители, которые будут ждать, пока ожидаемое условие не будет выполнено. Использование этих сопоставителей позволяет сделать тесты ненадежными и устойчивыми. Например, этот код будет ждать, пока страница не получит заголовок, содержащий "Playwright":
await expect(page).toHaveTitle(/Playwright/);
Вот список самых популярных асинхронных утверждений. Обратите внимание, что существует много других, с которыми стоит ознакомиться:
Утверждение | Описание |
---|---|
expect(locator).toBeChecked() | Флажок установлен |
expect(locator).toBeEnabled() | Элемент включен |
expect(locator).toBeVisible() | Элемент видим |
expect(locator).toContainText() | Элемент содержит текст |
expect(locator).toHaveAttribute() | Элемент имеет атрибут |
expect(locator).toHaveCount() | Список элементов имеет заданную длину |
expect(locator).toHaveText() | Элемент соответствует тексту |
expect(locator).toHaveValue() | Элемент ввода имеет значение |
expect(page).toHaveTitle() | У страницы есть заголовок |
expect(page).toHaveURL() | У страницы есть URL |
Изоляция тестов
Playwright Test основан на концепции тестовых фикстур, таких как встроенная фикстура страницы, которая передается в ваш тест. Страницы изолированы между тестами благодаря контексту браузера, который эквивалентен совершенно новому профилю браузера, где каждый тест получает свежую среду, даже когда несколько тестов выполняются в одном браузере.
import { test } from '@playwright/test';
test('example test', async ({ page }) => {
// "page" принадлежит изолированному контексту браузера, созданному для этого конкретного теста.
});
test('another test', async ({ page }) => {
// "page" во втором тесте полностью изолирован от первого теста.
});
Использование хуков тестов
Вы можете использовать различные хуки тестов, такие как test.describe
, чтобы объявить группу тестов, и test.beforeEach
и test.afterEach
, которые выполняются перед/после каждого теста. Другие хуки включают test.beforeAll
и test.afterAll
, которые выполняются один раз для каждого рабочего процесса перед/после всех тестов.
import { test, expect } from '@playwright/test';
test.describe('navigation', () => {
test.beforeEach(async ({ page }) => {
// Переходим на начальный URL перед каждым тестом.
await page.goto('https://playwright.dev/');
});
test('main navigation', async ({ page }) => {
// Утверждения используют API expect.
await expect(page).toHaveURL('https://playwright.dev/');
});
});