6

我想在 Protractor 测试套件运行期间捕获我的应用程序发出的网络请求。

BrowserMob Proxy看起来是一个很好的工具。

我想使用browsermob-node node.js 绑定将 BrowserMob 代理集成到 Protractor 中,如下所示:

  • onPrepare: 创建一个新代理并启动它
  • beforeEach: 开始一个新的 HAR
  • afterEach: 将 HAR 写入文件
  • onComplete: 停止代理

但是,bro​​wsermob-node 的 API 要求我将回调传递给每个方法onPrepareonComplete并且假定是同步的。没有done我可以通过的回调。

我的测试在 Firefox、iOS 和 Android 上运行(通过 Appium)。

4

2 回答 2

3

您需要对回调进行去节点化,即将它们转换为 Promises,以便 Protractor 等待它们。

备选方案 1:使用已经包含的 protractor.promise

  //...
  onPrepare: function() {
    var deferred = protractor.promise.defer();
    proxy.doHAR('http://yahoo.com', function(err, data) {
      if (err) {
        deferred.reject('ERROR: ' + err);
      } else {
        deferred.fulfill(data);
      }
    });
    return deferred.promise;
  }

备选方案 2:使用 Q 库

var Q = require('q');

  //...
  onPrepare: function() {
    var proxy_doHAR = Q.nfbind(proxy.doHAR);
    return proxy_doHAR('http://yahoo.com');
  }

更多信息在这里这里

于 2014-09-01T19:37:26.063 回答
1

量角器很容易提供主动等待某些条件。在 8887 上启动代理后。我用于browser.driver.wait此解决方案:

// protractor.conf.js

var browsermob = require('browsermob-proxy').Proxy;
var webdriver = require('selenium-webdriver');
var fs = require('fs');
// ...
var proxy;

var conf = {
  // Typical protractor configuration
  // ...

  beforeLaunch: function(){
    proxy = new browsermob({
      port : 8887
    });
  },

  onPrepare: function (){
    browser.driver.get('http://localhost:8080/index.html');

    var proxyReady = false;
    proxy.start(8888, function(err, data){
      if (!err) {
        proxy.startHAR(8888, 'test', true, true, function(){
          proxyReady = true;
        });
      } else {
        console.error(err);
      }
    });

    browser.driver.wait(function(){
      return proxyReady;
    });
  },

  onComplete: function () {
    var proxyDone = false;

    proxy.getHAR(8888, function(err, resp) {
      if (!err) {
          console.log('har saved at output.har');
          fs.writeFileSync('test/diagnostics/output.har', resp, 'utf8');
      } else {
          console.err('Error getting HAR file: ' + err);
      }
      proxy.stop(8888, function() {
        proxyDone = true;
      });
    });

    return browser.driver.wait(function(){
      return proxyDone;
    });
  },
}
于 2017-03-03T10:57:05.023 回答