Buradaki mevcut bilgi birikimine eklemek için:
JS testleri için, Capybara'nın iki iş parçacığı (biri RSpec için, biri Rails için) ve ikinci bir işlemi (tarayıcı) senkronize tutması gerekir. Bunu çoğu eşleştiricide ve düğüm bulma yönteminde (yapılandırılmış maksimum bekleme süresine kadar) bekleyerek yapar.
Kapibara da öncelikle beklemeyen yöntemlere sahiptir Node#all
. Bunları kullanmak, teknik özelliklerinize aralıklı olarak başarısız olmalarını istediğinizi söylemek gibidir.
Kabul edilen cevap öneriyor page.first('selector')
. Bu, en azından JS özellikleri için istenmeyen bir durumdur, çünkü Node#first
kullanırNode#all
.
Yani, söz konusu Node#first
olacak kadar böyle Capybara yapılandırmak eğer bekleyin:
# rails_helper.rb
Capybara.wait_on_first_by_default = true
Bu seçenek Capybara 2.5.0'da eklenmiştir ve varsayılan olarak yanlıştır.
Andrei'nin bahsettiği gibi, bunun yerine kullanmalısınız
find('selector', match: :first)
veya seçicinizi değiştirin. Her ikisi de yapılandırma veya sürücüden bağımsız olarak iyi çalışacaktır.
İşleri daha da karmaşık hale getirmek için, Capybara'nın eski sürümlerinde (veya bir yapılandırma seçeneği etkinken), #find
belirsizliği memnuniyetle yok sayacak ve sadece ilk eşleşen seçiciyi döndürecektir. Spesifikasyonlarınızı daha az açık hale getirdiği için bu da harika değil, sanırım neden artık varsayılan davranış değil. Ayrıntıları dışarıda bırakacağım çünkü yukarıda zaten tartışılmışlardı.
Daha fazla kaynak: