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

如何在Protractor测试报告中添加自定义日志并解决afterAll报错

问题解决方案

一、解决AfterAll报错 end is not defined

报错原因是你在spec.js中定义的afterAll逻辑多余,会提前触发测试结束流程,导致perfecto上报客户端的内部收尾逻辑还未完成就被销毁,从而触发end is not defined的报错。
直接删除spec.js中如下的afterAll代码段即可解决:

afterAll(function(done){
    process.nextTick(done); 
});

二、实现log4js日志同步展示到chercher测试报告

按照以下步骤配置即可:

  • 第一步:安装对应依赖(已安装可跳过)
npm install chercher-tech-js-protractor-reporter log4js --save-dev
  • 第二步:修改conf.js配置,整合log4js和chercher报告
    首先在conf.js顶部引入依赖并配置log4js(和你现有项目的log4js配置保持一致即可):
var reportingClient;
const log4js = require('log4js');
const ChercherReporter = require('chercher-tech-js-protractor-reporter');
const fs = require('fs');

// 配置log4js
log4js.configure({
  appenders: { 
    appLog: { type: 'file', filename: './logs/app.log' } 
  },
  categories: { 
    default: { appenders: ['appLog'], level: 'info' } 
  }
});
const appLogger = log4js.getLogger('app');

然后在onPrepare钩子中添加chercher报告配置,同时改写日志方法实现双写:

onPrepare: function () {
    // 原有perfecto上报逻辑保持不变
    const Reporting = require('perfecto-reporting');
    reportingClient = new Reporting.Perfecto.PerfectoReportingClient(new Reporting.Perfecto.PerfectoExecutionContext({
        webdriver: browser.driver,
        tags: ['javascript driver']
    }));
    browser.reportingClient = reportingClient;

    var myReporter = {
        specStarted: function (result) {
            reportingClient.testStart(result.fullName);
        },
        specDone: function (result) {
            if (result.status === 'failed') {
                const failure = result.failedExpectations[result.failedExpectations.length - 1];
                reportingClient.testStop({
                    status: Reporting.Constants.results.failed,
                    message: `${failure.message} ${failure.stack}`
                });
            } else {
                reportingClient.testStop({
                    status: Reporting.Constants.results.passed
                });
            }
        }
    }
    jasmine.getEnv().addReporter(myReporter);

    // 新增chercher报告配置
    const chercherReporter = new ChercherReporter({
      reportPath: './reports/chercher',
      reportName: 'AutoTestReport.html',
      showConsoleLogs: true
    });
    jasmine.getEnv().addReporter(chercherReporter);
    global.chercherReporter = chercherReporter;

    // 改写log4js日志方法,输出到文件的同时写入报告
    ['trace','debug','info','warn','error','fatal'].forEach(logLevel => {
      const originalLog = appLogger[logLevel];
      appLogger[logLevel] = function(...logArgs) {
        // 原有日志写入文件逻辑不变
        originalLog.apply(this, logArgs);
        // 新增日志写入报告逻辑
        const logContent = `[${logLevel.toUpperCase()}] ${logArgs.join(' ')}`;
        chercherReporter.addLog(logContent);
      }
    });
    // 把logger挂载到browser对象,方便测试用例中调用
    browser.appLogger = appLogger;
}

如果需要把历史日志文件的全部内容追加到报告末尾,修改onComplete钩子如下:

onComplete: async function () {
    // 原有perfecto报告地址输出逻辑不变
    const url = await reportingClient.getReportUrl();
    console.log(`Report url = ${url}`);

    // 新增读取日志文件追加到报告逻辑
    const logContent = fs.readFileSync('./logs/app.log', 'utf8');
    const reportPath = './reports/chercher/AutoTestReport.html';
    let reportHtml = fs.readFileSync(reportPath, 'utf8');
    reportHtml += `
      <div style="margin: 20px;padding: 15px;border: 1px solid #eee;border-radius: 4px;">
        <h2>全量应用运行日志</h2>
        <pre style="background: #f6f8fa;padding: 10px;border-radius: 4px;white-space: pre-wrap;">${logContent}</pre>
      </div>
    `;
    fs.writeFileSync(reportPath, reportHtml);
}
  • 第三步:在测试用例中打日志
    在spec.js需要输出日志的位置直接调用挂载的logger方法即可,日志会同时写入log4js文件和chercher报告:
browser.appLogger.info('当前执行步骤:跳转到谷歌首页');
browser.appLogger.error('元素定位失败:#tsbbbsdasd');

额外注意事项

你当前conf.js中的specs配置路径是./tests/SignupAutomation_spec.js,如果你的测试用例文件就是本次贴出的spec.js,需要把路径修改为实际的文件路径,否则会出现找不到测试用例的问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.21 23:45:04