量角器:如何通过文本在ng-repeat中找到元素?

时间:2017-07-14 13:04:12

标签: angularjs protractor angularjs-ng-repeat

我希望通过其中一个属性(索引可以更改)的文本在量角器中获取ng-repeat内的特定元素。

HTML

receiveTimeout

据我所知,如果我知道我想要的索引,请说2,我可以这样做:

<div ng-repeat="item in items">
  <span class="item-name">
    {{item.name}}
  </span>
  <span class="item-other">
     {{item.other}}
  </span>
</div>

但在这个特定情况下,我正在寻找具有特定文本(item.name)的“项目中的项目”,例如“apple”。如上所述,索引每次都会有所不同。关于如何解决这个问题的任何想法?

3 个答案:

答案 0 :(得分:0)

function elementThere(specificText, boolShouldBeThere){
  var isThere = '';
  element.all(by.repeater('item in items')).each(function (theElement, index) {
    theElement.getText().then(function (text) {
      // Uncomment the next line to test the function
      //console.log(text + ' ?= ' + specificText);
      if(text.indexOf(specificText) != -1){
        element.all(by.repeater('item in items')).get(index).click();
        isThere = isThere.concat('|');
      }
    });
  });
  browser.driver.sleep(0).then(function () {
    expect(isThere.indexOf('|') != -1).toBe(boolShouldBeThere);
  });
}

it('should contain the desired text', function () {
  elementThere('apple', true);
}

这是否符合您的需求?

答案 1 :(得分:0)

public items = element.all(by.binding('item.name'))
getItemByName(expectedName) {
    return this.items.filter((currentItem) => {
         return currentItem.getText().then((currentItemText) => {
             return expectedName === currentItemText;
         });
    }).first();
}

并调用this.getItemByName('Item 1')之类的方法。将Item 1替换为预期的字符串。

答案 2 :(得分:0)

我能够通过简化@ bdf7kt建议的解决方案来解决这个问题:

  element.all(by.repeater('item in items')).each(function(elem) {
    elem.getText().then(function(text) {
      if(text.indexOf('apple') != -1) {
        //do something with elem
      }
    });
  });

此外,这个特殊的解决方案对我的用例不起作用,但我肯定会为其他人工作:

var item = element(by.cssContainingText('.item-name', 'apple'));
//do something with item