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

如何在Protractor Cucumber测试中获取浏览器及系统详情

解决Protractor Cucumber报告中添加浏览器与操作系统信息的方案

我之前在使用Protractor Cucumber框架生成报告时,也碰到过这个头疼的问题——想在报告里展示浏览器和操作系统的详细信息,试了好几种方法都没搞定。后来摸索出一套可行的方案,核心是在Cucumber的生命周期钩子中正确捕获Protractor的浏览器能力,再把这些信息传递给protractor-multiple-cucumber-html-reporter-plugin的元数据配置。下面一步步来:

1. 从Protractor Browser Capabilities提取核心信息

Protractor启动浏览器后,browser.getCapabilities()会返回一个Promise,包含浏览器和运行环境的关键信息。我们需要在Cucumber的Before钩子中异步获取这些数据,因为此时浏览器实例已经初始化完成。

注意:不同浏览器驱动(比如ChromeDriver、GeckoDriver)返回的capability键可能略有差异,所以要做兼容处理:

// 在cucumber的hooks文件中(比如support/hooks.js)
const { Before } = require('cucumber');

// 全局存储元数据(单线程测试可用,多线程建议用World对象)
let testMetadata = {};

Before(async function() {
  const capabilities = await browser.getCapabilities();
  
  // 捕获浏览器名称和版本
  testMetadata.browser = {
    name: capabilities.get('browserName'),
    version: capabilities.get('browserVersion') || capabilities.get('version') // 兼容旧版驱动
  };
  
  // 捕获操作系统信息
  testMetadata.platform = {
    name: capabilities.get('platformName') || capabilities.get('platform'), // 兼容不同Selenium版本
    version: capabilities.get('platformVersion')
  };
});

2. 将元数据传递给报告插件

在Protractor配置文件(protractor.conf.js)中,配置报告插件时,通过metadata选项传入我们收集到的信息。如果是并行测试,建议用Cucumber的World对象存储元数据(避免线程冲突),具体如下:

并行测试的World对象方案:

首先自定义World类来存储每个场景的元数据:

// support/world.js
const { setWorldConstructor } = require('cucumber');

class TestWorld {
  constructor() {
    this.metadata = {};
  }
}

setWorldConstructor(TestWorld);

然后在hooks中把数据存入当前场景的World对象:

// support/hooks.js
Before(async function() {
  const capabilities = await browser.getCapabilities();
  this.metadata.browser = {
    name: capabilities.get('browserName'),
    version: capabilities.get('browserVersion') || capabilities.get('version')
  };
  this.metadata.platform = {
    name: capabilities.get('platformName') || capabilities.get('platform'),
    version: capabilities.get('platformVersion')
  };
});

最后在Protractor配置中引用场景的元数据:

// protractor.conf.js
exports.config = {
  // 其他Protractor配置...
  plugins: [{
    package: 'protractor-multiple-cucumber-html-reporter-plugin',
    options: {
      // 报告的基础配置(比如输出路径、主题等)
      reportPath: './reports',
      theme: 'bootstrap',
      // 动态获取当前场景的元数据
      metadata: function(scenario) {
        return scenario.metadata;
      }
    }
  }]
};

3. 补充:获取更详细的本地系统信息

如果浏览器capabilities返回的平台信息不够详细(比如只显示windows而非Windows 10),可以结合Node.js的os模块获取本地系统的完整信息:

// 在hooks.js中添加
const os = require('os');

Before(async function() {
  // 原有代码...
  
  // 补充本地系统详情
  this.metadata.osDetails = {
    type: os.type(), // 比如Windows_NT、Linux
    release: os.release(), // 比如10.0.19045
    arch: os.arch() // 比如x64
  };
});

4. 处理远程浏览器/Headless模式的情况

如果是通过Selenium Grid运行远程浏览器,capabilities里的platformName和platformVersion会返回远程节点的操作系统信息;如果需要本地系统信息,就用os模块的内容。Headless模式下,浏览器的capabilities信息和正常模式一致,无需额外处理。

这样配置后,生成的HTML报告的元数据区域就会清晰展示浏览器名称、版本,以及操作系统的详细信息了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:24:32