2011-11-17 6 views
6

私は、統合テストのために私のレールアプリケーションをテストするためにcapybaraを使用しています。 私のアプリケーションには、多くのLightboxとAjaxとjs呼び出しがあります。カピバラのシナリオで待機条件を追加するには?

@javascript 
    Scenario: I agree functionatilty 
    Given I go to the create account page 
    When I click on button which is given as image "lnkTerms2" 
    And I follow "i_agree" 
    Then I go to the create account page 

ここで上記のコードlnkTerms2であるとライトボックスを開くには、JS関数を呼び出すのに役立つだろうID。 と私はエラーを取得しています問題はwebdriverを中に呼び出され、この関数である

Element is not currently visible and so may not be interacted with (Selenium::WebDriver::Error::ElementNotDisplayedError) 
     [remote server] resource://fxdriver/modules/atoms.js:9519:in `unknown' 
     [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/[email protected]/components/nsCommandProcessor.js:256:in `unknown' 
     [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/[email protected]/components/nsCommandProcessor.js:305:in `unknown' 
     [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/[email protected]/components/nsCommandProcessor.js:320:in `unknown' 
     [remote server] file:///tmp/webdriver-profile20111117-6876-18cfcfp/extensions/[email protected]/components/nsCommandProcessor.js:197:in `unknown' 
     (eval):2:in `send' 
     (eval):2:in `click_link' 
     ./features/step_definitions/web_steps.rb:300:in `/^I click on button which is given as image "([^"]*)"$/' 
     features/Sign_up_process.feature:61:in `When I click on button which is given as image "lnkTerms2"' 

として、それはJavaScriptとAjaxの呼び出しをロードする時間が取得されていません。 ライトボックスが開いていません。 だから私には何か解決策を提案してください。また

私はそれがJSをロードするための時間を取得して、それが正常に動作しているラインに4〜5文の後

When I click on button which is given as image "lnkTerms2" 

を書くと仮定します。 AJAX試みを待つステップの後のポーズのために

答えて

3

And I wait 5 seconds 

あなたは、次のコードをweb_steps.rbに追加する必要があります。

シナリオことを期待しての秒の固定された数のを待っ
When /^I wait (\d+) seconds?$/ do |seconds| 
    sleep seconds.to_i 
end 
+4

これは良い解決策ではありませんが、テスト実行に強制的な遅延を追加します。再使用すると、時間がかかることがあります。 この問題を解決する適切な方法は、要素が表示されるまで待つことです。 – Benja

+4

固定スリープの任意の形式は、シナリオが実際にその特定の時間量を待つことを含むユーザーエクスペリエンスに関するシナリオでない限り(シナリオがディスプレイを更新するのを待つのではなく、シナリオから値を取っているとしても大したことではありません。例えば、 '同期') –

1

それはランダムなテストの失敗につながる可能性があるので、十分に速いですが、最高の戦略ではありません。私はいくつかの条件が代わりに満たされるまで待機することをお勧めします:

And I wait until '#meow' is visible 

#... 
When /^I wait until '([^']+)' is visible$/ do |selector| 
    wait_until do # you can also specify timeout here 
    find(selector).visible? 
    end 
end 
+7

capybara 2ではwait_untilは利用できません2 –

+0

固定待機の一般的な点は間違いありません。 wait_untilを削除した理由はhttps://groups.google.com/forum/?fromgroups=#!topic/ruby-capybara/qQYWpQb9FzYこちらを参照してください。 –

+2

このwait_untilの代わりに 'find(selector)'で十分です。 'もし' Capybara.ignore_hidden_​​elements = true'をブロックします。それが偽であれば、 'find(selector、visible:true)'を使うことができます。 –

12

は、一般的に、固定スリープ/待機は彼らが脆いスクリプトで結果、遅いスクリプト、または多くの場合、その両方という強引なアプローチです。..悪いことです。長い時間を設定しないと、時折テストが中断します。長すぎるとテストが中断されることはありませんが、すべての固定された親指の時間がゆっくりと遅くなります。

の世話をするのいずれか

ほとんど自動化ツールにいくつかの方法のいくつかの例を提供し、自動的に待機している、または彼らは

A recent blog posting by JNicklas explanesあなたのアプリで、この点でカピバラにはいくつかの最近の変更をスクリプトを同期するために、より優雅な方法を提供いくつかの特別な場合には特定の待機条件タイプのコードを実行し、一般的には、ツールや、物事を待つこと、Ajaxのアクション、および同期を処理する方法について詳しく知ることをお勧めします。

関連する問題