1

ここにはsimilar questionsがあることは知っていますが、私の人生には意味がありません。分裂器で約束を待つ必要はありますか?

ここでは、ボタンをクリックしてURLを確認する必要がある例を示します。

私の最初に考えたのは、私がインクルードが期待.clickについてその約束が、何を扱う知っている私は

element(by.id('button')).click(); 
expect(browser.getCurrentUrl()).toContain('asyncisconfusing'); 

としてそれを記述しているのですか?このように書く必要はありませんか?

element(by.id('button')).click().then(() => { 
    expect(browser.getCurrentUrl()).toContain('asyncisconfusing') 
}) 

これは自動で行われますか?理論的には

答えて

5

Protractorは、テスト対象のAngularJSアプリケーションと同期でControl Flow作品を通じて約束のキューを維持するので、あなたがさらなる処理のための真の価値を必要とする場合を除き、明示的に約束を解決してはいけません。明示的を発行時折ランダムタイミングに対処するのに役立ちますclick()約束を解決する、またはbrowser.wait()を経由して明示的に待機を追加する、しかし実際には

element(by.id('button')).click(); 
expect(browser.getCurrentUrl()).toContain('asyncisconfusing'); 

:他の言葉では、これはprefferred形式でなければなりません。

+0

コントロールフローがキューであるため、Gotcha。これらのタイミングの問題は、制御フローの外にあるものを実行することによって引き起こされます。あるいは、私たちが頼りにすべきではない何かのコントロールフローオーダーですか? – Dinny

+0

@Dinny私たちはまだすべきですが、現実世界では、まだ特別な治療が必要な場合があります。たとえば、クライアントサイドのアニメーションやブラウザーが最大化されていない、ネットワークが遅い、または不安定な問題などが発生すると、テストフローが予想以上に自然なものにならない可能性があります。たとえば、テスト対象のAngularアプリケーションがありますが、コードベースのさまざまな部分で、たとえば、要素がクリック可能または表示可能になるのを待つ場合や、現在のURLを含むようにbrowser.wait()を追加する必要があった場合予想される部分文字列。いくつかの場所では、 'click()。then()'部分も持っています。 – alecxe

+0

それは理にかなっています。私たちは約束を明示的に解決し、可能ならば 'browser.wait()'を使うべきですか?問題に遭遇した場合は、これ以上のケースですか? – Dinny

関連する問題