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

如何在Cypress中捕获window.console.error日志并提取文本保存为JSON?

解决Cypress获取控制台错误日志并转为JSON的问题

你的问题出在cy.spy的用法错误——它的第三个参数并非回调函数,正确的做法是利用间谍的调用记录属性,或者用cy.stub结合自定义拦截逻辑来收集日志内容。以下是两种可行方案:

方案1:使用cy.spy获取调用记录

通过间谍记录所有console.error的调用参数,后续统一提取并转为JSON:

onBeforeLoad(win) {
  // 创建控制台error的间谍并命名
  cy.spy(win.console, 'error').as('consoleError');
},
// 在测试流程末尾处理日志
after(() => {
  cy.get('@consoleError').then((spy) => {
    // 提取每一次调用的错误消息
    const errorLogs = spy.calls.allArgs().map(args => args[0]);
    // 转为JSON格式
    const errorLogsJson = JSON.stringify(errorLogs);
    // 保存到本地文件(路径可自定义)
    cy.writeFile('cypress/fixtures/console-errors.json', errorLogsJson);
  });
});

方案2:使用cy.stub实时拦截处理

通过callsFake自定义拦截逻辑,实时收集日志同时保留原控制台输出:

onBeforeLoad(win) {
  const errorLogs = [];
  // 拦截console.error,自定义处理逻辑
  cy.stub(win.console, 'error').callsFake((...args) => {
    // 保留原控制台输出(可选,不需要可删除)
    win.console.error.wrappedMethod(...args);
    // 收集错误信息
    errorLogs.push(args[0]);
  });
  // 将日志数组挂载到Cypress全局变量
  Cypress.env('consoleErrorLogs', errorLogs);
},
// 测试结束后导出JSON
after(() => {
  const errorLogs = Cypress.env('consoleErrorLogs');
  const errorLogsJson = JSON.stringify(errorLogs);
  cy.writeFile('cypress/fixtures/console-errors.json', errorLogsJson);
});

注意事项

  • 若错误消息是复杂对象,JSON.stringify会自动序列化;遇到循环引用时,可添加replacer函数处理。
  • 两种方案都不需要使用Cypress断言,纯做日志收集与格式转换。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 15:01:04