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

Cypress中3个请求的intercept与wait仅单个生效其余失败的问题咨询

核心问题原因
  • cy.intercept()的生效有严格时序要求:必须在目标网络请求被浏览器实际触发之前完成注册,后续对应的cy.wait()才能正常捕获请求。
  • 你当前的代码存在典型的时序错位:先注册第一个Availability接口的拦截、等第一个请求返回后,才继续注册第二个GetPrice、第三个Member/Find接口的拦截。但实际前端业务执行时,触发操作后会在极短时间内连续发出三个接口请求,等Cypress脚本逐行执行到注册第二、第三个拦截的代码时,那两个请求早就已经完成发送甚至返回,拦截器根本没有机会挂载捕获,自然会导致wait超时失败。
  • 常见叠加踩坑点:通配符匹配的路径重叠。比如你写的**/api/Availability匹配规则,会同时命中同前缀的/api/Availability/GetPrice请求,导致请求被错误的拦截别名捕获,剩下两个拦截永远等不到对应请求,最终表现为“只有一个wait能正常生效”。
分步排查与解决方法
  • 调整拦截注册时序:一次性提前注册所有需要监听的拦截规则,再执行业务触发操作,最后再逐个执行wait校验,正确写法示例:
    // 第一步:请求发出前,先把所有拦截规则挂载完成,保证拦截器提前生效
    cy.intercept('POST', '**/api/Availability').as('availabilecheck')
    cy.intercept('POST', '**/api/Availability/GetPrice').as('getpricecheck')
    cy.intercept('POST', '**/api/Member/Find').as('memberresponse')
    
    // 第二步:再执行触发三个接口的业务操作(比如点击查询按钮、进入对应业务页面)
    cy.get('.btn-search').click()
    
    // 第三步:逐行等待每个捕获到的请求,完成状态校验
    cy.wait('@availabilecheck').its('response.statusCode').should('eq', 200)
    cy.wait('@getpricecheck').its('response.statusCode').should('eq', 200)
    cy.wait('@memberresponse')
    
  • 核对拦截路径的匹配精度:打开Cypress测试运行时的Network面板,对照实际触发的接口完整路径调整匹配规则,避免路径重叠导致的串匹配。比如可以把Availability的拦截规则调整为更精确的匹配条件,避免误捕获同前缀的子接口请求。
  • 如果三个接口是前端并发触发、返回顺序不固定,就不要逐行单独等待,改成一次性等待多个请求完成,避免顺序错乱导致的超时:
    // 提前注册好所有拦截、触发业务操作后,一次性等待所有请求被捕获
    cy.wait(['@availabilecheck', '@getpricecheck', '@memberresponse']).then((interceptions) => {
      // 遍历校验每个捕获到的请求返回状态
      interceptions.forEach((item) => {
        expect(item.response.statusCode).to.eq(200)
      })
    })
    
  • 如果请求是在页面路由跳转过程中触发的,一定要在跳转动作执行前就完成所有拦截的注册,不要等跳转完成后再挂载拦截,否则导航阶段发出的请求会直接绕过拦截。

内容的提问来源于stack exchange,提问作者Tester Unknown

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 22:06:04