打破了量角器.filter()或.map()循环

时间:2016-08-04 21:19:38

标签: selenium protractor browser-automation e2e-testing webautomation

我使用量角器和黄瓜框架;如何突破.filter或.map循环?如果我找到匹配项,我不想继续进行迭代!

Page.prototype.getElementByKey = function (key) {
      var foundElement = null;
      return someElement.all(by.css('.someClass')).map(function (rawItem, index) {
        var itemObject = new ItemObjectClass(rawItem);
        return itemObject.getItemKey().then(function (foundItemKey) {
          var matched = String(foundItemKey).trim() === String(key).trim();

         console.log(' Matched: { ' + matched + ' }  index {'+index+'}');
          //if we have a match break out of the .filter function
          if (matched) {
            foundElement = itemObject;
            throw new Error("Just our way of breaking out of .filter() above");
          }
        });
      }).then(function () {
        //callback
        throw new Error('\n!!!!!Callback should not be called; 
       this means that we could not find an element that matched the passed in key above');
      }, function (error) {
        //error
        console.log('\n*******************errorCallback was called; '+error);
        return foundElement;
      });
    };

上面的代码找到了元素但是继续迭代直到结束,而不是在匹配时停止并通过调用 errorCallback 函数来中断。

假设.map函数返回" 一个解析为map函数返回的值数组的promise " http://www.protractortest.org/#/api?view=ElementArrayFinder.prototype.map,我正在利用这样一个事实:如果承诺无法解决,则承诺将调用其errCallback。

通过抛出假的错误,应该调用 errorCallback ,从而打破.map循环。

不幸的是,它成功地抛出错误但继续循环而不是爆发。我知道,因为当我

  

console.log("布尔" +匹配+"和索引" +索引);

我明白了:

matched: false index: 0
matched: false index: 1
matched: true index 2 //it should have stopped here since matched = true
matched false index 3 // this should NOT have printed

所以突破并不是在做任何想法吗?

2 个答案:

答案 0 :(得分:5)

您要返回单个元素,因此.reduce会更好。

这是一个用法示例,用于返回文本为" mylink"的第一个链接:

var link = element.all(by.css('a')).reduce(function (result, elem, index) {
    if(result) return result;

    return elem.getText().then(function(text){
        if(text === "mylink") return elem;
    });

}).then(function(result){
    if(!result) throw new Error("Element not found");
    return result;
});

答案 1 :(得分:0)

我从你的帖子中了解到,你想在找到匹配元素时退出循环(迭代)。

如果是,那么最好使用 .filter() 方法。因为它迭代所有可用的元素查找器列表,并在匹配找到时返回。

Code Snippet:

element.all(by.css('.items li')).filter(function(elem, index) {
          return elem.getText().then(function(text) {
                                if(text === 'RequiredElementFind'){
                                      return ele;//return matched element
                                 };
    });
}).click();//only matched element comes from the loop do what would you like    
  to do