Skip to main content
Version: 1.18

Timeouts

Overview

Playwright Test has multiple configurable timeouts for various tasks.

TimeoutDefaultDescription
Test timeout30000 msTimeout for each test, includes test, hooks and fixtures:
Set default
config = { timeout: 60000 }
Override
test.setTimeout(120000)
Expect timeout5000 msTimeout for each assertion:
Set default
config = { expect: { timeout: 10000 } }
Override
expect(locator).toBeVisible({ timeout: 10000 })
Action timeoutno timeoutTimeout for each action:
Set default
config = { use: { actionTimeout: 10000 } }
Override
locator.click({ timeout: 10000 })
Navigation timeoutno timeoutTimeout for each navigation action:
Set default
config = { use: { navigationTimeout: 30000 } }
Override
page.goto('/', { timeout: 30000 })
Global timeoutno timeoutGlobal timeout for the whole test run:
Set in config
config = { globalTimeout: 60*60*1000 }

Test timeout

Playwright Test enforces a timeout for each test, 30 seconds by default. Time spent by the test function, fixtures, beforeEach and afterEach hooks is included in the test timeout.

Timed out test produces the following error:

example.spec.ts:3:1 โ€บ basic test ===========================

Timeout of 30000ms exceeded.

The same test timeout also applies to beforeAll and afterAll hooks.

Set test timeout in the config

// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';

const config: PlaywrightTestConfig = {
timeout: 5 * 60 * 1000,
};
export default config;

API reference: testConfig.timeout.

Set timeout for a single test

import { test, expect } from '@playwright/test';

test('slow test', async ({ page }) => {
test.slow(); // Easy way to triple the default timeout
// ...
});

test('very slow test', async ({ page }) => {
test.setTimeout(120000);
// ...
});

API reference: test.setTimeout(timeout) and test.slow([condition, description]).

Change timeout from a hook or fixture

import { test, expect } from '@playwright/test';

test.beforeEach(async ({ page }, testInfo) => {
// Extend timeout for all tests running this hook by 30 seconds.
testInfo.setTimeout(testInfo.timeout + 30000);
});

API reference: testInfo.setTimeout(timeout).

Expect timeout

Web-first assertions like expect(locator).toHaveText() have a separate timeout, 5 seconds by default. Assertion timeout is unrelated to the test timeout. It produces the following error:

example.spec.ts:3:1 โ€บ basic test ===========================

Error: expect(received).toHaveText(expected)

Expected string: "my text"
Received string: ""
Call log:
- expect.toHaveText with timeout 5000ms
- waiting for selector "button"

Set expect timeout in the config

// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';

const config: PlaywrightTestConfig = {
expect: {
timeout: 10 * 1000,
},
};
export default config;

API reference: testConfig.expect.

Set timeout for a single assertion

import { test, expect } from '@playwright/test';

test('basic test', async ({ page }) => {
await expect(page.locator('button')).toHaveText('Sign in', { timeout: 10000 });
});

Action and navigation timeouts

Test usually performs some actions by calling Playwright APIs, for example locator.click(). These actions do not have a timeout by default, but you can set one. Action that timed out produces the following error:

example.spec.ts:3:1 โ€บ basic test ===========================

locator.click: Timeout 1000ms exceeded.
=========================== logs ===========================
waiting for selector "button"
============================================================

Playwright also allows to set a separate timeout for navigation actions like page.goto() because loading a page is usually slower.

Set action and navigation timeouts in the config

// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';

const config: PlaywrightTestConfig = {
use: {
actionTimeout: 10 * 1000,
navigationTimeout: 30 * 1000,
},
};
export default config;

API reference: testOptions.actionTimeout and testOptions.navigationTimeout.

Set timeout for a single action

import { test, expect } from '@playwright/test';

test('basic test', async ({ page }) => {
await page.goto('https://playwright.dev', { timeout: 30000 });
await page.locator('text=Get Started').click({ timeout: 10000 });
});

Global timeout

Playwright Test supports a timeout for the whole test run. This prevents excess resource usage when everything went wrong. There is no default global timeout, but you can set a reasonable one in the config, for example one hour. Global timeout produces the following error:

Running 1000 tests using 10 workers

514 skipped
486 passed
Timed out waiting 3600s for the entire test run

You can set global timeout in the config.

// playwright.config.ts
import { PlaywrightTestConfig } from '@playwright/test';

const config: PlaywrightTestConfig = {
globalTimeout: 60 * 60 * 1000,
};
export default config;

API reference: testConfig.globalTimeout.