首页/开发/软件测试速查/Playwright 时间控制(Clock)
自动化测试66 条

Playwright 时间控制(Clock)

Clock API 控制页面内时间:clock.install() 冻结初始时间,setFixedTime/fastForward 推进时间,用于验证倒计时、免打扰时段与缓存过期等时间相关逻辑。

软件测试速查开发更新于 2026-10-13

Playwright Clock 是什么

Playwright 的 Clock API(page.clock)把浏览器里的时间变成可控对象:安装后,Date、定时器与 performance 计时都遵循你设定的时间,可以用 fastForward 快进、runFor 推进定时器、pauseAt 在指定时刻暂停、setFixedTime 固定当前时间。需要等结算计时、缓存过期、轮询任务等时间相关行为时,不用真等,也不依赖改系统时钟。

基本信息

安装方式page.clock.install() 或 install 时传入初始时间
推进时间fastForward 快进到目标时间,runFor 推进固定时长并触发定时器
固定时间setFixedTime 让 Date.now 恒定,用于验证时间展示类逻辑
冻结控制pauseAt 在指定时刻暂停,resume 继续
作用范围作用于页面里的时间与定时器,不改变测试进程的时钟
适用场景倒计时、超时重试、缓存过期、限时活动、防抖与节流

Playwright 用例示例

Playwright 用例示例
const { test, expect } = require('@playwright/test');

test('缓存过期后应重新拉取', async ({ page }) => {
  await page.clock.install({ time: new Date('2026-01-01T09:00:00') });
  await page.goto('/dashboard');          // 首次加载,命中缓存
  await page.clock.fastForward('00:31');  // 跳过 31 分钟,跨过缓存过期点
  await expect(page.getByText('已刷新')).toBeVisible();  // 等过期后的刷新行为
});
# 注意:须在页面加载或定时器启动前 install,否则不影响已运行的定时器

典型使用场景

  • 限时活动:验证倒计时结束前后的按钮状态与文案切换。
  • 超时逻辑:把等待时间快进到阈值之外,验证重试或降级行为。
  • 定时任务:验证页面内轮询、心跳、自动保存的触发节奏。
  • 时间展示:用固定时间断言日期格式化与相对时间文案。
  • 稳定性调试:冻结时间排除时间漂移带来的偶发失败。
安装时机很关键:定时器已经启动后再装时钟,已排队的任务不在控制范围内。
服务端时间不受影响:接口返回的时间戳仍按服务器走,端上时间与后端时间要分别断言。
注意版本差异:Clock 是较新版本引入的 API,老版本需升级 Playwright 后使用。

易错点

  • 安装太晚:页面脚本已注册定时器,快进后行为不符预期,用例误判。
  • 把时钟当万能:依赖服务端时间的功能只改端上时钟,断言自然对不上。
  • fastForward 幅度不当:跨过多个定时周期导致难以对照预期结果。
  • 忽略时区:固定时间要写清时区,跨时区运行时断言文案漂移。
  • 用例之间不清理:时钟状态残留污染后续用例,问题难排查。

数据来源与参考

  • Playwright 官方文档:Clock(playwright.dev)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌