Cypress写在if条件内的Chai断言早于cy.wait执行问题咨询
问题根因
你遇到的执行顺序问题完全是Cypress的异步队列特性导致的:
- 所有
cy.*开头的Cypress命令都是异步的,执行时只会被加入全局命令队列排队,不会立刻执行 - 你写在
.then()回调中的console.log、expect断言都属于普通同步JS代码,会在当前JS上下文立即执行,不会等待队列中的cy.wait命令运行
这就导致你看到的现象:console.log和断言先跑完,队列里的30秒等待后才执行,完全不符合预期的执行顺序。
修复方案
方案1:将断言放入cy.wait的回调中
把断言逻辑放到cy.wait()的.then()回调内,即可保证断言在30秒等待结束后才执行:
cy.getReportJson('84b636f4-c8f0-4aa4-bdeb-15abf811d432',user).then(report=> { if(services.request_criminal_record_check.include){ console.log('inside if') cy.wait(30000).then(() => { expect(report.report_summary.rcmp_result.status).equal(data.expected_result.rcmp_result.status) expect(report.report_summary.rcmp_result.overall_score).equal(data.expected_result.rcmp_result.overall_score) expect(report.report_summary.rcmp_result.result).equal(data.expected_result.rcmp_result.result) }) } })
方案2(更推荐):用轮询替代硬等待
固定30秒硬等待的稳定性差,服务器性能好的时候会浪费时间,服务器性能差的时候30秒不够仍会断言失败。可以实现简单的轮询逻辑,主动检查报告生成状态,生成完成后立刻执行断言:
// 轮询获取报告,最多重试30次,每次间隔1秒,总最大等待时长30秒 function pollReport(reportId, user, retry = 0) { return cy.getReportJson(reportId, user).then(report => { // 自定义报告生成完成的判断条件,可根据实际业务调整 const isReady = report.report_summary?.rcmp_result?.status !== 'pending' if (isReady || retry >= 30) return report cy.wait(1000) return pollReport(reportId, user, retry + 1) }) } // 调用轮询方法获取最终生成完成的报告再做断言 pollReport('84b636f4-c8f0-4aa4-bdeb-15abf811d432', user).then(report => { if(services.request_criminal_record_check.include){ expect(report.report_summary.rcmp_result.status).equal(data.expected_result.rcmp_result.status) expect(report.report_summary.rcmp_result.overall_score).equal(data.expected_result.rcmp_result.overall_score) expect(report.report_summary.rcmp_result.result).equal(data.expected_result.rcmp_result.result) } })
内容的提问来源于stack exchange,提问作者MeBhiAutomationTester
相关产品推荐
相关产品推荐

