检查是否有一个div包含我在夜间的值
问题描述:
我在使用nightwatch.js测试我的webapp时遇到了问题。我需要迭代页面上的所有div元素来检查是否有包含我之前添加的所有子元素的元素。例如我有:检查是否有一个div包含我在夜间的值
<div className = 'myclass'>
<h2> text1 </h2>
<h3> second_text1 </h3>
</div>
<div className = 'myclass'>
<h2> text2 </h2>
<h3> second_text2 </h3>
</div>
我想检查一个div是否包含'text2'和'second_text2'。我尝试添加iter函数,如下所示:Assert text value of list of webelements using nightwatch.js但我不知道如何检查此div中的子元素并仅在没有div包含我的值时才声明。
答
不幸的是,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
)从中获取信息。