我正在使用Angularjs Protractor进行e2e测试,我正在尝试对列中的值求和。在循环内部,我可以打印出每个值都很好,但我无法弄清楚如何将它们全部添加。如果我尝试在for循环后返回total,那么它是未定义的。
function getTotal() {
ptor.findElements(protractor.By.className('col33')).then(function(promColCells) {
var total;
for (var i = 2; i < promColCells.length; i += 2) {
promColCells[i].getText().then(function(promCellString) {
total += parseFloat(promCellString);
});
}
return total;
});
};
答案 0 :(得分:6)
另一个(现在是deletec)答案有正确的想法,但是庞大且不正确的承诺代码。使用$q.all
(ES6投诉承诺实施中的Promise.all是我们等待一系列承诺完成的方式:
function getTotal() {
// we return the continuation here
return ptor.findElements(protractor.By.className('col33')).then(function(cells) {
// wait for all cells
return $q.all(cells.map(function(cell){ return cell.getText()}));
}).then(function(cellTexts){
return cellTexts.reduce(function(x,y){ return x + Number(y);},0);
});
}
或者,如果您不是Array#reduce
粉丝,则可以使用for循环。
然后,使用类似于:
getTotal().then(function(total){
alert(total); // total value available here
});
注意,像Bluebird这样的外部承诺库可以让你这样做:
return Promise.cast(ptor.findElements(protractor.By.className('col33')))
.map(function(cell){ return cell.getText(); })
.reduce(function(x,y){ return x+Number(y); });
哪个更干净。
答案 1 :(得分:1)
量角器有一个内置的地图功能。
我建议你做这样的事情:
function getTotal() {
// The same as element.all(by.css('.col33')). It will return
// a promise that resolves to an array os strings.
return $$('.col33').map(function(cell){
return cell.getText();
}).
then(function(values){
// Values is an Array.<string> parse the ints and return the value.
var result = 0;
values.forEach(function(val){
result += parseInt(val, 10);
});
return result;
});
};
getTotal.then(function(total) {
});