如何用 Nightwatch 履行承诺
How to fulfill a promise with Nightwatch
我正在从 Protractor 切换到 Nightwatch.js,我在 Nightwatch 处理 promise 的方式上遇到了一些困难。
举个例子,我正在尝试计算满足给定条件的元素的数量。计数函数在页面对象中,因此与测试本身分开:
页面对象命令:
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();
}
这个returns"countToDoBoxes = undefined"。根据我对 Protractor 的(短期)经验,我认为这是由于函数在传递给 "countToDoBoxes".
时没有履行承诺。
有没有办法让它工作?
我找不到 elements
的 API 描述,但这是您的代码,已修改为 return 蓝鸟承诺。 (您可以使用您选择的 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 中使用 promises 的 Google 员工有所帮助。
首先,Nightwatch 没有基于承诺的 API,它使用回调。如果您尝试在 Nightwatch 中使用 promises,那将会很痛苦,因为您违背了它的编程范式。
所以我认为应该做的是,首先修改countToDoList
函数,让它接收一个回调函数。用你得到的值调用它。
你 return 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 文档中。
我正在从 Protractor 切换到 Nightwatch.js,我在 Nightwatch 处理 promise 的方式上遇到了一些困难。
举个例子,我正在尝试计算满足给定条件的元素的数量。计数函数在页面对象中,因此与测试本身分开:
页面对象命令:
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();
}
这个returns"countToDoBoxes = undefined"。根据我对 Protractor 的(短期)经验,我认为这是由于函数在传递给 "countToDoBoxes".
时没有履行承诺。有没有办法让它工作?
我找不到 elements
的 API 描述,但这是您的代码,已修改为 return 蓝鸟承诺。 (您可以使用您选择的 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 中使用 promises 的 Google 员工有所帮助。
首先,Nightwatch 没有基于承诺的 API,它使用回调。如果您尝试在 Nightwatch 中使用 promises,那将会很痛苦,因为您违背了它的编程范式。
所以我认为应该做的是,首先修改countToDoList
函数,让它接收一个回调函数。用你得到的值调用它。
你 return 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 文档中。