You need to enable JavaScript to run this app. Cypress使用intercept在同一测试用例中调用同API带不同payload不生效问题
优惠活动
大模型
产品
解决方案
定价
更多

Cypress使用intercept在同一测试用例中调用同API带不同payload不生效问题

相同API多次调用不同payload的Cypress拦截解决方案

故障原因

你同时声明了两个匹配规则完全一致(PATCH方法、**/user/1路径)的cy.intercept拦截器,Cypress对同匹配规则的拦截器默认以最后声明的为准,因此第一次点击触发的请求也被匹配到了action2,第二次点击时没有剩余的action2匹配项,自然等待失败。

解决方案

方案1:每次触发请求前单独声明对应拦截器

和你原有写法逻辑对齐,改动最小:

it('call same api with different payload',()=>{
  cy.visit('../app/intercept-identical.html');

  // 第一次操作前声明对应拦截
  cy.intercept('PATCH', `**/user/1`,{name:'thava'} ).as("action1")
  cy.get("#update-action1").click();
  cy.wait('@action1');

  // 第二次操作前声明对应拦截,自动覆盖之前同规则的拦截配置
  cy.intercept('PATCH', `**/user/1`,{name:'prakash'} ).as("action2")
  cy.get("#update-action2").click();
  cy.wait('@action2');
})

方案2:单个拦截器动态匹配请求返回响应

如果两次请求的payload有可区分的字段,你可以直接在一个拦截器内做逻辑判断,代码更简洁:

it('call same api with different payload',()=>{
  cy.intercept('PATCH', `**/user/1`, (req) => {
    // 此处可替换为你实际业务中区分两次请求的payload字段判断逻辑
    if(req.body.type === 'update1') {
      req.reply({name:'thava'})
    } else if(req.body.type === 'update2') {
      req.reply({name:'prakash'})
    }
  }).as("userUpdate")

  cy.visit('../app/intercept-identical.html');

  cy.get("#update-action1").click();
  cy.wait('@userUpdate');

  cy.get("#update-action2").click();
  cy.wait('@userUpdate');
})

核心规则提示

  • 同匹配规则的cy.intercept默认后声明的会覆盖先声明的,不要提前批量声明多个同规则拦截器
  • 如果需要等待同一个接口的N次请求,可以直接按顺序调用N次cy.wait('@拦截别名')即可

内容的提问来源于stack exchange,提问作者Thavaprakash Swaminathan

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.09 10:12:00