Playwright 如何调整超时设置

Playwright 超时分四层:测试整体 30s、断言 5s、动作无默认(跟随测试)、导航无独立默认上限(受测试总超时约束)。playwright.config 里 timeout/expect.timeout/actionTimeout/navigationTimeout 分别调整,附单层覆盖写法。

最佳实践
测试检测与质量验证插画

一句话回答:在 playwright.config.ts 里分层调整:timeout(单个测试总时长,默认 30 秒)、expect.timeout(断言等待,默认 5 秒)、use.actionTimeout(点击等单动作)、use.navigationTimeout(页面导航)。单个测试/单条断言也可以就地覆盖:test.setTimeout(120000)、expect(locator).toBeVisible({ timeout: 10000 })。

四层超时与默认值

层 配置项 默认 管什么
测试整体 timeout 30s 一个 test 从头到尾
断言 expect.timeout 5s toBeVisible 等重试上限
动作 use.actionTimeout 0(跟随测试超时) click/fill 单次操作
导航 use.navigationTimeout 0(跟随测试超时) goto/waitForURL

全局配置

import { defineConfig } from '@playwright/test';

export default defineConfig({
  timeout: 60_000,                    // 每个测试 60 秒
  expect: { timeout: 10_000 },        // 断言最多等 10 秒
  use: {
    actionTimeout: 15_000,            // 单次点击/填充
    navigationTimeout: 30_000,        // 页面导航
  },
});

局部覆盖

test('大文件上传', async ({ page }) => {
  test.setTimeout(180_000);           // 只给这个测试放宽到 3 分钟
  // ...
  await expect(page.locator('#done')).toBeVisible({ timeout: 60_000 });
});

// 慢测试分组
test.describe('报表', () => {
  test.describe.configure({ timeout: 300_000 });
});

调超时前先想一秒

"Timeout of 30000ms exceeded" 有两种病因:

  1. 真慢:环境差、大数据量、冷启动——调大超时合理
  2. 假慢(更常见):选择器写错等一个永远不存在的元素、页面卡在错误状态——调大超时只是把失败从 30 秒拖成 120 秒

排障顺序:先看 Trace(npx playwright show-trace)确认卡在哪一步,再决定调不调。

常见问题(FAQ)

Q:CI 上比本地慢一倍,统一放大超时?

A:配置里用环境变量区分:timeout: process.env.CI ? 120_000 : 60_000。需要重试时配置 retries,并保留 Trace 排查 flaky;重试不能替代定位根因。

Q:actionTimeout 设了为什么没用?

A:动作超时的默认 0 表示"不设独立上限,受测试总超时约束"。设了但测试总超时先到,照样失败——大 actionTimeout 要配合更大的测试 timeout。

Q:全局 beforeAll 超时算谁的?

A:hook 的超时单独算:test.beforeAll 默认也受测试 timeout 影响,可在 hook 内 test.setTimeout() 调整该 hook 的超时;Playwright Test 没有 hooksTimeout 配置项。


参考资料

本文依据官方资料核对,未进行现场运行测试;代码与配置示例需结合实际版本、权限和环境验证。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台