使用Protractor,我的目标是在给定名称值的情况下点击更新按钮,这是唯一的。
<div class="Employee">
<div class="address">
<button class="street" value="update"/>
</div>
<div class="profile">
<div class="name" value="Joe Smith"/>
</div>
</div>
<div class="Employee">
<div class="address">
<button class="street" value="update"/>
</div>
<div class="profile">
<div class="name" value="Jane Smith"/>
</div>
</div>
所以尝试寻找所有'Employee'元素来查找所有父母,然后过滤以找到哪个'Employee'元素具有值为'Jane Smith'的特定子元素。然后使用该父元素单击“更新”按钮。
element.all(by.css('[class="Employee"]')).filter(function (elem,index) {
if(elem.element(by.css('[value="Jane Smith"]')).isPresent()){
return elem
}
}).then(function (elem) {
elem[0].element(by.css('[value="update"]')).click()
})
问题在于,在'if'语句中,它总是等于true,我不确定为什么。
也许有另一种方法可以在不使用xpath的情况下解决这个问题,因为这个环境总是在改变
答案 0 :(得分:1)
我不经常使用filter
使用我们的应用程序,所以在黑暗中有点打击,但我相信您需要额外的return
声明。看看这是否适合你:
element.all(by.css('[class="Employee"]')).filter(function (elem,index) {
return elem.element(by.css('[value="Jane Smith"]')).isPresent().then(function(val) {
return val == true; // or val === true if you prefer
});
}).then(function (items) {
console.log(items.length) // just to check the number is what you expect
items[0].element(by.css('[value="update"]')).click()
});
答案 1 :(得分:1)
扩展@Gunderson's correct answer。
问题在于,在'if'语句中,它总是等于true,我不确定为什么。
这是因为isPresent()
方法几乎像Protractor 中的所有内容都会返回一个默认情况下为“truthy”的promise 。你需要解决实际获得真正价值的承诺。
另外,我会改进定位器以及定位内部元素的方式 - 您可以使用first()
并简单地链 element
调用,不需要{ {1}}在这种情况下:
then()
确保学习Promises and the Control Flow文档,以便更好地理解promises的概念和控制流程,这是保持承诺队列并解决它们的底层机制。
请注意,您可以使用XPath expression并在一行中进行处理 - 尽管这不太可读,看起来很脆弱且难以维护:
$$(".Employee").filter(function (elem) {
return elem.$('[value="Jane Smith"]').isPresent().then(function(isPresent) {
return isPresent;
});
}).first().$('[value="update"]').click();
答案 2 :(得分:0)
关于你的if语句,它应该更像是这样:
elem.element(by.css('[value="Jane Smith"]')).isPresent())
.then(function (result) {
if (result) { } //true
else { }
}