Untuk menambah badan pengetahuan yang ada di sini:
Untuk pengujian JS, Capybara harus menjaga dua utas (satu untuk RSpec, satu untuk Rails) dan proses kedua (browser) selaras. Ini dilakukan dengan menunggu (hingga waktu tunggu maksimum yang dikonfigurasi) di kebanyakan matcher dan metode pencarian node.
Kapibara juga memiliki metode yang tidak perlu menunggu Node#all
. Menggunakannya seperti memberi tahu spesifikasi Anda bahwa Anda ingin mereka sesekali gagal.
Jawaban yang diterima menyarankan page.first('selector')
. Ini tidak diinginkan, setidaknya untuk spesifikasi JS, karena Node#first
menggunakanNode#all
.
Yang mengatakan, Node#first
akan menunggu jika Anda mengkonfigurasi kapibara seperti ini:
# rails_helper.rb
Capybara.wait_on_first_by_default = true
Opsi ini telah ditambahkan di Capybara 2.5.0 dan salah secara default.
Seperti yang disebutkan Andrei, Anda sebaiknya menggunakan
find('selector', match: :first)
atau ubah pemilih Anda. Keduanya akan bekerja dengan baik terlepas dari konfigurasi atau drivernya.
Untuk lebih memperumit masalah, di versi lama Kapibara (atau dengan opsi konfigurasi diaktifkan), #find
dengan senang hati akan mengabaikan ambiguitas dan hanya mengembalikan pemilih pencocokan pertama. Ini juga tidak bagus, karena membuat spesifikasi Anda kurang eksplisit, yang menurut saya adalah mengapa tidak ada lagi perilaku default. Saya akan mengabaikan spesifikasinya karena mereka sudah dibahas di atas.
Sumber daya lainnya: