5

我正在使用 Nightwatch.js 框架为 SPA 应用程序编写测试用例。这里有一个要求,我们必须监控 HTTP 调用并获得站点的性能结果。因为这可以使用 JMeter 轻松实现。

使用自动化测试工具,我们可以使用 browsermob-proxy 和 selenium 来完成。

是否可以使用Nightwatch.jsbrowsermob-proxy做同样的事情?

同样的步骤是什么。

4

3 回答 3

1

要同时使用 Nightwatchjs 和 browsermob-proxy,请查看此 repo,其中包括有关 browsermob-proxy 的 NodeJS 绑定和以编程方式生成 HAR(HTTP 存档)文件的信息。

如果你只满足于使用 Nightwatchjs,这个 repo测试目录中有以下代码:

  • 自定义命令以获取到目前为止发出的请求
  • 用于检查给定过滤器和查询字符串参数的请求是否存在的自定义断言。

您可能需要重新了解如何将自定义命令和断言添加到您的 Nightwatch 项目中,但在那之后您应该准备好了!

于 2016-04-10T16:53:53.243 回答
0

您可以使用 browsermob-proxy-api,只需下载 browsermob-proxy 服务器,然后通过 npm 命令安装:npm install browsermob-proxy-api --save-dev 在desiredCapabilites 中像这样配置您的守夜:

'test_settings': {
    'default': {
      'launch_url': 'http://localhost:3000',
      'screenshots': {
        'enabled': true, // if you want to keep screenshots
        'path': './screenshots' // save screenshots here
      },
      'globals': {
        'waitForConditionTimeout': 30000 // sometimes internet is slow so wait.
      },
      'desiredCapabilities': { // use Chrome as the default browser for tests
        'browserName': 'chrome',
        'proxy': {
          'proxyType': 'manual',
          'httpProxy': 'localhost:10800'
        },
        'acceptSslCerts': true,
        'javascriptEnabled': true, // turn off to test progressive enhancement

      }
    },

然后从这里下载 index.js: httpsstep_definitions ://github.com/jmangs/node-browsermob-proxy-api如果您使用小黄瓜或describe步骤,则将 示例中的代码添加到您的

于 2017-04-28T14:13:36.230 回答
0

跳舞有点晚。我设法将 browsermob 集成到 nightwatch 中。以下是详细步骤

  1. 下载 browsermob 代理https://bmp.lightbody.net/
  2. 打开您的 cmd 并转到 bin 文件夹,然后使用“browsermob-proxy”启动 browsermob。
  3. 我假设你有基本的守夜人设置。您还需要 mobproxy。从“npm i browsermob-proxy-api”安装它

  4. 在守夜人中创建一个全局挂钩。说“globalmodule.js”并在 nightwatch.json 的 globals_path 中给出这个文件路径

  5. 在 globalmodule 中,按照http://nightwatchjs.org/guide#external-globals中的描述创建全局钩子

  6. 在 beforeEach 钩子中,添加以下代码: //如果您不在公司代理下并且不需要链接到上游代理

    var MobProxy = require('browsermob-proxy-api');
    var proxyObj = new MobProxy({'host': 'localhost', 'port': '8080'});

//假设你在 8080 端口启动了 browsermob。那是在第 2 步。

//如果您在公司代理下工作,您可能需要链接您的请求。这需要在 browsermob-proxy-api 包中进行编辑。按照本节末尾给出的步骤进行操作。

  1. 在新端口上启动代理

    proxyObj.startPort(port, function (err, data) { if (err) { console.log(err); } else { console.log('New port started') } })

  2. 一旦我们有了新的端口,我们必须在上面的端口中启动我们的 chrome 浏览器,以便所有浏览器请求都通过 browsermob 代理。

    proxyObj.startPort(port, function (err, data) { if (err) { console.log(err); } else { console.log('New port started') var dataInJson = JSON.parse(data);

//第8步:

this.test_settings.desiredCapabilities =  {
"browserName": "chrome",
"proxyObj": proxyObj, //for future use
"proxyport": dataInJson.port, //for future use
"proxy": {
"proxyType": "manual",
"httpProxy": "127.0.0.1:" + dataInJson.port,
"sslProxy": "127.0.0.1:" + dataInJson.port //important is you have https site
},
"javascriptEnabled": true,
"acceptSslCerts": true,
"loggingPrefs": {
"browser": "ALL"
}
}
}
}) 
  1. 尝试使用上述设置运行,您可以检查 cmd [在步骤 2 中创建以确认请求是否通过上述端口。会有一些活动]

  2. 对于创建 HAR 和获取创建 HAR,browsermob-proxy-api 提供了出色的 api。

    在任何路径中添加 createHAR.js 并在 nightwatch.json[custom_commands 部分] 中提及该路径

    export.command = function (callback) { var self = this;

    if (!self.options.desiredCapabilities.proxyObj) { console.error('没有代理设置 - 你调用 setupProxy() 了吗?'); }

    this.options.desiredCapabilities.proxyObj.createHAR(this.options.desiredCapabilities.proxyport, { 'captureHeaders': 'true', 'captureContent': 'true', 'captureBinaryContent': 'true', 'initialPageRef': 'homepage' }, function (err, result){ if(err){ console.log(err) }else{ console.log(result) if (typeof callback === "function") { console.log(this.options.desiredCapabilities .proxyObj); console.log(this.options.desiredCapabilities.proxyport); // console.log(result); callback.call(self, result); } } });

    返回这个;};

然后到 getHAR,添加 getHAR.js,添加以下代码。

var parsedData;
exports.command = function(callback) {
var self = this;
if (!self.options.desiredCapabilities.proxy) {
console.error('No proxy setup - did you call setupProxy() ?');
}

self.options.desiredCapabilities.proxyObj.getHAR(self.options.desiredCapabilities.proxyport, function (err, data) {
console.log(self.options.desiredCapabilities.proxyObj);
console.log(self.options.desiredCapabilities.proxyport);
//console.log(result);
if(err){
console.log(err)
}else{
parsedData = JSON.parse(data)
console.log(parsedData.log.entries)
}
if (typeof callback === "function") {
console.log(self.options.desiredCapabilities.proxyObj);
console.log(self.options.desiredCapabilities.proxyport);
callback.call(self, parsedData);
}
});

return this;
};
  1. 在测试开始时,createHAR 不会有 proxyObj,所以这一步应该同步执行。用 browser.perform() 包裹这一步

    browser.perform(function(){ browser.createHAR() }) ////一些导航

    browser.perform(function(){ browser.getHAR() })

注意:如果您在公司代理后面工作,您可能必须使用 browsermob 提供的链代理。根据 browsermob 代理文档,进入 api 部分,-> /proxy 可以有请求参数“proxyUsername”和“proxyPassword”

在 node_modules->browsermob-proxy-api->index.js 中,在第 22 行之后添加以下行:

this.proxyUsername  = cfg.proxyUsername || '';
this.proxyPassword = cfg.proxyPassword || '';
this.queryString = cfg.queryString || 'httpProxy=yourupstreamProxy:8080'; //you will get this from pac file

then at line 177, where package is making request '/proxy' to browser.
replace 
path: url
 to
path: url + '?proxyUsername=' +this.proxyUsername + '&proxyPassword=' +  this.proxyPassword + '&' + this.queryString
于 2018-01-18T14:05:34.157 回答