我遇到了计算子元素的问题,同时循环遍历元素集合并使用量角器单击每个元素。我对此很陌生,并花了很多时间试图找出解决方案。
我目前的代码如下:
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?
答案 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;
});
});