質問

CapybaraとSeleniumを使用する際に、JQueryで行う滑らかなJavaScriptのことをテストするのに苦労しているようです。予想される動作は、ユーザーがリンク「リソースの追加」をクリックすると、フォームが動的に生成されることです。 Capybaraはリンクをクリックすることができますが、新しいフォーム要素(つまり "Resource [name])を認識できません。

CapybaraのDOMをリロードする方法はありますか、それとも私がまだ学んでいないこの宝石の要素がありますか?

前もって感謝します!

== edit ==

現在、Seleniumの運を試しています:

wait_for_element 

方法。

== edit ==

以下を実行しようとする際に、「nillクラスのために「wait_for_element」」を取得し続けます。

@selenium.wait_for_element

その特定の方法、あるいはおそらくそうです wait_for DOM要素にアクセスする巨大なセレクターが私が期待するのは正しい行動方針ですが、今ではSeleniumセッションを取得しようとすることは大きな頭痛の種になり始めています。

役に立ちましたか?

解決

私はRSPECのCapybaraにWebDriverベースのドライバーを使用しています。これをこのように構成して使用し、JSを確実に処理し、DOMのリロードを必要としません。重要なのは、wait_untilと、ajaxの応答が終了したときに真の条件を使用することです。

before(:each) do
  select_driver(example)  
  logout
  login('databanks') 
end

 def select_driver(example)
   if example.metadata[:js]
    Capybara.current_driver = :selenium
  else
    Capybara.use_default_driver
  end
end

it "should let me delete a scenario", :js=>true do
    select("Mysite Search", :from=>'scenario_id')  
    wait_until{ page.has_content?('mysite_searchterms')}    
    click_on "delete"     
    wait_until{ !page.has_content?('mysite_searchterms')}   
    visit '/databanks'
    page.should_not have_content('Mysite Search')
  end

また、SLO-MOで物事を見たい場合は、このように昨夜WebDriverを遅くするためのハックを見つけました。

   #set a command delay
   require 'selenium-webdriver'

   module ::Selenium::WebDriver::Remote
     class Bridge
       def execute(*args)
         res = raw_execute(*args)['value']
         sleep 0.5
         res
       end
     end
   end  

他の誰かが述べたように、あなたが要素を待っているタイムアウトを取得している場合、あなたはこれを上げることを見ることができます:

Capybara.default_wait_time = 10

他のヒント

カピバラのドキュメントから:

非同期JavaScriptを使用する場合、ページにまだ存在していない要素と対話しようとしている状況に遭遇する可能性があります。 Capybaraは、要素がページに表示されるのを待つことで、自動的にこれを扱います。

待ち時間を増やす運があるかもしれません:

Capybara.default_wait_time = 10

それが役に立たない場合は、GitHubのプロジェクトの誰かに連絡するか、メーリングリストに書き込み、発行レポートを提出するようにあなたに取り組みます。

wait_untilでさえ、Capybara 2.0から削除されました。それでもそれは便利で、下からコードをつかむ:

 def wait_until(delay = 1)   
 seconds_waited = 0   
 while ! yield && seconds_waited < Capybara.default_wait_time     
    sleep delay     
    seconds_waited += 1   
  end   
  raise "Waited for #{Capybara.default_wait_time} seconds but condition did not become true" unless yield 
end
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top