2017-09-08 20 views
1

私は自動テストフレームワーク、分度器を使用しています。条件付きで約束を解く

私は、分度器がコード評価を非同期的に解決するためによくpromisesを利用することが分かりました。

質問:条件が満たされたら、プロミスを特定の値に手動で解決する方法を教えてください。


更新日:2017年9月8日

申し訳ありませんが、私はpromisesに少しだけ不明でした。 documentation()element.allの戻り値の型に応じてここには問題はありません

// match variable 
var match = false; 

// get all elements with `div` tag 
var scanElements = element.all(by.css('div')).each(function(el) { 
    // get text content of element 
    el.getText().then(function(text) { 
     // split words into array based on (space) delimeter 
     var sp = text.split(' '); 
     for (var i = 0; i < sp.length; i++) { 
      if (sp[i] == 'Stack Overflow') { 
       match = true; 
      } 
     } 
    }); 
}); 

// on complete 
scanElements.then(function() { 
    if (match) { 
     console.log('Status: Found match!'); 
    } 
    else { 
     console.log('Status: No match'); 
    } 
}); 
+0

を私は分度器を使用していましたが、私はそれらのフレームワークではブルーバードとQを使用しました、あなたは ''でreject'するオプションがありますreturn deferred.reject(data) '約束し、' .fail((data)=>) 'ハンドラを使ってステータスを捕捉します。あるいは、 'deferred.resolve(myConditionalData1)' ...や 'deferred.resolve(myConditionalData2)'のような異なる値で約束を解決することもできます。約束を複数の方法で解決することができ、複数のデータ値が正しく処理される必要があります。これをレスポンスとして追加しないのは、使用しているフレームワークで作業していないためです。希望がこれを助ける –

答えて

1

それはすべてのものを反復処理した後、それぞれが()nullである:私はこれを正しく動作させることができました。

すべてのElementFindersで関数が呼び出されたときに解決される約束です。約束はnullに解決されます。

編集1: フィルタは有効なオプションですか?

element.all(by.css('div')) 
    .filter(function(element) { 
     return element.getText().then(function(text) { 
     var sp = text.split(' '); 
     for (var i =0; i< sp.length; i++) { 
      if(sp[0] == 'protractor') return true; 
     } 
     return false; 
     }); 
    }).first(); 

は最初filter、その後、あなたが代わりにeachmapを使用する必要があります

+0

私は何を探していると推測します:どのように私は外側の約束の実行を停止し、一致が見つかると、見つかった値を返しますか? –

1

一致するfirst要素を返します。あなたがソースコードを見れば、これはeachの実装方法である:

each(fn: (elementFinder?: ElementFinder, index?: number) => any): wdpromise.Promise<any> { 
    return this.map(fn).then((): any => { 
    return null; 
    }); 
} 

だから、あなたはそれが内部的にmapを使用し、nullを返すことによって、結果を隠す見ることができるように。また、documentationにも指摘されています。

また、elementの名前を変更すると、分度器のelementオブジェクトのあいまいさを避けることができます。

0

あなたの正確な例では、ElementArrayFinderに.getText()を使用することができます -

// calling .getText() exactly on ElementArrayFinder returns promise 
let hasStackOverflow = $$('div').getText().then(texts=> { 
    // texts would be array of strings 
    return texts.includes('Your Text exact match') 
}) 

hasStackOverflow.then(has=> { 
    if (has) { 
     console.log('Status: Found match!'); 
    } 
    else { 
     console.log('Status: No match'); 
    } 
})