Skip to main content

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

Введение

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

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

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

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

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

Вы узнаете

Первый тест

Посмотрите на следующий пример, чтобы увидеть, как написать тест.

tests/example.spec.ts
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();
});
note

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

tests/example.spec.ts
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, которые выполняются один раз для каждого рабочего процесса перед/после всех тестов.

tests/example.spec.ts
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/');
});
});

Что дальше