私はかなり長い間分度器で自動テストを開発してきましたが、多くの皆さんと同じように、browser.sleep()
- bridgeでしか越えられないギャップに遭遇しました。私はこのようなハードコーディングのファンではありませんが、必要に応じてそうします。
私が開発したテストにより、すべてのbrowser.sleep(1000)
がランタイムに大きな影響を与えるようになりました。テストでは現在、さまざまなアカウント(正確には128)のアクセス許可をテストしています。これには、すべてのアカウントがアクセス権を持っているかどうかを確認しながら、ログインとログアウトが含まれます。
私がテストしているWebサイトは純粋なAngularJSアプリケーションであり、ページが完全に読み込まれるまで正確に待機するbrowser.sleep()
メソッドがあるため、私の目にはbrowser.waitForAngular()
を非推奨のメソッドにする必要があります。設定された時間待機するbrowser.sleep()
と比較すると、その時間内にWebサイトがロードされない場合(発生する)、テストに一貫性がなくなります(一貫性がないことを好む人は誰もいません)。
調査の結果、browser.waitForAngular()
はAngularJSに関連していないため、アニメーションや関連する時間のかかる機能は考慮されていないと私は信じていますが、これは当社のWebサイトには実装されていません。また、waitForAngular()
は基本的に_$digest
_、_$http
_、および_$timeout
_を待機します。
私が尋ねているのは、これが分度器が一般的に素晴らしいので許容できる損失と見なされるものであるかどうか、または私がここで見落としているものがあるかどうかです。
TL; DR:browser.sleep()
に落ち着かないようにするための解決策はありますか?
出典: 分度器タイムアウトドキュメント 、 タイムアウト-spec.js(分度器ドキュメント) 、 Issue909 、 Issue279 、- Issue92 、 StackQuestion1
待っていることが完了したかどうかを判断するための何らかのテストを考案できる場合は、 browser.wait
。 http://docsplendid.com/archives/209 からアイデアを取り入れて、true
またはfalse
に解決されるpromiseを返す関数を渡すことができます。 isPresent
を使用するものとして
browser.wait(function() {
return element(by.id('some-element')).isPresent();
}, 1000);
または、より複雑な条件がある場合は、promisechainingを使用できます。
browser.wait(function() {
return element(by.id('some-element')).isPresent().then(function(isPresent) {
return !isPresent;
});
}, 1000);
コマンドフローは、返される約束がwait
に解決されるまで、true
に渡された関数を繰り返し呼び出して待機します。
これは、要素が存在するときにアクションを実行する場合、または要素がページに存在するまで待機する場合の方法です。
element(by.id).isPresent().then(function(result) {
if (result) {
nextButton.click();
}
else{
browser.wait(function () {
return browser.isElementPresent(element(by.id));
},50000);
}
}).then(function () {
nextButton.click();
});
},