Блог
Автотесты/Playwright

Фикстуры в Playwright: зачем нужны и как писать свои

Фикстуры в Playwright — механизм подготовки окружения для теста: всё, что нужно тесту до его запуска (открытая страница, авторизованный пользователь, тестовые данные), и что нужно корректно убрать после. Это одна из тем, которая отличает уверенного новичка от того, кто просто скопировал синтаксис из документации.

Встроенная фикстура page

Самая частая фикстура, с которой сталкивается любой, кто пишет тесты на Playwright, — page, объект браузерной страницы:
test('открывается главная страница', async ({ page }) => {
await page.goto('/');
await expect(page).toHaveTitle(/Quality Academy/);
});

{ page } — это деструктуризация объекта фикстур, который Playwright передаёт в каждый тест. Помимо page, встроенными фикстурами являются context (изолированный контекст браузера) и browser — большинство тестов используют только page, остальные нужны реже, для более специфичных сценариев.

Зачем нужны свои фикстуры

Если несколько тестов требуют одинаковой подготовки — например, авторизованного пользователя — дублировать логику входа в каждом тесте неудобно и хрупко. Собственная фикстура решает это один раз:
// fixtures.js
import { test as base, expect } from '@playwright/test';

export const test = base.extend({
authenticatedPage: async ({ page }, use) => {
await page.goto('/login');
await page.getByLabel('Email').fill('user@example.com');
await page.getByLabel('Пароль').fill('password123');
await page.getByRole('button', { name: 'Войти' }).click();
await page.waitForURL('/dashboard');

// передаём подготовленную страницу в тест
await use(page);

// код после use() выполняется после теста — здесь можно чистить состояние
},
});

export { expect };

test.extend() создаёт новую версию test с дополнительной фикстурой authenticatedPage. Ключевой момент — вызов use(page): всё, что до него, выполняется как подготовка перед тестом, всё, что после — как очистка после теста. Это аналог beforeEach и afterEach вместе, только оформленное как переиспользуемый компонент, а не привязанное к конкретному файлу тестов.

Использование собственной фикстуры

import { test, expect } from './fixtures';

test('видно имя пользователя в личном кабинете', async ({ authenticatedPage }) => {
await expect(authenticatedPage.getByText('Анна')).toBeVisible();
});

Тест получает уже авторизованную страницу через authenticatedPage — код авторизации написан один раз в файле фикстур, а не повторяется в каждом тесте, которому нужен залогиненный пользователь.

Фикстуры против beforeEach: в чём разница

beforeEach выполняется перед каждым тестом в конкретном файле или блоке describe безусловно, для всех тестов сразу. Фикстуры — более гибкий и переиспользуемый механизм: одну и ту же фикстуру можно подключать в разных файлах тестов, и Playwright создаёт фикстуру только тогда, когда тест реально её запрашивает через деструктуризацию — если тест не указал authenticatedPage в параметрах, код фикстуры вообще не выполнится.

Частые вопросы про фикстуры в Playwright

Чем фикстура отличается от beforeEach? beforeEach привязан к конкретному файлу или блоку describe и выполняется для всех тестов в нём безусловно. Фикстуры — переиспользуемый механизм, который можно подключать в разных файлах, и который создаётся только тогда, когда тест реально её запрашивает.
Что делает функция use() внутри фикстуры? Она передаёт подготовленное значение (страницу, данные, объект) в сам тест. Код до use() — подготовка, код после — это код очистки (teardown), который выполнится после завершения теста.
Обязательно ли писать собственные фикстуры, или хватит встроенных? Для простых тестов хватает встроенной page. Собственные фикстуры становятся полезны, когда несколько тестов нуждаются в одинаковой, более сложной подготовке — например, авторизации, наполнении тестовыми данными или настройке моков.
Можно ли использовать несколько фикстур в одном тесте? Да, через деструктуризацию: test('...', async ({ authenticatedPage, apiContext }) => {...}) — тест получает сразу несколько подготовленных значений, каждое из которых описано отдельной фикстурой.

Закрепить фикстуры на практике

Написать собственную фикстуру с test.extend и увидеть, как она встраивается в реальный проект, — на практике понятнее, чем в теории. Бесплатный тренажёр Playwright Arena от Quality Academy — 30 задач по архитектуре Playwright. А для разбора структуры автотестов на реальном проекте с ментором — курс «Автотестирование JS/TS + Playwright» в Quality Academy.

-------

Полезные ссылки школы

Сайт Quality Academy:
https://quality-academy.ru/main
Telegram-канал:
https://t.me/quality_academy
YouTube-канал:
https://www.youtube.com/@quality_academy
ВКонтакте:
https://vk.com/quality_academy
Канал отзывов учеников (58+ отзывов):
https://t.me/quality_academy_reviews
Задать вопрос менеджеру:
https://t.me/quality_academy_bot
Тест «Подойдёт ли вам тестирование»:
https://quiz.quality-academy.ru
5000+ вопросов с собесов тестировщика — бот-тренажёр:
https://t.me/quality_academy_interview_bot
3 практические задачи и дорожная карта:
https://t.me/quality_academy_tasks_bot
Бесплатные тренажёры — SQL Arena, Playwright Arena, Python Arena:
SQL Arena · Playwright Arena · Python Arena