web-dev-qa-db-ja.com

分度器のタイムアウト

私はかなり長い間分度器で自動テストを開発してきましたが、多くの皆さんと同じように、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(分度器ドキュメント)Issue909Issue279 、- Issue92StackQuestion1

11
Tom Nijs

待っていることが完了したかどうかを判断するための何らかのテストを考案できる場合は、 browser.waithttp://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に渡された関数を繰り返し呼び出して待機します。

11
Michal Charemza

これは、要素が存在するときにアクションを実行する場合、または要素がページに存在するまで待機する場合の方法です。

    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();
        });

    },
0
Zaman Afzal