如何将BrowserMob代理与Protractor一起使用



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

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

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

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

然而,browsermob-node的API要求我将回调传递给每个方法,并且假设onPrepareonComplete是同步的。没有我可以通过的done回调。

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

您需要取消回调的名称,即将它们转换为Promises,以便Protractor等待它们。

备选方案1:使用已包含的量角器

  //...
  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');
  }

更多信息请点击此处。

Protractor可轻松为特定条件提供主动等待。在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;
    });
  },
}

相关内容

  • 没有找到相关文章

最新更新