Как я могу использовать 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 ответа:
Вам нужно денодировать обратные вызовы, то есть превратить их в обещания, чтобы транспортир их ждал.
Альтернатива 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; }); }, }