Fixtures & Hooks
Playwright fixtures extend the test context. Use beforeEach/afterEach for setup and teardown.
Custom fixture
typescript
import { test as base } from '@playwright/test';
import { LoginPage } from './pages/LoginPage';
type Fixtures = { loginPage: LoginPage; authenticatedPage: void };
export const test = base.extend<Fixtures>({
loginPage: async ({ page }, use) => {
await use(new LoginPage(page));
},
authenticatedPage: async ({ page }, use) => {
await page.goto('/login');
await page.getByLabel('Email').fill('alice@example.com');
await page.getByLabel('Password').fill('pass123');
await page.getByRole('button', { name: 'Login' }).click();
await page.waitForURL('**/dashboard');
await use();
},
});Hooks
typescript
test.beforeEach(async ({ page }) => {
await page.goto('/');
});
test.afterEach(async ({ page }, testInfo) => {
if (testInfo.status !== 'passed') {
await page.screenshot({ path: `screenshots/${testInfo.title}.png` });
}
});
test.afterAll(async () => {
// cleanup shared resources
});