更改为beforeEach中的desiredCapabilities未反映

时间:2018-02-05 11:34:11

标签: nightwatch.js

我正在尝试记录所有浏览器请求和响应。这可以通过browsermob-proxy api来完成。

为此,我必须更改所需的功能并更改浏览器的httpProxy。

在全球或文件级别的之前,我试图改变这一点。虽然它反映在浏览器对象中,但实际的浏览器不是通过这些设置启动的。

简单示例:

globalhook文件

module.exports = {
 before : function (done) {

},

beforeEach: function(browser, done){

 browser.options.desiredCapabilities = {
        "browserName": "chrome",
        "proxy": {
          "proxyType": "manual",
          "httpProxy": "127.0.0.1:" + someport,
          "sslProxy": "127.0.0.1:" + someport
        },
        "javascriptEnabled": true,
        "acceptSslCerts": true,
 }
done()
},

afterEach: function(browser, done){
 //some code
}

after : function (done) {
 //some code
},

}

如果我在挂机前改变了所需的功能,Chrome浏览器就会进行这些更改。问题在于beforeEach [全局,文件级别]。

进一步调试,我发现setCapabilities函数在beforeHach Hook之前运行。

enter image description here

如果我做错了什么,有人可以看看或建议。

2 个答案:

答案 0 :(得分:0)

感谢您在此处提出问题。

问题是desiredCapabilities已应用于浏览器会话。 beforeEachafterEach在同一个浏览器会话上运行,因此除非会话重新启动,否则desiredCapabilities中的任何更改都不会应用。

如果您需要动态更改desiredCapabilities,则必须以不同方式构建测试,例如将测试拆分为单独的测试类

答案 1 :(得分:0)

首先,您可能希望使用before()挂钩代替beforeEach(),因为beforeEach()将在每个测试用例之前运行,而您又无法修改开始浏览器会话。 before()将在启动浏览器会话之前运行。

要解决您的问题,您需要在测试运行模块上定义desiredCapabilities属性,如果需要设置一些动态值,请使用before() hook来修改该对象:

module.exports = {
  desiredCapabilities: {
      "browserName": "chrome",
      "proxy": {
        "proxyType": "manual",
        "httpProxy": "127.0.0.1",
        "sslProxy": "127.0.0.1"
      },
      "javascriptEnabled": true,
      "acceptSslCerts": true,
  },

  before: function(client, done) {
    this.desiredCapabilities.proxy.sslProxy = '127.0.0.1' + someport;
    done();
  }
}

我已经搜索过有关此功能的官方文档,但无法找到任何内容,不过我们在测试中使用过此功能并且运行良好。

<强>更新

由于您只需要在proxy对象上更改desiredCapabilities,因此有一点黑客攻击:

// global hooks file:
module.exports = {
  beforeEach: function(client, done) {
    client.options.desiredCapabilities.proxy = {
      "proxyType": "manual",
      "httpProxy": "127.0.0.1:" + someport,
      "sslProxy": "127.0.0.1:" + someport
    };
    done(client);
  }
};

更改desiredCapabilities对象无法正常工作,因为对原始对象的引用已经存储在Nightwatch的引擎盖下。但是没有什么可以阻止你覆盖该对象的proxy属性。

在Nightwatch中查看来源和测试后,我相信这是您案例的唯一解决方案。