Capybaraは動的に追加されたDOM要素を認識していませんか?
-
28-09-2019 - |
質問
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