我是使用nightwatch.js的新手。 我想获得一个元素列表,并使用给定的字符串验证每个元素的文本值。 我试过了:
function iter(elems) {
elems.value.forEach(function(element) {
client.elementIdValue(element.ELEMENT)
})
};
client.elements('css selector', 'button.my-button.to-iterate', iter);
另一个stackoverflow问题 但我现在正在使用的是
waitForElementPresent('elementcss', 5000).assert.containsText('elementcss','Hello')
它正在返回输出
Warn: WaitForElement found 5 elements for selector "elementcss". Only the first one will be checked.
所以我希望它能够验证列表中每个元素的文本值。
答案 0 :(得分:7)
所有的事情都不能通过nightwatch js简单命令来完成,所以他们提供了自定义命令意味着selenium协议。在这里,您可以拥有所有selenium protocol。我使用以下代码来断言每个元素的文本值,并使用给定的字符串" text"。希望它能帮到你
module.exports = {
'1. test if multiple elements have the same text' : function (browser) {
function iter(elems) {
elems.value.forEach(function(element) {
browser.elementIdText(element.ELEMENT, function(result){
browser.assert.equal(result.value,'text')
})
})
};
browser
.url('file:///home/user/test.html')
.elements('tag name', 'a', iter);
}
};
我的HTML代码段
<div id="test">
<a href="google.com" class='red'> text </a>
<a href="#" class='red'> text </a>
<a href="#" class='red'> text 1</a>
</div>
&#13;
答案 1 :(得分:2)
我能够做到:
.elements('css selector', 'cssValue', function (elements) {
for(var i=0;i<elements.value.length;i++){
var elementCss = 'div.search-results-item:nth-child(' + (i+1) + ') span';
client.assert.containsText(elementCss,'textValue');
}
})
答案 2 :(得分:1)
将你的函数iter放在for循环中,然后再使用
client.elements('css selector', '#CollectionClass', function (result) {
if(result.value.length > 1) {
var count;
for(count=1; count<result.value.length; count++) {
result.value.forEach(function(element) {
client.elementIdValue(element.ELEMENT);
client.elementIdText(selectedHighlight.ELEMENT, function(resuddlt) {
this.assert.equal(typeof resuddlt, "object");
this.assert.equal(resuddlt.status, 0);
this.assert.equal(resuddlt.value, "your value");
});
}
}
}
};
答案 3 :(得分:0)
您已经说明了您尝试过的内容(这很好),但您还没有向我们展示用于演示问题的清理HTML(这会降低可能答案的准确性)。
HTML中有许多方法可以包含信息,内置的Nightwatch containsText
将序列化它在包含子结构的结构中找到的任何文本。
所以,例如,如果你有Juhi建议,
<div id="test">
<a href="google.com" class='red'> text </a>
<a href="#" class='red'> text </a>
<a href="#" class='red'> text 1</a>
</div>
然后是断言
.verify.containsText('#test', ' text ') // first one
.verify.containsText('#test', ' text ') // second one
.verify.containsText('#test', ' text 1') // third one
将通过,因为它们每个都验证特定信息而无需编写循环。 Nightwatch将查看test
元素并将元素序列化为字符串text text text 1
现在,如果你因为其他原因需要一个循环,这都是学术性的,但你原来的问题似乎是针对如何获取文本信息,而不一定是如何执行一个可能的问题解决方案(写一个循环)。
答案 4 :(得分:0)
我创建了自定义断言-custom-assertions/hasItems.js
,内容为:
exports.assertion = function hasItems(selector, items) {
this.message = `Testing if element <${selector}> has items: ${items.join(", ")}`;
this.expected = items;
this.pass = selectedItems => {
if (selectedItems.length !== items.length) {
return false;
}
for (let i = 0; i < selectedItems.length; i++) {
if (selectedItems[i].trim() !== items[i].trim()) {
return false;
}
}
return true;
};
this.value = res => res.value;
function evaluator(_selector) {
return [...document.querySelectorAll(_selector)].map(
item => item.innerText
);
}
this.command = cb => this.api.execute(evaluator, [selector], cb);
};