You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 06:18:03