0

Capybaraには待機中および待機中の機能があります。私は可能な限り最初のものを使用しようとしています。CapybaraのCSS要素の待機機能

find(またはその派生語の1つ)を使用して非同期に表示されるCSS要素を探す方法はありますか?残念ながら、関数page.has_css?は待機していない関数です。

+1

メソッド 'find'は既に見つかる要素。テストにはロジックが含まれてはならないので、要素または 'page.assert_selector( '#foo'、:count => 0)を待つために' page.assert_selector( '#foo'、:count => 1) ) 'なしを待つ。 @FlorentB。 –

+1

'page.assert_selector( '#foo'、:count => 0)'は、通常、 'page.assert_no_selector( '#foo')'と書かれています。 'page.assert_no_selector( '#foo'、count:3)' –

答えて

2

page.has_css?が待機していない機能であるという申し立ては正しくありません。 page.has_css?は、ページに要素が表示されるまでには、Capybara.default_max_wait_time秒まで待機し、要素がその時間内にページにあるかどうかに基づいて、trueまたはfalseを返します。従って、与えられるCapybara.default_max_wait_time = 5

if page.has_css?("div#my_div") 
    puts "on page" 
else 
    puts "not on page" 
end 

は5秒まで待つでしょう。 "my_div"のIDを持つdivがページに表示されるとすぐ、 "ページ上に"印刷されます。一致するdivが5秒以内に表示されない場合は、「ページには表示されません」と表示されます。あなたはそれが特定のコールのために長く待つしたい場合は、要素はあなたが

page.assert_selector(:css, 'div#my_div') # :css is the default so can usually be omitted 
page.assert_css('div#my_div') # minitest 
expect(page).to have_css('div#my_div') # RSpec 
のいずれかを行うことができますが存在することを確認したいブール応答を望むのではなく場合は、 :waitオプション

if page.has_css?("div#my_div", wait: 10) # will wait up to 10 seconds 
    ... 

を渡すことによってdefault_max_wait_timeを上書きすることができます要素が

表示されない場合は、実際の要素が必要な場合は、私たちできる要素が以前のように表示されるのを待ちますが、例外を発生させるのではなくfalseを返します

e findも待機します。したがって

el = page.find(:css, 'div#my_div') # :css is the default and can usually be omitted 

は、要素が表示されるのを待機し、見つかった場合に要素を返します。要素がdefault_max_wait_time秒以内に見つからない場合、例外が発生します。

注:基本的には、唯一の非待機方法がallfirstあり、さらにはそれらの要素から返されたものの、あなたはカウントオプション(:count:minimum:maximum:between)のいずれかに合格した場合待機させることができますそれらは依然として再ロード不可能であり、したがってスコープなどに使用される場合、さらなる動作効果を有する可能性がある。click_link,などのメソッドでさえ、find(...).clickなどとして実装されるので待機する。

関連する問題