Фикстуры Playwright
Фикстуры — это готовые объекты, которые Playwright подаёт в тест: страница, контекст, браузер.
Фикстура (fixture) — это объект, который раннер создаёт и подготавливает для теста, а после теста убирает за собой. Вы получаете её, просто указав имя в аргументах.
Как фикстуры попадают в тест
Помните async ({ page }) => {...}? Здесь page — фикстура. Вы перечисляете нужные фикстуры в фигурных скобках, и Playwright сам их создаёт перед тестом и уничтожает после. Это избавляет от ручного запуска и закрытия браузера, а заодно гарантирует, что за собой всё будет убрано даже при падении теста.
test('пример с несколькими фикстурами', async ({ page, context, browser }) => {
// page — одна вкладка
// context — изолированная сессия (как окно в режиме инкогнито)
// browser — сам экземпляр браузера
});Три встроенные фикстуры
| Фикстура | Что это | Изоляция |
page | вкладка браузера | новая на каждый тест |
context | сессия: cookie, storage, права | новый на каждый тест |
browser | экземпляр браузера | общий на воркер |
Иерархия такая: один browser содержит несколько context (изолированных сессий), а каждый context — несколько page (вкладок). Для большинства тестов хватает page.
Зачем нужен context
Context — это как отдельное окно в режиме инкогнито: свои cookie, своё хранилище, ничего не разделяется с другими. Это основа изоляции тестов. Если нужно проверить взаимодействие двух пользователей (например, чат), создают два контекста — каждый со своей сессией.
test('два пользователя в чате', async ({ browser }) => {
const aliceContext = await browser.newContext();
const bobContext = await browser.newContext();
const alice = await aliceContext.newPage();
const bob = await bobContext.newPage();
await alice.goto('/chat');
await bob.goto('/chat');
// ... Алиса пишет, Боб видит сообщение
});Свои фикстуры
Можно создавать собственные фикстуры и переиспользовать их во всех тестах. Например, фикстуру «уже залогиненная страница», чтобы не повторять вход. Расширяют базовый test через test.extend.
import { test as base } from '@playwright/test';
export const test = base.extend({
loggedInPage: async ({ page }, use) => {
await page.goto('/login');
await page.getByLabel('Email').fill('[email protected]');
await page.getByLabel('Пароль').fill('secret');
await page.getByRole('button', { name: 'Войти' }).click();
await use(page); // отдаём подготовленную страницу тесту
},
});Теперь любой тест может попросить loggedInPage и сразу оказаться внутри личного кабинета:
test('видит заказы', async ({ loggedInPage }) => {
await loggedInPage.goto('/orders');
await expect(loggedInPage.getByRole('heading', { name: 'Мои заказы' })).toBeVisible();
});Часть до use() — это подготовка, после — очистка. Это мощный механизм переиспользования: вместо хуков, разбросанных по файлам, у вас один источник правды, который любой тест подключает по имени. Этот приём мы разовьём в уроке про авторизацию.
Итог
- Фикстура — готовый объект, который раннер создаёт перед тестом и убирает после.
- Встроенные:
page(вкладка),context(сессия),browser(браузер). - Иерархия: browser → context → page; для большинства тестов хватает
page. - Свои фикстуры через
test.extendпереиспользуют подготовку (например, авторизацию).