我想捕获我的应用程序在Protractor测试套件运行期间发出的网络请求。
BrowserMob代理看起来是一个很好的工具。
我想使用BrowserMob节点node.js绑定将BrowserMob代理集成到Protractor中,如下所示:
onPrepare
:创建新代理并启动它beforeEach
:启动新的HARafterEach
:将HAR写入文件onComplete
:停止代理
然而,browsermob-node的API要求我将回调传递给每个方法,并且假设onPrepare
、onComplete
是同步的。没有我可以通过的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;
});
},
}