不幸的是,nightwatch不支持承諾或一般異步非常好。博客文章here總結了一些痛點。
幸運的是,可以使用browser.elements
和browser.perform
的組合。
var assert = require('assert');
module.exports = {
'foobar': function (browser) {
var isTextFound = false;
browser
.url('http://localhost:3000')
.waitForElementVisible('body', 1000);
browser.elements('css selector', '.myclass', function (res) {
res.value.forEach(function (jsonWebElement) {
var jsonWebElementId = jsonWebElement.ELEMENT;
browser.elementIdText(jsonWebElementId, function (jsonElement) {
var text = jsonElement.value;
if (text.indexOf('text1') !== -1 && text.indexOf('second_text') !== -1) {
isTextFound = true;
}
});
});
});
browser.perform(function() {
assert.ok(isTextFound, 'Text found');
});
browser.end();
}
}
讓我們通過一些關鍵點
require('assert')
這是因爲nightwatch斷言只對DOM元素進行操作,因此你不能斷言一個布爾值是必需的。這也意味着報告中不會顯示斷言,但是如果它是錯誤的,它會拋出一個錯誤,這將會出現。
browser.perform(function(){...})
這使斷言到命令隊列,這樣的斷言之後會發生。如果不存在,評估將立即發生並且斷言將失敗。
browser.elements('css selector, '.myclass', function(res){...})
這是使用elements api。請注意,webdriver協議部分下的api不直接返回Web元素,而是返回Web元素(WebElement JSON對象)的Selenium表示,因此我們必須使用特殊方法(如elementIdText
)從中獲取信息。