Aby dodać do istniejącej wiedzy tutaj:
W przypadku testów JS Capybara musi utrzymywać synchronizację dwóch wątków (jednego dla RSpec, jednego dla Railsów) i drugiego procesu (przeglądarki). Odbywa się to poprzez czekanie (do skonfigurowanego maksymalnego czasu oczekiwania) w większości dopasowań i metod wyszukiwania węzłów.
Kapibara ma również metody, które przede wszystkim nie czekają Node#all
. Korzystanie z nich jest jak mówienie specyfikacjom, że chcesz, aby okresowo zawodziły.
Przyjęta odpowiedź sugeruje page.first('selector')
. Jest to niepożądane, przynajmniej w przypadku specyfikacji JS, ponieważ Node#first
używaNode#all
.
Powiedział, że Node#first
będzie czekać, jeśli skonfigurować Capybara tak:
# rails_helper.rb
Capybara.wait_on_first_by_default = true
Ta opcja została dodana w Kapibara 2.5.0 i domyślnie jest fałszywa.
Jak wspomniał Andrei, powinieneś zamiast tego użyć
find('selector', match: :first)
lub zmień selektor. Albo będzie działać dobrze niezależnie od konfiguracji lub sterownika.
Aby jeszcze bardziej skomplikować sprawę, w starszych wersjach Kapibary (lub z włączoną opcją konfiguracji) #find
z radością zignoruje niejednoznaczność i zwróci pierwszy pasujący selektor. To też nie jest świetne, ponieważ sprawia, że twoje specyfikacje są mniej wyraźne, co, jak sądzę, jest powodem, dla którego nie jest już domyślnym zachowaniem. Pominę szczegóły, ponieważ zostały już omówione powyżej.
Więcej zasobów: