2011-11-02 21 views
5

selectタグからオプションを選択してテストしようとしています(これらのオプションはリモートデータベースサーバから取得されます)。ウェブサイトとの通常の交渉中に、このドロップダウンに入力するのに数分の1秒以上かかることはありません。私は次のテストを実行したときしかし、私は次のエラーを取得する CapybaraがAjaxリクエストの完了を待っていない

 


    When /^(?:|I)select "([^"]*)" from "([^"]*)" in search form$/ do |value, field| 
     within "#select_container" do 
     save_and_open_page 
     page.should have_css("#criteria_div_code > option:nth-child(10)") 
     select(value, :from => field) 
     end 
    end 

 

は、

expected css "#criteria_div_code > option:nth-child(10)" to return something (RSpec::Expectations::ExpectationNotMetError)

ドロップダウンには、少なくとも20個のオプションが移入されたので、私はただの存在をテスト10番目のオプション(現在は)。

save_and_open_pageは、少なくとも10個ではなく1個のオプション(デフォルトオプション)が存在することを示しているため、「ExpectionNotMetError」が表示されます。

Capybara.default_wait_time = 30 - リストが作成されるのに十分な時間。

カピバラは、ajaxコールが終了するのを待っていませんか?

ここに何か不足していますか?カピバラはブロックし、ページと相互作用した後終了するAjaxリクエストを待つことができます -

+0

シナリオに「@ javascript」とタグを付けましたか? – Chowlett

答えて

0

私は

describe 'some stuff which requires js', :js => true do 
    it 'will use the default js driver' 
    it 'will switch to one specific driver', :driver => :celerity 
end 

はまた、次の行に注意してください、あなたはAjaxのテストのために、ユーザのjsドライバに必要と思います。この動作を有効にするには、:resynchronize driverオプションをtrueに設定します。

2

ajax再同期Using Capybara for AJAX integration testsのタイムアウトを設定することに私の反応をチェックしたいかもしれません。再同期のタイムアウトはデフォルトで10秒に設定されており、その時間より前に応答が返ってこない場合は特に、コンフィグレーションで:resynchronizeをfalseに設定した場合、応答は得られません。以前に設定した場合:falseに再同期、あなたはこれをtrueに設定する必要があり、以下のようタイムアウト

Capybara.register_driver :selenium do |app| 
    Capybara::Selenium::Driver.new(app, :browser => :firefox, :resynchronization_timeout => 1000) 
end 

NOTEを設定するためのスニペットです。

+2

'Capybara'バージョン2.0.3では、このエラーが発生します:' unknownオプション:{:resynchronization_timeout => 1000}(ArgumentError) ' – etagwerker

+0

あなたが正しいです。 :synchronizeオプションはSeleniumドライバから削除されているため、新しいバージョンのSeleniumドライバではうまく動作しません。上記の解決策は2.0.3未満のCapybaraバージョン用で、古いバージョンのSeleniumドライバを伴いました。 –

関連する問題