我想使用Node Http模块直接调用我的服务器来设置我的Protractor测试。 Http是基于回调的,我想将其转化为承诺。
例如,我想让这个函数返回promise:
function callMyApi() {
var promise = // somehow create promise;
http.request({path: '/yada/yada', method: 'POST'}, function(resp) {
promise.complete(resp);
});
return promise;
}
所以,问题是:require()
我需要做些什么来代替“以某种方式创造承诺”才能使其发挥作用?
答案 0 :(得分:59)
量角器使用WebDriver的承诺,并在'量角器'上全局公开API。所以你应该能够做到
var deferred = protractor.promise.defer();
return deferred.promise;
有关完整的WebDriverJS Promise API,请参阅https://code.google.com/p/selenium/source/browse/javascript/webdriver/promise.js
上的代码答案 1 :(得分:2)
这是错误的方法,但了解量角器控制流可能会有所帮助。如果您希望在Protractor中运行常规Javascript,请通过控制流添加它。
在这种情况下,您可以使用自己的promise库,然后只需使用browser.wait
等待您的承诺完成。
var Promise = require('bluebird');
var promises = [];
browser.controlFlow().execute(function() {
var p = new Promise...
promises.push(p);
});
browser.wait( function(){ return Promise.all(promises); }, timeoutMs );
我不是将它用于常规承诺,而是用于console.log
语句或为测试的一部分执行计时,或者甚至使用fs
将测试中的内容打印到文件中。
var startTime, duration;
browser.controlFlow().execute(function() {
startTime = new Date().getTime();
});
//Protractor code you want timed
browser.controlFlow().execute(function() {
duration = new Date().getTime() - startTime;
console.log("Duration:", duration);
});