我正在从量角器切换到Nightwatch.js,我在使用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 = undefined"。根据我对量角器的(短期)经验,我认为这是由于函数没有履行承诺,当它被传递给" countToDoBoxes"。
有没有办法让这项工作?
答案 0 :(得分:5)
我找不到elements
的API说明,但是这是您的代码,经过修改后返回Bluebird承诺。 (您可以使用您选择的Promise库执行类似操作。)
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)
我不会回答您的问题,相反,我将为您解决问题。我认为这也将帮助来此尝试使用Nightwatch的Google员工。
首先,Nightwatch没有基于Promise的API,它使用回调。如果您试图在Nightwatch中使用promises,那将是很痛苦的,因为您正在违背它的编程范例。
所以我认为应该做的是,首先,修改countToDoList
函数,使其接收回调函数。用您获得的值调用它。
同样重要的是您返回browser
,以便我们在此之后进行链接。
countToDoList: function(browser, callback) {
return browser.elements('css selector', "input[ng-model='todo.done']", function(result){
callback(result.value.length);
});
}
现在,在测试中,使用countToDoList
中的回调为countToDoBoxes
分配一个值。然后,您需要链接perform
方法。此方法确保将您放置在其回调中的任何内容添加到Nightwatch的命令队列的末尾。现在,您可以确保在尝试登录时拥有countToDoBoxes
值。
'Angular - 1' : function(browser) {
var angular = browser.page.angularPO();
var mainPage = angular.section.main;
angular.openMainPage(browser);
let countToDoBoxes;
mainPage
.countToDoList(browser, function(count) {
countToDoBoxes = count;
})
.perform(function() {
console.log("countToDoBoxes = " + countToDoBoxes);
})
.end();
}
在Understanding the Command Queue一文中对此进行了解释,出于某种未知的原因,它并非直接出现在我认为属于的Nightwatch文档中。