![[Playwright][04]Playwright.config.ts 配置详解:浏览器、超时、重试](http://pic.xiahunao.cn/yaotu/[Playwright][04]Playwright.config.ts 配置详解:浏览器、超时、重试)
[Playwright] playwright.config.ts 配置详解浏览器、超时、重试最近在给我自己的项目补充 Playwright 自动化测试时发现playwright.config.ts里有不少配置。一开始觉得配置文件嘛能跑就行。但实际运行测试时遇到了几个问题为什么一个测试执行了三遍为什么断言明明写错了还要等几秒才报错为什么本地测试失败就结束而 CI 环境还会重新执行这篇结合项目中的真实配置聊聊三个比较实用的功能。一、浏览器配置为什么一个测试会执行三遍我们项目的配置是projects:[{name:chromium,use:{...devices[Desktop Chrome]},},{name:firefox,use:{...devices[Desktop Firefox]},},{name:webkit,use:{...devices[Desktop Safari]},},],这里配置了三个浏览器项目ChromiumChrome、Edge 等浏览器使用的核心引擎。FirefoxFirefox 浏览器使用的引擎。WebKitSafari 使用的浏览器引擎。如果直接运行npx playwrighttestPlaywright 会在三个浏览器项目中分别执行匹配的测试。但日常开发时我通常没必要每次都跑三个浏览器。比如只想检查 Chromiumnpx playwrighttest--projectchromium需要做跨浏览器回归时再运行全部项目。终端展示 Chromium、Firefox、WebKit 三个浏览器项目的测试执行记录这里需要注意WebKit 可以帮助我们发现 Safari 引擎相关的兼容性问题但它不完全等同于在真实 Safari 浏览器中测试。二、超时配置为什么断言失败还要等 5 秒之前写 Bing 搜索测试时我故意把 URL 断言写错awaitexpect(page).toHaveURL(https://www.google.com/);实际页面已经跳转到了 Bing 搜索结果但测试并没有立即失败而是等了大约 5 秒。原因是toHaveURL()属于会自动重试的断言。Playwright 会持续检查 URL直到满足条件或超过等待时间。我们项目没有显式设置超时因此使用 Playwright Test 的默认值配置默认值作用timeout30 秒单个测试的总超时时间expect.timeout5 秒自动重试断言的等待时间如果想在配置文件里明确设置可以这样写exportdefaultdefineConfig({timeout:30000,expect:{timeout:5000,},});也可以只修改某一次断言awaitexpect(page).toHaveURL(Google,{timeout:2000,});这样最多等待 2 秒而不是默认的 5 秒。同一个错误 URL 断言分别设置 5000ms 和 2000ms 后的失败信息这里我觉得最容易混淆的是测试超时和断言超时不是一回事。timeout控制整个测试包括页面操作和断言expect.timeout只控制相应自动重试断言的等待时间。所以遇到测试超时先看是哪一步卡住了不要上来就把所有 timeout 改成 60 秒。三、重试配置为什么本地失败一次CI 却会执行三次这是我们 HPC Dashboard 项目里的实际配置retries:process.env.CI?2:0,workers:process.env.CI?1:undefined,//process.env.CI 读取当前运行环境中的 CI 环境变量//retries 是重试次数workers 是并行执行测试的工作进程数量//条件 ? 条件成立时的值 : 条件不成立时的值process.env.CI 是读取环境变量 CI通常在 GitHub Actions、Jenkins 等持续集成环境中设置含义很简单CI 环境失败后最多重试两次。本地运行失败后不自动重试。CI 环境只使用一个 worker减少并发执行带来的资源竞争。这里的retries: 2不是总共执行两次而是首次执行失败后最多再执行两次也就是最多三次。不需要真的启动 CI我们可以直接通过命令行验证npx playwrighttesttests/demo/bing.spec.ts--projectchromium--retries2运行之前那个故意写错 URL 的测试就能观察到失败后的重试过程。HTML 报告中同一个失败测试的首次执行和 Retry 记录都是三条记录不过重试也不是越多越好。比如 URL 明明写错了重试十次也不会变成正确结果。重试更适合帮助识别偶发性失败Flaky Test例如测试环境偶尔响应慢、页面状态不稳定等情况。如果某个测试总是第一次失败、第二次通过应该进一步排查原因而不是觉得“反正最后绿了就行”。四、总结回头看我们项目的配置其实挺符合日常开发需求浏览器本地先跑 Chromium需要时再做跨浏览器测试。超时区分整个测试的超时和单次断言的等待时间。重试本地失败及时暴露问题CI 环境允许有限次数的重试。playwright.config.ts不需要一开始就写得特别复杂。真正重要的是遇到问题时知道应该检查哪个配置而不是靠不断增加超时和重试次数让测试“看起来通过”。