Cypress点击按钮触发10次请求,cy.wait().should仅匹配最后一次如何解决?
Cypress多次同别名请求捕获解决方案
问题原因
cy.wait('@别名')单次调用仅会匹配1次对应拦截规则的请求,你仅调用了1次wait,自然仅能捕获到1次请求,剩余9次未被消费所以不会触发断言。
修复方案
1. 调整拦截配置
先移除拦截后多余的硬等待,避免时序异常:
cy.intercept('POST', 'http://localhost:9001/api/myApp/someURL/input*', (req) => { req.reply({ fixture: `input/orInput` }); }).as('queryGridInput');
2. 调整断言逻辑
方案A:逐个校验每次请求
如果需要针对每次请求单独做断言,循环调用10次wait即可:
// 按实际预期调整,10次请求参数一致可以直接用固定预期值,不一致就传入预期值数组 Cypress._.times(10, (index) => { cy.wait('@queryGridInput').should(xhr => { cy.checkRequestBody(xhr.request.body, expectedRequestBodyList[index]); }); })
方案B:批量校验所有请求
如果需要统一校验请求次数或者批量处理所有请求参数,先等所有请求完成后拿全部拦截实例处理:
// 先等待所有10次请求完成 Cypress._.times(10, () => cy.wait('@queryGridInput', {timeout: 15000})); // 取所有匹配的拦截结果 cy.get('@queryGridInput.all').then(interceptions => { // 校验请求总次数 expect(interceptions.length).to.eq(10); // 批量校验请求参数 interceptions.forEach((item, index) => { cy.checkRequestBody(item.request.body, expectedRequestBodyList[index]); }) })
注意事项
- 拦截配置必须放在按钮点击操作之前,保证所有请求发起时拦截已生效
- 如果请求响应耗时较长,可以给
cy.wait增加timeout参数调整超时阈值,避免默认超时导致用例失败
内容的提问来源于stack exchange,提问作者user3847870
相关产品推荐
相关产品推荐

