2014-01-10 45 views
33

我想使用Node Http模块直接调用我的服务器来设置我的量角器测试。 Http是基于回调的,我想把它变成承诺。如何在量角器中创建和操作承诺?

例如,我想有这个函数返回的承诺:

function callMyApi() { 
    var promise = // somehow create promise; 

    http.request({path: '/yada/yada', method: 'POST'}, function(resp) { 
    promise.complete(resp); 
    }); 

    return promise; 
} 

所以,问题是:什么,我需要require()和到位的“不知何故创造的承诺”这个工作?

回答

59

量角器使用WebDriver的承诺并在'量角器'上全局公开该API。所以,你应该能够做到

var deferred = protractor.promise.defer(); 
return deferred.promise; 

对于全WebDriverJS无极API,请参阅该代码在https://code.google.com/p/selenium/source/browse/javascript/webdriver/promise.js

+4

谢谢!这有帮助。如何在https://github.com/angular/protractor/blob/master/docs/api.md将其添加到API页面? –

+1

跟踪https://github.com/angular/protractor/issues/402 – Jmr

+1

我正在创建一个返回承诺的函数,我们如何解决/拒绝量角器? –

2

这是错误的方式做到这一点,但我们知道关于量角器控制流可能会有帮助。如果你想让规则的Javascript运行在量角器顺序中,通过控制流程添加它。

在这种情况下,您可以使用自己的承诺库,如果你想,那么只需使用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); 
});