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

使用Cypress拦截请求记录网络失败后报错的解决方法

解决Cypress拦截网络请求后测试结束报错的问题

问题原因

直接将完整的request和response对象推入networkFails数组会触发报错,因为这两个对象内部存在循环引用的属性(比如response与request互相引用),当Cypress在测试结束时尝试序列化这些对象进行后续处理,就会出现循环引用的序列化错误。

解决方法

不要存储完整的request和response对象,而是提取你需要的关键信息(如请求URL、状态码、请求方法等)存入数组,从根源避免循环引用问题。

修改后的代码示例

// 在测试文件顶部或beforeEach中声明数组,确保作用域正确
let networkFails = [];

cy.intercept('*', (request) => {
  request.continue(response => {
    if (response.statusMessage !== "OK") {
      // 提取关键信息存入数组,而非完整对象
      networkFails.push({
        request: {
          url: request.url,
          method: request.method,
          headers: { ...request.headers } // 浅拷贝避免引用问题
        },
        response: {
          statusCode: response.statusCode,
          statusMessage: response.statusMessage,
          body: response.body ? { ...response.body } : null
        }
      });
    }
  });
});

可选:使用Cypress环境变量存储(规避作用域问题)

如果networkFails的作用域导致数据丢失或异常,可改用Cypress环境变量存储:

beforeEach(() => {
  // 测试前初始化空数组
  Cypress.env('networkFails', []);
});

cy.intercept('*', (request) => {
  request.continue(response => {
    if (response.statusMessage !== "OK") {
      const currentFails = Cypress.env('networkFails');
      currentFails.push({
        request: { url: request.url, method: request.method },
        response: { statusCode: response.statusCode, statusMessage: response.statusMessage }
      });
      Cypress.env('networkFails', currentFails);
    }
  });
});

// 测试结束后可取出数据处理,比如打印或写入文件
after(() => {
  console.log('网络失败请求记录:', Cypress.env('networkFails'));
});

内容的提问来源于stack exchange,提问作者Hesham Saleh

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 07:40:22