Cara memilih opsi drop down menggunakan Capybara

125

Saya mencoba memilih item dari menu drop-down menggunakan Capybara (2.1.0).

Saya ingin memilih berdasarkan nomor (artinya pilih opsi kedua, ketiga, dll).

Saya sudah googled seperti orang gila mencoba segala macam hal tetapi tidak berhasil.

Saya dapat memilihnya dengan menggunakan nilai:

 find("option[value='4c430d62-f1ba-474f-8e8a-4452c55ea0a8']").click

Tapi saya tidak ingin menggunakan metode itu b / c nilainya adalah sesuatu yang akan berubah dan itu akan membuat tes saya rapuh.

HTML untuk drop down adalah:

<td class="value">
    <select name="organizationSelect" id="organizationSelect" class="required">
     <option value="NULL">Choose...</option>
     <option value="4c430d62-f1ba-474f-8e8a-4452c55ea0a8">&nbsp;Institution1</option>
     <option value="e1a4efa7-352d-410a-957e-35c8a3b92944">&nbsp;Institution / test</option>
    </select>
</td>

Saya juga mencoba ini:

  option = find(:xpath, "//*[@id='organizationSelect']/option[2]").text  
  select(option, :from => organizationSelect)

Tapi itu menghasilkan kesalahan ini:

Ambiguous match, found 2 elements matching option "Institution" (Capybara::Ambiguous)

Jadi bagaimana saya bisa memilih opsi pertama, kedua, ketiga, dll dari drop down (menggunakan Capybara)?

Farooq
sumber

Jawaban:

129

Jika Anda melihat sumber selectmetode ini , Anda dapat melihat apa yang dilakukannya ketika Anda memberikan fromkunci pada dasarnya:

find(:select, from, options).find(:option, value, options).select_option

Dengan kata lain, ia menemukan <select>Anda sedang di minati, kemudian menemukan <option>dalam itu, maka panggilan select_optionpada <option>simpul.

Anda sudah cukup banyak melakukan dua hal pertama, saya hanya mengatur ulang mereka. Kemudian Anda bisa memakukan select_optionmetode di bagian akhir:

find('#organizationSelect').find(:xpath, 'option[2]').select_option
carols10cents
sumber
1
Terima kasih banyak, Carol! Sangat menghargai bantuannya! : D
Farooq
2
Ingin menambahkan referensi ini untuk mereka yang meneliti ini di masa mendatang: gist.github.com/zhengjia/428105
BKSpurgeon
3
Jawaban bagus! Saya ingin menambahkan bahwa dalam Rails 5 Anda dapat melakukannya dengan cara berikut juga: select('option_name', from: 'select_box'). Di mana nilainya dapat: id, nama, elemen label terkait. Anda dapat membaca lebih lanjut tentang opsi Capybara dan DSL di sini .
Nesha Zoric
178

Untuk beberapa alasan itu tidak berhasil untuk saya. Jadi saya harus menggunakan sesuatu yang lain.

select "option_name_here", :from => "organizationSelect"

bekerja untukku.

RVM
sumber
1
Aneh, itu tidak berhasil bagi saya karena metode ini tampaknya mengambil setidaknya 3 opsi. Meskipun kode yang Anda sarankan cocok dengan kode contoh dari panduan capybara.
Linus
1
bukan form, bukan from. Berikut adalah dokumentasi pada select
fontno
3
Mungkin yang patut dicatat dari nilai adalah nama, id, atau teks label. yaitu "#organizationSelect" tidak benar, tetapi "organizationSelect" harus bekerja.
MZB
Ini tidak berhasil untuk saya, tetapi solusi carols10cents berhasil. Ini bukan kritik atas jawaban Anda. Saya hanya merasa sangat aneh bahwa bahkan pada versi terbaru dari capybara, beberapa panggilan berfungsi dan beberapa panggilan bahkan ketika intution akan membuat Anda percaya bahwa banyak solusi terlihat valid. Itu membuatku gila. Apakah ini terkait dengan firefox (atau browser capybara apa pun yang akhirnya menggunakan)?
chaostheory
Saya pikir ini hanya akan berfungsi ketika nama opsi dan nilai opsi sama.
pixelearth
8

Pilihan lain adalah menambahkan metode seperti ini

  def select_option(css_selector, value)
    find(:css, css_selector).find(:option, value).select_option
  end
montrealmike
sumber
Opsi bermanfaatfind("select[name='organization_search[role]']").find(:option, text: :Staff).select_option
pixelearth
find(:css, "#search_field").find(:option, "Opp Last Name").select_option, yang merupakan teks opsi yang ditampilkan, bekerja untuk saya, sedangkan nilai opsi tidak.
codenoob
4

Sayangnya, jawaban yang paling populer tidak bekerja sepenuhnya untuk saya. Saya harus menambahkan di .select_optionakhir pernyataan

select("option_name_here", from: "organizationSelect").select_option

tanpa select_option, tidak ada pilih yang dilakukan

Sam D
sumber
Kenapa Anda bisa menelepon .select_option, karena selectmetode mengembalikan nilai boolean?
Ruby
4

Untuk menambahkan jawaban lain pada tumpukan (karena ternyata ada begitu banyak cara untuk melakukannya tergantung pada pengaturan Anda) - Saya melakukannya dengan memilih optionelemen literal dan mengkliknya

find(".some-selector-for-dropdown option[value='1234']").select_option

Ini tidak terlalu cantik, tetapi berfungsi: /

pengguna2490003
sumber
2

tidak ada jawaban yang bekerja untuk saya pada tahun 2017 dengan capybara 2.7. Saya mendapat "ArgumentError: jumlah argumen salah (diberikan 2, diharapkan 0)"

Tapi ini berhasil:

find('#organizationSelect').all(:css, 'option').find { |o| o.value == 'option_name_here' }.select_option
bjelli
sumber
0

Ini bukan jawaban langsung, tetapi Anda bisa (jika server Anda mengizinkan):

1) Buat model untuk Organisasi Anda; ekstra: Akan lebih mudah untuk mengisi HTML Anda.

2) Buat pabrik (FactoryGirl) untuk model Anda;

3) Buat daftar (create_list) dengan pabrik;

4) 'pilih' (sampel) Organisasi dari daftar dengan:

# Random select
option = Organization.all.sample 

# Select the FIRST(0) by id
option = Organization.all[0] 

# Select the SECOND(1) after some restriction
option = Organization.where(some_attr: some_value)[2]
option = Organization.where("some_attr OP some_value")[2] #OP is "=", "<", ">", so on... 
David V. Teixeira
sumber
4
jika saya harus membuat model, tidak ada gunanya menggunakan capybara
user1735921
Itu sama sekali bukan jawaban. Ini pertanyaan tentang Capybara.
Robin Daugherty
0

Inilah cara paling ringkas yang saya temukan (menggunakan capybara 3.3.0 dan driver chromium):

all('#id-of-select option')[1].select_option

akan memilih opsi ke-2. Tambahkan indeks sesuai kebutuhan.

pduey
sumber
0

Di Capybara, Anda hanya dapat menggunakan find dengan xpath

find(:xpath, "//*[@id='organizationSelect']/option[2]").click

dan klik metode

Alexandr
sumber