量角器点击元素并计算孩子

时间:2016-10-17 13:02:40

标签: javascript jasmine protractor

我遇到了计算子元素的问题,同时循环遍历元素集合并使用量角器单击每个元素。我对此很陌生,并花了很多时间试图找出解决方案。

我目前的代码如下:

function clickThroughElements(elements) {
        var amountOfChildElements = 0;
        for(var i in elements) {
          var element = elements[i];
          element.click();
          element.all(by.css('div')).then(function(elements) {
            amountOfChildElements += elements.length;
          });
        }
        return amountOfChildElements;
      }

显然我在返回时得到0,因为amountOfChildElements的增量是异步发生的。任何人都可以推荐,如何正确返回amountOfChildElements?

2 个答案:

答案 0 :(得分:3)

当涉及承诺时,你应该避免循环。

获得计数的一种方法是首先将所有计数作为map的承诺数组。然后使用promise.all解决这些问题,并使用reduce汇总值:

function clickThroughElements(elements) {
  var counts = elements.map(e => {
    e.click();
    return e.all(by.css('div')).count();
  });

  return protractor.promise.all(counts).then(values => {
    return values.reduce((acc, value) => acc + value, 0);
  });
}

用法:

clickThroughElements(elements).then(count => {
    console.log(count);
});

答案 1 :(得分:2)

您可以使用量角器.each().count()解决此问题。这将使所有内容保持异步。

有些事情如下:

var totalChildren = 0;
var parents = element.all(by.css('div.class'));
// iterate through parent, equivalent of a for loop
parents.each(function (parent) {
    // parent is the element with the current index of your loop
    parent.click();
    // chain locator calls to parent, ensuring you are finding the correct child 
    // associated with the correct parent element
    parent.all(by.css('div')).count().then(function (count) {
        // count children of the current parent element
        totalChildren += count;
    });
});

参考:Protractor's element.all() functions