0

短編小説: レタスとトゲを使って django アプリの機能テストを書いています。ステップ呼び出しでの同期の欠如により、シナリオは失敗します。

質問: ステップに人為的な待ち時間を追加せずに、このエラーが発生しないようにする方法はありますか?

長い話: このシナリオでは、既存のユーザーがログインできるかどうかを確認します。

Scenario: User exists as admin
    Given I access the url "/login/"
    And The user "someuser" with password "something" exists as admin
    When I fill username with "someuser" and password with "exists"
    And I submit the form        
    Then I see the paragraph "You're successfully logged in!"

ここでの重要なステップは次のとおりです。

@step(r'I see the paragraph "(.*)"')
def see_paragraph(step, text):
    assert text in world.browser.html

レタス機能を収穫すると、ランダムに失敗します。

Traceback (most recent call last):
  File "/usr/local/lib/python2.7/dist-packages/lettuce/core.py", line 143, in __call__
    ret = self.function(self.step, *args, **kw)
  File "/vagrant/src/enext/apps/auth/features/authentication-steps.py", line 21, in see_paragraph
    assert text in world.browser.html
AssertionError

デバッグしようとすると、応答を出力すると毎回動作することがわかったので、エラーを再現できませんでした。一時停止を追加することもうまくいくようです。

@step(r'I see the paragraph "(.*)"')
def see_paragraph(step, text):
    # print world.browser.html.encode('utf-8')
    # either the next or the previous line fixes it
    time.sleep(0.3)
    assert text in world.browser.html

最初は、テスト データベースのフラッシュに関連しているように見えましたが、他のシナリオとフラッシュも削除したところ、引き続き発生しました。

4

1 に答える 1

2

それはあなたが作るものに依存するかもしれませんAnd I submit the form。このステップで「送信」ボタンなどをクリックすると、そこから問題が発生します。

Webdriver は、クリックやその他の「ページ上」の操作を除くほとんどすべてのアクションの後、ページが読み込まれるのを待ちます。したがって、クリック後、応答を待たずにすぐに要素の存在を探します。

解決策として、 splinter docswait_timeで説明されているように引数を使用するか、指定されたタイムアウトまでステートメントをチェックするループに入る独自の関数を作成することをお勧めします。

PS: python seleniumも参照することをお勧めします。wait(browser, timeout).until(some_statement)

于 2013-07-21T21:32:45.263 に答える