2014-01-10 99 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); 
});