2016-12-20 17 views
1

私は要素のインデックスを正しく取得する関数を持っています。そのテキストは=== "check"です。それが明確にconsole.logで印刷されています分度器の約束チェーンからデータを取り出す方法は?

その後
function getIndex() { 
    return element.all(by.css(".palette__item.ng-scope>span")).then(function (colorList) { 
     colorList.forEach(function (elem, index) { 
      elem.getText().then(function (text) { 
       if (text == "check") { 
        console.log(index); 
        return index; 
       } 
      }); 
     }); 
    }); 
} 

、私はそれからデータを盗んする方法を、異なるアプローチの多くを試みたが、成功していません。ター最後のアプローチはこれです:だから

var res = null; 
webDriver.promise.fullyResolved(getIndex()).then(function (index) { 
    res = index; 
}); 
console.log(res); 

、ここで私はどんな約束の決意をguaratees機能、内部のinit RES値を試してみましたが、それは動作しませんし、nullを返します。

私はgetIndex()関数に間違いがあると思いますが、戻り値のオペレータを間違った場所に配置している可能性がありますが、ここで助けが必要です。私は完全にそれを動作させる方法を考えていません。助けてください。

答えて

2

あなたは "のforEach"、reduce()を使用し、問題はない過度に複雑されています

function getIndex() { 
    return element.all(by.css(".palette__item > span")).reduce(function (acc, elem, index) { 
     return elem.getText().then(function (text) { 
      if (text == "check") { 
       return index; 
      } 
     }); 
    }, -1); 
} 

は使用方法:サイドノートとして

getIndex().then(function (index) { 
    console.log(index); 
}); 

- あなたのロケータでng-scopeクラスを使用しないようにしよう - それはあなたのロケータに意味を持たない純粋な技術的な角度特有のクラスです。

+0

非常に興味深いですが、私は '未定義' valuseを取得します。申し訳ありませんが、私の質問がばかばかしい場合は、JSを使用してテストを始めました。 – SanchelliosProg

+0

@SanchelliosProgああ、ノー、私はばかだ、 'return'を忘れてしまった。もう一度お試しください。 – alecxe

+0

あなたは私のSUPERHEROです!!!!!!!!あなたは私の人生を救った)))とてもありがとう!!!! – SanchelliosProg

1

私は現在、それをデバッグすることはできませんが、これは動作するはずです:

function getIndex() { 
    return element 
      .all(by.css(".palette__item.ng-scope>span")) 
      .then((colorList) => { 
       // get text for all elements 
       return Promise.all(colorList.map((el) = el.getText())); 
      }) 
      .then((colorList) => { 
       // we need both text and index 
       return colorList.map((el, ind) => [el, ind]) 
       // but just the elements with text "check" 
           .filter((elArr) => ellArr[0] == 'check') 
       // at this point we can throw away the text and just use the index 
           .map((elArr) => elArr[1]); 
      }) 
} 

あなたの基本的な問題は、他のイテレータの機能と、約束を返すこと、あなたが機能を混ぜること、です。最終的にreturnと呼ぶと、約束の文脈が完全に失われてしまいます。

1

いくつかのこと: まず、promiseの外で変数を初期化しましたが、promise内で変数の値を割り当てました。それはまあまあですが、あなたが私たちに示した例であなたのconsole.log()がどこにあるかを見てください。このようなconsole.log文を最下部に置いておくと、約束が解決される前に実行される可能性が最も高いため、変数resの値はnullになります。

約束の範囲内でresの値をログアウトしようとしましたか?

getIndex機能に戻る...なぜforEach関数内で約束を使用していますか?私はあなたがこの記事で提供している情報の量を提案することができますすべてです

function getIndex() { return element.all(by.css(".palette__item.ng-scope>span")).then(function (colorList) { colorList.forEach(function (elem, index) { var temp = elem.getText() if (temp == "check") { console.log(index); return index }); }); }); }

を:あなたの代わりに、次のやって試してみました。これからの重要な教訓は、非同期コードと同期との違いをよりよく理解することです。

関連する問題