Dayjs未读取当前系统时间:Cypress测试中始终返回固定旧时间
问题根因
- 你把
dayjs()获取时间的逻辑放在了Cypress命令链的外层,属于同步执行代码:Cypress在运行测试用例时,会先执行完所有同步代码再按顺序执行链式异步命令,你声明presentDateTime的时机远早于实际执行断言的时机,值早就被固定。 - 你写的时间格式串存在错误:
HH:MM:ss里大写MM是月份占位符,分钟的正确占位符是小写mm,这会导致你输出的“分钟”位实际是当前月份的值,进一步加剧时间显示异常。 - 也有可能你的测试代码里全局调用了
cy.clock()锁定了测试时间,导致所有客户端时间获取逻辑都返回锁定的固定值。
修复方案
第一步:修正时间格式串
把DD MMM YYYY HH:MM:ss改成DD MMM YYYY HH:mm:ss,确保分钟位正常输出。
第二步:把时间获取逻辑放到异步回调中
调整代码顺序,确保执行断言的前一刻才实时获取当前时间:
cy.spinner().should('not.exist'); engreenPo.firstNameLastName.then((text1) => { // 执行断言前再实时获取时间,避免预计算导致值固定 const presentDateTime = dayjs().format('DD MMM YYYY HH:mm:ss'); cy.log(presentDateTime); engreenPo.dynamicPushHeader.should('contain', `${presentDateTime} by ${text1}`); });
第三步:排查全局时间锁定配置
如果修改后时间仍然固定,检查你的测试用例、support/e2e.js等全局配置文件是否有调用cy.clock()锁定时间,如有需要先恢复时间:
// 放在用例最开头恢复系统时间 cy.clock().then(clock => clock.restore());
特殊场景适配
如果你要匹配的页面时间是UTC时区的,需要把dayjs的输出转成UTC格式:
const presentDateTime = dayjs().utc().format('DD MMM YYYY HH:mm:ss');
内容的提问来源于stack exchange,提问作者Hamza
相关产品推荐
相关产品推荐

