← Back to library
Playwrightfixturesintermediatev1.20+
beforeEach and afterEach hooks
Run setup and teardown logic before and after every test in a describe block.
1import { test, expect } from '@playwright/test';
2
3test.describe('User settings', () => {
4 test.beforeEach(async ({ page }) => {
5 // Runs before every test — log in once per test
6 await page.goto('/login');
7 await page.getByLabel('Email').fill('user@test.com');
8 await page.getByLabel('Password').fill('secret');
9 await page.getByRole('button', { name: 'Sign in' }).click();
10 await page.waitForURL('/dashboard');
11 });
12
13 test.afterEach(async ({ page }) => {
14 // Runs after every test — clean up state that could leak
15 await page.evaluate(() => window.localStorage.clear());
16 });
17
18 test('can reach the settings page', async ({ page }) => {
19 await page.goto('/settings');
20 await expect(page.getByRole('heading', { name: 'Settings' })).toBeVisible();
21 });
22
23 test('can update display name', async ({ page }) => {
24 await page.goto('/settings');
25 await page.getByLabel('Display name').fill('New Name');
26 await page.getByRole('button', { name: 'Save' }).click();
27 await expect(page.getByText('Saved!')).toBeVisible();
28 });
29});#beforeEach#afterEach#hooks#setup#teardown