2015-11-09 51 views
2

我正在從量角器切換到Nightwatch.js,而且我正面臨着Nightwatch處理承諾的一些困難。如何用Nightwatch履行承諾

舉一個例子,我試圖計算滿足給定條件的元素數量。 count函數是在一個頁面對象,所以從測試本身分開:

頁面對象命令:

countToDoList: function(browser) { 
     browser.elements('css selector', "input[ng-model='todo.done']", function(result){ 
      return result.value.length; 
     }); 
    } 

,並在測試呼叫:

'Angular - 1' : function(browser) { 
    var angular = browser.page.angularPO(); 
    var mainPage = angular.section.main; 

    angular.openMainPage(browser); 
    var countToDoBoxes = 0; 

    countToDoBoxes = mainPage.countToDoList(browser); 
    console.log("countToDoBoxes = " + countToDoBoxes); 

    browser.end(); 
} 

這將返回「countToDoBoxes =未定義「。基於我在量角器方面的(短)經驗,我認爲這是由於函數沒有履行諾言,因爲它傳遞給「countToDoBoxes」。

有沒有辦法讓這項工作?

+1

如果你希望'browser.elements'返回一個承諾,那麼你或許應該使用'。那麼()'而不是傳遞迴調直。此外,你顯然必須從'countToDoList'方法'返回'。 – Bergi

+0

爲了我自己的利益,你爲什麼要換? – SuperUberDuper

+0

@SuperUberDuper:我在一個不同的項目上工作,並且這個新項目與Nightwatch.js一起工作(不是我的選擇,也不能改變它) – Majuj

回答

5

我找不到elements的API說明,但是這裏是您的代碼,修改爲返回藍鳥許諾。 (你可以與你的選擇的承諾庫類似的東西。)

countToDoList: function(browser) { 
    return new Promise(function(resolve, reject) { 
     browser.elements('css selector', "input[ng-model='todo.done']", function(result){ 
      resolve(result.value.length); 
     }); 

    }); 
} 
+1

這是一條評論,而不是一個答案。您可以通過展示如何使用承諾的代碼工作的示例,將其融入其中。 –

+1

@StefanHanke請回顧我的(現在修改的)對OP問題的回覆,並驗證它是否符合您的期望。感謝您的反饋。 –

+0

現在看起來不錯。謝謝!請參閱[這裏](http://nightwatchjs.org/api#elements)調用NightwatchJS API的元素(不幸的是這些文檔實際上並不是非常有用)。 [JWP](https://code.google.com/p/selenium/wiki/JsonWireProtocol#/session/:sessionId/elements)更有用。 –