如何在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
相关产品推荐
相关产品推荐

