无法使用Protractor找到同一祖父母的孙子元素

时间:2016-07-19 17:35:26

标签: javascript testing protractor

使用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的情况下解决这个问题,因为这个环境总是在改变

3 个答案:

答案 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 { }
    }