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

Javascript 量角器点击元素并计算子元素,javascript,jasmine,protractor,Javascript,Jasmine,Protractor,我在循环收集元素并使用量角器单击每个元素时遇到了计算子元素的问题。我对这一点很陌生,花了很多时间试图找出解决方案 我当前的代码如下所示: function clickThroughElements(elements) { var amountOfChildElements = 0; for(var i in elements) { var element = elements[i]; element.click();

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

我当前的代码如下所示:

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吗?

您可以使用量角器的
.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;
    });
});

参考资料:

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

获取计数的一种方法是首先使用
map
将所有计数作为承诺数组获取。然后使用
promise解决这些问题。所有
并使用
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);
});

嘿,我不确定我是否理解这个问题,它只是计算元素中包含的子元素吗?这将做一些基本的事情你也看到这个帖子了吗?工作就像魅力!非常感谢您的解决方案!