如何在Protractor中创建和操纵promises?

时间:2014-01-10 22:12:57

标签: node.js angularjs protractor

我想使用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()我需要做些什么来代替“以某种方式创造承诺”才能使其发挥作用?

2 个答案:

答案 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);
});