我想在Protractor测试套件运行期间捕获我的应用程序发出的网络请求。
BrowserMob Proxy看起来像是一个很好的工具。
我想使用browsermob-node node.js绑定将BrowserMob Proxy集成到Protractor中,如下所示:
onPrepare
:创建新代理并启动它beforeEach
:开始新的HAR afterEach
:将HAR写入文件onComplete
:停止代理但是,browsermob-node的API要求我将回调传递给每个方法,并假设onPrepare
,onComplete
是同步的。我无法通过done
回调。
我的测试在Firefox,iOS和Android上运行(通过Appium)。
答案 0 :(得分:3)
你需要denodeify回调,即将它们变成Promise,所以Protractor会等待它们。
//...
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;
}
var Q = require('q');
//...
onPrepare: function() {
var proxy_doHAR = Q.nfbind(proxy.doHAR);
return proxy_doHAR('http://yahoo.com');
}
答案 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;
});
},
}