← 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