3

私はe2e tesingにAngularjs Protractorを使用しており、列の値を合計しようとしています。ループ内では、各値を正常に出力できますが、それらをすべて追加する方法がわかりません。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;
  });
};
4

2 に答える 2

6

もう1つの(現在はdeletec)回答には正しいアイデアがありますが、かさばる不適切な約束コードがあります。$q.all(ES6 準拠の promise 実装で (Which is Promise.all) を使用すると、promise の配列が完了するのを待つことができます。

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 のような外部の promise ライブラリを使用すると、次のことができることに注意してください。

return Promise.cast(ptor.findElements(protractor.By.className('col33')))
    .map(function(cell){ return cell.getText(); })
    .reduce(function(x,y){ return x+Number(y); });

これはさらにきれいです。

于 2014-04-07T19:15:53.743 に答える
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) {
});
于 2014-04-07T21:31:58.130 に答える