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

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

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

Я хочу интегрировать BrowserMob Proxy в Protractor с помощью привязки browsermob-node node.js следующим образом :

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

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

Мои тесты выполняются в Firefox, iOS и Android (через Appium).


person afternoon    schedule 01.09.2014    source источник
comment
Функции onPrepare могут возвращать обещание: github.com/angular/protractor/blob / master / spec /   -  person afternoon    schedule 01.09.2014
comment
Связанный? stackoverflow.com/questions/21689089/   -  person afternoon    schedule 01.09.2014


Ответы (2)


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

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

Дополнительная информация здесь и здесь.

person Leo Gallucci    schedule 01.09.2014
comment
Спасибо. Вы совершенно правы. Я создал простую демонстрацию (используя Q.ninvoke) здесь: github.com/afday/protractor-browsermob -тест - person afternoon; 02.09.2014
comment
Привет, я наткнулся на эту статью, когда искал способ добавить заголовки в мои тесты транспортира. Как вы думаете, я могу использовать прокси-библиотеку browsermob в режиме async / await. Я не смог найти пример в Интернете. - person Monnie_tester; 28.02.2019

Транспортир легко обеспечивает активное ожидание определенных условий. После запуска прокси на 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;
    });
  },
}
person miguelr    schedule 03.03.2017
comment
Привет, я за корпоративным прокси. Вы знаете, как я могу это настроить. Предлагается несколько онлайн-статей, я использую цепочку прокси, но здесь нет подходящего примера: github.com/zzo / browsermob-node не могли бы вы пролить свет на то, как я могу это реализовать? - person Monnie_tester; 13.03.2019