Как я могу использовать BrowserMob Proxy с транспортиром?


Я хотел бы захватить сетевые запросы, сделанные моим приложением во время выполнения пакета тестов транспортира.

BrowserMob Proxy выглядит отличным инструментом для этого.

Я хотел бы интегрировать Browsermob Proxy в транспортир, используя узел browsermob-node.JS связывание следующим образом:

  • onPrepare: создайте новый прокси-сервер и запустите его
  • beforeEach: начните новый HAR
  • afterEach: Запишите HAR в файл
  • onComplete: остановите прокси

Однако API browsermob-node требует, чтобы я передавал обратные вызовы каждому из методов и onPrepare, onComplete предполагается, что они синхронны. Нет никакого обратного вызова done, который я мог бы передать.

Мои тесты работают на Firefox, iOS и Android (через Appium).

2 5

2 ответа:

Вам нужно денодировать обратные вызовы, то есть превратить их в обещания, чтобы транспортир их ждал.

Альтернатива 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');
  }

Подробнее здесь и здесь.

Транспортир легко обеспечивает активное ожидание при определенных условиях. После запуска прокси на 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;
    });
  },
}