Фикстуры в Playwright — механизм подготовки окружения для теста: всё, что нужно тесту до его запуска (открытая страница, авторизованный пользователь, тестовые данные), и что нужно корректно убрать после. Это одна из тем, которая отличает уверенного новичка от того, кто просто скопировал синтаксис из документации.
Встроенная фикстура page
Самая частая фикстура, с которой сталкивается любой, кто пишет тесты на Playwright, — page, объект браузерной страницы:
test('открывается главная страница', async ({ page }) => {
await page.goto('/');
await expect(page).toHaveTitle(/Quality Academy/);
});
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 };
// 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 вместе, только оформленное как переиспользуемый компонент, а не привязанное к конкретному файлу тестов.
Попробуйте автотесты бесплатно
Playwright Arena — 30 задач от основ JavaScript до первых тестов на Playwright. Без оплаты, без карты и без ограничения попыток.
Открыть Playwright ArenaИспользование собственной фикстуры
import { test, expect } from './fixtures';
test('видно имя пользователя в личном кабинете', async ({ authenticatedPage }) => {
await expect(authenticatedPage.getByText('Анна')).toBeVisible();
});
test('видно имя пользователя в личном кабинете', async ({ authenticatedPage }) => {
await expect(authenticatedPage.getByText('Анна')).toBeVisible();
});
Тест получает уже авторизованную страницу через authenticatedPage — код авторизации написан один раз в файле фикстур, а не повторяется в каждом тесте, которому нужен залогиненный пользователь.
Фикстуры против beforeEach: в чём разница
beforeEach выполняется перед каждым тестом в конкретном файле или блоке describe безусловно, для всех тестов сразу. Фикстуры — более гибкий и переиспользуемый механизм: одну и ту же фикстуру можно подключать в разных файлах тестов, и Playwright создаёт фикстуру только тогда, когда тест реально её запрашивает через деструктуризацию — если тест не указал authenticatedPage в параметрах, код фикстуры вообще не выполнится.
Частые вопросы про фикстуры в Playwright
Чем фикстура отличается от beforeEach? beforeEach привязан к конкретному файлу или блоку describe и выполняется для всех тестов в нём безусловно. Фикстуры — переиспользуемый механизм, который можно подключать в разных файлах, и который создаётся только тогда, когда тест реально её запрашивает. Фикстуры часто используют вместе с паттерном Page Object, подробнее — в статье «Page Object Model простыми словами: зачем нужен паттерн».
Что делает функция use() внутри фикстуры? Она передаёт подготовленное значение (страницу, данные, объект) в сам тест. Код до use() — подготовка, код после — это код очистки (teardown), который выполнится после завершения теста.
Обязательно ли писать собственные фикстуры, или хватит встроенных? Для простых тестов хватает встроенной page. Собственные фикстуры становятся полезны, когда несколько тестов нуждаются в одинаковой, более сложной подготовке — например, авторизации, наполнении тестовыми данными или настройке моков.
Можно ли использовать несколько фикстур в одном тесте? Да, через деструктуризацию: test('...', async ({ authenticatedPage, apiContext }) => {...}) — тест получает сразу несколько подготовленных значений, каждое из которых описано отдельной фикстурой.
Что делает функция use() внутри фикстуры? Она передаёт подготовленное значение (страницу, данные, объект) в сам тест. Код до use() — подготовка, код после — это код очистки (teardown), который выполнится после завершения теста.
Обязательно ли писать собственные фикстуры, или хватит встроенных? Для простых тестов хватает встроенной page. Собственные фикстуры становятся полезны, когда несколько тестов нуждаются в одинаковой, более сложной подготовке — например, авторизации, наполнении тестовыми данными или настройке моков.
Можно ли использовать несколько фикстур в одном тесте? Да, через деструктуризацию: test('...', async ({ authenticatedPage, apiContext }) => {...}) — тест получает сразу несколько подготовленных значений, каждое из которых описано отдельной фикстурой.
Закрепить фикстуры на практике
Написать собственную фикстуру с test.extend и увидеть, как она встраивается в реальный проект, — на практике понятнее, чем в теории. Бесплатный тренажёр Playwright Arena от Quality Academy — 30 задач: основы JavaScript, устройство Playwright-проекта и первые тесты. А для разбора структуры автотестов на реальном проекте с ментором — курс «Автотестирование JS/TS + Playwright» в Quality Academy.
Курс «Автотестирование на JS/TS + Playwright»
Для ручных тестировщиков: 4 месяца, персональный ментор, код-ревью каждого задания и свой проект автотестов в портфолио. От 58 000 ₽.
Узнать о курсеПопробуйте автотесты бесплатно
Playwright Arena — 30 задач от основ JavaScript до первых тестов на Playwright. Без оплаты, без карты и без ограничения попыток.
Открыть Playwright ArenaQuality Academy — школа тестировщиков
