Bagaimana saya bisa memeriksa bahwa bidang isian prefilled dengan benar menggunakan capybara?

145

Saya memiliki bidang dengan label yang tepat yang dapat saya isi dengan capybara tanpa masalah:

fill_in 'Your name', with: 'John'

Saya ingin memeriksa nilainya sebelum mengisinya dan tidak dapat menemukannya.

Jika saya tambahkan setelah fill_inbaris berikut:

find_field('Your name').should have_content('John')

Tes itu gagal, meskipun pengisian sesaat sebelum bekerja karena saya telah memverifikasi dengan menyimpan halaman.

Apa yang saya lewatkan?

Marc-André Lafortune
sumber

Jawaban:

179

Anda dapat menggunakan kueri xpath untuk memeriksa apakah ada inputelemen dengan nilai tertentu (misalnya 'John'):

expect(page).to have_xpath("//input[@value='John']")

Lihat http://www.w3schools.com/xpath/xpath_syntax.asp untuk info lebih lanjut.

Untuk cara yang mungkin lebih cantik:

expect(find_field('Your name').value).to eq 'John'

EDIT: Saat ini saya mungkin akan menggunakan have_selector

expect(page).to have_selector("input[value='John']")

Jika Anda menggunakan pola objek halaman (seharusnya!)

class MyPage < SitePrism::Page
  element :my_field, "input#my_id"

  def has_secret_value?(value)
    my_field.value == value
  end
end

my_page = MyPage.new

expect(my_page).to have_secret_value "foo"
DVG
sumber
Ah, saya kehilangan .valuesedikit. Terima kasih!
Marc-André Lafortune
Saya mengalami masalah yang sama, tetapi dengan div daripada bidang formulir. Untuk orang lain yang memiliki masalah yang sama, gunakan nilai find_by_id (). Teks daripada find_field (). Butuh waktu lama bagi saya untuk menemukan bahwa nilai hanya bekerja di bidang formulir ...
John Y
8
Masalah dengan cara yang terakhir adalah bahwa ia tidak menggunakan siklus polling Capybara dan karena itu akan gagal secara langsung jika bidang diatur oleh kode JS yang berjalan lebih lama. Cara pertama adalah lebih disukai kecuali Anda mencoba ini pada formulir yang dihasilkan secara statis.
fqxp
1
Saya pikir @ fqxp memiliki jawaban yang lebih baik yang menggunakan Pencocokan RSpec dan sintaks ekspektasi baru. Dari apa yang saya lihat di dokumentasi, find_fielddan lainnya Node::Findersdigunakan untuk menemukan node dan melakukan tindakan pada mereka daripada harapan. Tentu saja ini bukan aturan, tetapi untuk sesuatu yang sederhana karena menggunakan solusi inbuilt adalah ide yang lebih baik. Hanya mengatakan!
Agent47DarkSoul
Benar, berharap akan menjadi cara yang disukai sekarang, namun sintaks itu dirilis sekitar sebulan setelah pertanyaan ini.
DVG
309

Solusi cantik lainnya adalah:

page.should have_field('Your name', with: 'John')

atau

expect(page).to have_field('Your name', with: 'John')

masing-masing.

Lihat juga referensi .

Catatan : untuk input yang dinonaktifkan, Anda harus menambahkan opsi disabled: true.

fqxp
sumber
23
Jauh lebih baik daripada jawaban yang dipilih!
Agent47DarkSoul
3
Saya masih lebih suka jawaban yang dipilih karena pesan kesalahan menunjukkan kepada Anda string yang diharapkan dan aktual. Ini memberikan kesalahan "bidang yang diharapkan", bidang saya "untuk mengembalikan sesuatu" kesalahan. Tapi yang ini pasti membaca lebih baik dan mengikuti pencocokan halaman API lebih baik Naik turun di sekitar !!!
mraaroncruz
1
Sejauh yang saya tahu, ini tidak benar-benar mengkonfirmasi nilai bidang, hanya keberadaan bidang terlepas dari nilai. Saya menduga itu bug karena dokumen mengatakan itu harus disaring berdasarkan nilai.
Nick
1
Melewati withpasti hanya mengembalikan true jika nilainya cocok, bagi saya, yang merupakan hasil yang diharapkan.
Ben Saufley
4
Mungkin pesan kesalahan telah diperbaiki sejak jawaban pertama kali ditulis, tetapi saya sekarang mendapatkan expected […] but there were no matches. Also found "", which matched the selector but not all filters..bidang kosong yang mendekati pesan kesalahan yang sangat bagus.
Patru
2

Jika Anda secara khusus ingin menguji pengganti, gunakan:

page.should have_field("some_field_name", placeholder: "Some Placeholder")

atau:

expect(page).to have_field("some_field_name", placeholder: "Some Placeholder")

Jika Anda ingin menguji nilai yang dimasukkan pengguna:

page.should have_field("some_field_name", with: "Some Entered Value")
Jim Stewart
sumber
0

Saya bertanya-tanya bagaimana melakukan sesuatu yang sedikit berbeda: Saya ingin menguji apakah lapangan memiliki beberapa nilai (sambil memanfaatkan kemampuan Capybara untuk menguji ulang korek api sampai cocok ). Ternyata mungkin menggunakan "blok filter" untuk melakukan ini:

expect(page).to have_field("field_name") { |field|
  field.value.present?
}
Jonleighton
sumber