如何在Protractor中使用BrowserMob Proxy?

时间:2014-09-01 16:34:46

标签: protractor browsermob

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

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

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

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

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

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

2 个答案:

答案 0 :(得分:3)

你需要denodeify回调,即将它们变成Promise,所以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');
  }

更多信息herehere

答案 1 :(得分: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;
    });
  },
}