Capybara'yı kullanarak açılır menüde seçenek nasıl seçilir


125

Kapibara (2.1.0) kullanarak açılır menüden bir öğe seçmeye çalışıyorum.

Numaraya göre seçmek istiyorum (yani ikinci, üçüncü, vb. Seçeneği seçin).

Her türlü şeyi denerken deli gibi Google'da aradım ama şansım yok.

Şu değeri kullanarak seçebildim:

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

Ama bu yöntemi kullanmak istemiyorum, çünkü değer değişecek ve testimi kırılgan hale getirecek bir şey.

Açılır listenin HTML'si:

<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>

Bunu da denedim:

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

Ancak şu hatayla sonuçlanır:

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

Peki açılır menüden birinci, ikinci, üçüncü vb. Seçeneklerini nasıl seçebilirim (Capybara'yı kullanarak)?

Yanıtlar:


129

Yöntemin kaynağınaselect bakarsanız, bir fromanahtarı ilettiğinizde yaptığı şeyin esasen:

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

Başka bir deyişle, bulduğu <select>sen ilgilenen yılında, o zaman bulur <option>o zaman, bu dahilinde çağrıları select_optionüzerine <option>düğüm.

İlk iki şeyi zaten yaptınız, onları yeniden düzenlerdim. O zaman select_optionsonunda yöntemi uygulayabilirsiniz:

find('#organizationSelect').find(:xpath, 'option[2]').select_option

1
Çok teşekkürler Carol! Yardımın için gerçekten minnettarım! : D
Farooq

2
Gelecekte bunu araştıranlar için bu referansı eklemek isterim: gist.github.com/zhengjia/428105
BKSpurgeon

3
Mükemmel cevap! Rails 5'de siz de şu şekilde yapabiliriz eklemek istiyoruz: select('option_name', from: 'select_box'). Değerlerin olabileceği yerler: id, ad, ilgili etiket öğesi. Sen Capybara ve DSL seçenekleri hakkında daha fazla bilgi edinebilirsiniz burada .
Nesha Zoric

178

Nedense benim için işe yaramadı. Bu yüzden başka bir şey kullanmak zorunda kaldım.

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

benim için çalıştı.


1
Tuhaf, yöntem en az 3 seçenek gibi göründüğü için bu benim için işe yaramıyor. Önerdiğiniz kod, capybara kılavuzundaki örnek kodla eşleşse de.
Linus

1
değil form, öyle from. İşte select
fontno

3
Belki de kayda değer değerin adı, kimliği veya etiket metnidir. ör. "# kuruluşSeçimi" yanlış, ancak "kuruluş Seçimi" çalışmalıdır.
MZB

Bu benim için işe yaramadı, ancak carols10cents'ın çözümü işe yaradı. Bu, cevabınızın eleştirisi değil. Kapibara'nın en son sürümünde bile, bazı çağrıların işe yaraması ve bazı çağrıların, intution birden fazla çözümün geçerli göründüğüne inanmanıza yol açsa bile çalışmamasını gerçekten garip buluyorum. Beni deli ediyor. Bu, firefox ile mi ilgili (veya capybara hangi tarayıcıyı kullanırsa)?
kaostheory

Bunun yalnızca seçenek adı ve seçenek değeri aynı olduğunda işe yarayacağını düşünüyorum.
pixelearth

8

başka bir seçenek de bunun gibi bir yöntem eklemektir

  def select_option(css_selector, value)
    find(:css, css_selector).find(:option, value).select_option
  end

Yararlı seçeneklerfind("select[name='organization_search[role]']").find(:option, text: :Staff).select_option
pixelearth

find(:css, "#search_field").find(:option, "Opp Last Name").select_option, görüntülenen seçenek metni olan, seçeneğin değeri işe yaramadı.
codenoob

4

Maalesef en popüler cevap benim için tamamen işe yaramadı. İfadenin .select_optionsonuna eklemek zorunda kaldım

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

olmadan select_optionseçim yapılmıyordu


Yöntem bir boole değeri döndürdüğüne göre .select_option, nasıl olur da çağırabilirsiniz select?
Ruby

4

Yığına başka bir yanıt daha eklemek için (çünkü görünüşe göre kurulumunuza bağlı olarak bunu yapmanın pek çok yolu var) - değişmez optionöğeyi seçip tıklayarak yaptım

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

Çok hoş değil ama işe yarıyor: /


2

2017'de capybara 2.7 ile cevapların hiçbiri benim için işe yaramadı. "ArgumentError: yanlış sayıda bağımsız değişken (verilen 2, 0 bekleniyordu)" aldım

Ama bu yaptı:

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

0

Doğrudan bir cevap değildir, ancak şunları yapabilirsiniz (sunucunuz izin veriyorsa):

1) Kuruluşunuz için bir model oluşturun; ekstra: HTML'nizi doldurmak daha kolay olacaktır.

2) Modeliniz için bir fabrika (FactoryGirl) oluşturun;

3) Fabrika ile bir liste (create_list) oluşturun;

4) Listeden bir Kuruluşu 'seçin' (örnekleyin):

# 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... 

4
bir model oluşturmam gerekiyorsa, capybara kullanmanın bir anlamı yok
user1735921

Bu hiç de bir cevap değil. Bu Capybara hakkında bir soru.
Robin daugherty

0

İşte bulduğum en kısa yol (capybara 3.3.0 ve krom sürücüsü kullanarak):

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

2. seçeneği seçecektir. Dizini gerektiği gibi artırın.


0

Capybara'da sadece xpath ile bul kullanabilirsiniz

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

ve yöntem tıklama

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.