如何用守夜人兑现承诺
How to fulfill a promise with Nightwatch
我正在从Protractor切换到Nightwatch.js,Nightwatch处理承诺的方式遇到了一些困难。
举个例子,我试图计算满足给定标准的元素的数量。计数函数位于页面对象中,因此与测试本身分离:
页面对象命令:
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();
}
这将返回"countToDoBoxe=undefined"。根据我在Protractor方面的(短暂)经验,我认为这是由于该函数在传递给"countToDoBoxes"时没有履行承诺。
有没有办法做到这一点?
我找不到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);
});
});
}
我不会回答你的问题,相反,我会展示你的问题的解决方案。我认为这将有助于谷歌员工,他们来到这里,试图在《守夜人》中使用承诺。
首先,Nightwatch没有基于promise-based的API,它使用回调。如果你试图在Nightwatch中使用promise,那将是痛苦的,因为你正在违背它的编程模式。
因此,我认为应该做的是,首先,修改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();
}
顺便说一句,这一切都在《理解命令队列》一文中解释过,由于某种未知的原因,我认为它不直接在Nightwatch文档中。
- 我的职位回报太快了,如何做出承诺
- 打破承诺链的好方法是什么
- 从函数返回角度承诺
- 我怎样才能获得承诺的价值
- 延期承诺值未更新/解析/延期
- 在承诺链中处理早期回报的最佳方式
- 承诺在非节点式回调上使用Bluebird
- 简单的ES6承诺问题-交换解决和拒绝参数
- 组合承诺和非承诺值
- 带有对象/原型的链式承诺(Q延期)
- AngularJS$q承诺使用socket.io
- React JS:未捕获(在承诺中)语法错误:在位置 0 的 JSON 中意外<令牌
- 当一些承诺失败时,如何继续使用$q.all()
- Nodejs和express路由,如何处理客户端的承诺
- 如何在多承诺链中处理谷歌地图API V3事件
- 承诺合并流
- JavaScript承诺-无法读取属性'那么'的未定义
- 等待循环调用的所有承诺完成
- Pg承诺性能提升:在冲突中
- 如何用守夜人兑现承诺