跳至主要内容

超时

简介

Playwright Test 具有多个可配置的超时,用于各种任务。

超时默认值描述
测试超时30000 毫秒每个测试的超时,包括测试、钩子和夹具
设置默认值
config = { timeout: 60000 }
覆盖
test.setTimeout(120000)
预期超时5000 毫秒每个断言的超时
设置默认值
config = { expect: { timeout: 10000 } }
覆盖
expect(locator).toBeVisible({ timeout: 10000 })

测试超时

Playwright Test 对每个测试强制执行超时,默认值为 30 秒。测试函数、夹具、beforeEachafterEach 钩子花费的时间都包含在测试超时中。

超时测试会产生以下错误

example.spec.ts:3:1 › basic test ===========================

Timeout of 30000ms exceeded.

相同的超时值也适用于 beforeAllafterAll 钩子,但它们不与任何测试共享时间。

在配置中设置测试超时

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

export default defineConfig({
timeout: 5 * 60 * 1000,
});

API 参考:testConfig.timeout

为单个测试设置超时

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 参考:test.setTimeout()test.slow()

beforeEach 钩子更改超时

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 参考:testInfo.setTimeout()

更改 beforeAll/afterAll 钩子的超时

beforeAllafterAll 钩子具有单独的超时,默认情况下等于测试超时。您可以通过在钩子内部调用 testInfo.setTimeout() 来分别更改每个钩子的超时。

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

test.beforeAll(async () => {
// Set timeout for this hook.
test.setTimeout(60000);
});

API 参考:testInfo.setTimeout()

预期超时

expect(locator).toHaveText() 这样的 Web 首要断言具有单独的超时,默认值为 5 秒。断言超时与测试超时无关。它会产生以下错误

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 "locator('button')"

在配置中设置预期超时

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

export default defineConfig({
expect: {
timeout: 10 * 1000,
},
});

全局超时

Playwright Test 支持整个测试运行的超时。当所有事情都出错时,这可以防止过度使用资源。没有默认的全局超时,但您可以在配置中设置一个合理的值,例如一个小时。全局超时会产生以下错误

Running 1000 tests using 10 workers

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

您可以在配置中设置全局超时。

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

export default defineConfig({
globalTimeout: 60 * 60 * 1000,
});

API 参考:testConfig.globalTimeout

高级:低级超时

这些是由测试运行程序预先配置的低级超时,您无需更改它们。如果您碰巧是因为测试不稳定而进入此部分,则很可能您应该在其他地方寻找解决方案。

超时默认值描述
操作超时无超时每个操作的超时
设置默认值
config = { use: { actionTimeout: 10000 } }
覆盖
locator.click({ timeout: 10000 })
导航超时无超时每个导航操作的超时
设置默认值
config = { use: { navigationTimeout: 30000 } }
覆盖
page.goto('/', { timeout: 30000 })
全局超时无超时整个测试运行的全局超时
在配置中设置
config = { globalTimeout: 60*60*1000 }
beforeAll/afterAll 超时30000 毫秒钩子的超时
在钩子中设置
test.setTimeout(60000)
夹具超时无超时单个夹具的超时
在夹具中设置
{ scope: 'test', timeout: 30000 }

为单个断言设置超时

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

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

在配置中设置操作和导航超时

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

export default defineConfig({
use: {
actionTimeout: 10 * 1000,
navigationTimeout: 30 * 1000,
},
});

API 参考:testOptions.actionTimeouttestOptions.navigationTimeout

为单个操作设置超时

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

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

夹具超时

默认情况下,夹具 与测试共享超时。但是,对于缓慢的夹具,尤其是 工作程序范围 的夹具,拥有单独的超时很方便。这样,您可以保持整体测试超时较小,并为缓慢的夹具提供更多时间。

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

const test = base.extend<{ slowFixture: string }>({
slowFixture: [async ({}, use) => {
// ... perform a slow operation ...
await use('hello');
}, { timeout: 60000 }]
});

test('example test', async ({ slowFixture }) => {
// ...
});

API 参考:test.extend()