检查其中一个 div 是否包含我在 nightwatch 中的值
Check if one of divs contains my values in nightwatch
我在使用 nightwatch.js 测试我的网络应用程序时遇到问题。我需要遍历页面上的所有 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 的 none 包含我的时才断言值。
不幸的是,nightwatch 不能很好地支持 promises 或一般的异步性。博客posthere总结了一些痛点
幸运的是,可以使用 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 不是直接 return 网络元素,而是 return 网络元素的 Selenium 表示(WebElement JSON 对象),因此我们必须使用 elementIdText
等特殊方法从中获取信息。
我在使用 nightwatch.js 测试我的网络应用程序时遇到问题。我需要遍历页面上的所有 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 的 none 包含我的时才断言值。
不幸的是,nightwatch 不能很好地支持 promises 或一般的异步性。博客posthere总结了一些痛点
幸运的是,可以使用 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 不是直接 return 网络元素,而是 return 网络元素的 Selenium 表示(WebElement JSON 对象),因此我们必须使用 elementIdText
等特殊方法从中获取信息。