ここで既存の知識体系に追加するには:
JS テストの場合、Capybara は 2 つのスレッド (1 つは RSpec 用、もう 1 つは Rails 用) と 2 つ目のプロセス (ブラウザー) を同期させておく必要があります。これは、ほとんどのマッチャーとノード検索メソッドで (構成された最大待機時間まで) 待機することによって行われます。
カピバラには、主に待機しないメソッドもありますNode#all
。それらを使用することは、断続的に失敗することを仕様に伝えるようなものです。
受け入れられた答えは示唆してpage.first('selector')
います。Node#first
これはNode#all
、少なくとも JS 仕様では望ましくありません。
つまり、次のように Capybara を構成Node#first
すると待機します。
# rails_helper.rb
Capybara.wait_on_first_by_default = true
このオプションはCapybara 2.5.0で追加され、デフォルトでは false です。
アンドレイが述べたように、代わりに使用する必要があります
find('selector', match: :first)
またはセレクターを変更します。構成やドライバーに関係なく、どちらもうまく機能します。
さらに複雑なことに、古いバージョンの Capybara (または構成オプションが有効になっている) では、#find
あいまいさを喜んで無視し、最初に一致したセレクターを返すだけです。これも、仕様が明確でなくなるため、あまり良くありません。これが、デフォルトの動作ではなくなった理由だと思います。詳細については既に説明済みであるため、ここでは省略します。
その他のリソース: