2016-07-25 19 views
0

私のレールアプリケーションの統合テストを作成しています。Capybara - NameError:初期化されていない定数Capybara :: TimeoutError

私がやっているアプリケーションは少し遅いです。私のテストでは、ウェブサイト内の特定のアクション(ページの最後にリロードする「保存」)を実行し、ページが実際にリロードされる前に次のカピバラアクションが実行されます。

「リロード」自体がフリーズするので、「スリープ(秒)」は使用できません。

だから私はこのgithubのアイデアを試してみると思った:https://gist.github.com/metaskills/1172519

が、私は次のエラーを取得:私はこのエラーを取得し、それが何を意味し、なぜ

NameError: uninitialized constant Capybara::TimeoutError

を誰かが私に言うことはできますか?

+1

これはメソッドではありません。これは定数です。あなたは何をしようとしているのですか?コードを投稿してください – siegy22

+0

@RaVeNありがとうございます。ページを更新しました –

答えて

0

あなたが投稿したときに、ajaxリクエストが完了するのを待つメソッドを作成しようとしています。

しかし、これを行うには良い方法があります:

あなたはモーダル(Ajaxでリモートに、)ロードビューを持っています。 wait_untilメソッドのような操作をしないでください。またはwhile trueを使用していない場合でも。

これを行うための最善の方法、モーダルコンテンツに独自のHTML要素を設定することです:

<!-- in your modal view/partial --> 
<span id="modal"></span> 
... modal code 

あなたは、このようカピバラを使用する場合:

find("#modal") 

find方法が自動的に待機すべてのAjaxリクエストが終了するようにします。

詳細については、https://www.varvet.com/blog/why-wait_until-was-removed-from-capybara/を参照してください。

+0

RaVeNありがとうございます。しかし、前のページと同じページの読み込みを待っていたらどうなりますか?実際、私のスクリプトでは、関連するID番号を持つページを単にリロードする「新しい」ボタンがあります。私が "find"を使うと、ページをリロードする前にその要素を見つけることができます(これはどういうことでしょう)。 –

+0

次に、別のdomオブジェクトを使って、ロードされているページで一意であるものを見つけてください。 – siegy22

0

Capybara::TimeoutErrorクラスがCapybara v2で、#wait_untilメソッドとともに削除されたためです。 @RaVeNの回答として、あなたはCapybaraにページ上のいくつかのコンテンツや要素を期待して、Capybaraが自動的に表示されるのを待つようにしておくべきです(JS対応ドライバを使用している限り)。

expect(page).to have_content("Some content that appears after the page has loaded") # will wait up to Capybara.default_max_wait_time seconds for the content to appear 

またはページの変更のパスはあなたがわきとして

expect(page).to have_current_path('<the new path you want to wait to load>') 

を行うことができれば - テスト、アプリ、ブラウザため、別のスレッド/プロセスの各実行をページの読み込みを一時停止しなければならないテストでない理由sleepはありませんJS対応ドライバを実行していると仮定します。 JS対応ドライバを実行しておらず、代わりにデフォルトのrack_testドライバを使用している場合は、すべての動作が同期して行われるため、待機/スリープすることは無意味です。

+0

Tom。しかし、前のページと同じページの読み込みを待っていたらどうなりますか?実際、私のスクリプトでは、関連するID番号を持つページを単にリロードする「新しい」ボタンがあります。私が "find"を使うと、ページをリロードする前に要素を見つけることができます(これはどういうことでしょう)。 –

+0

ページが真実ならば、本当に簡単にできることは数秒間眠るかテストしないことです。ページに表示されるロードインジケータがない(カピバラが消えるまで待つことができます)か、URLに違いはありませんか?どのようなやり方でも進歩を示さずにページをリロードするボタンを持つのは奇妙なUIのようです。 –

+0

トムありがとう。はい、別のURLでリロードします:ボタンはmysqlの新しい行を作成し、新しいIDをURLとして示すページをリロードします。問題は、「スリープ」*がページをリロードする前にページをフリーズする*ことです。したがって、 "スリープ"が完了すると、ページは正しくリロードされますが、* find( "id = ...")*は速すぎて "reload"が開始する前にページをチェックします(そして、ページに表示されます)。 –

関連する問題