So wählen Sie eine Option in einem Dropdown-Menü mit Capybara aus


125

Ich versuche, mit Capybara (2.1.0) einen Eintrag aus einem Dropdown-Menü auszuwählen.

Ich möchte nach Nummer auswählen (dh die zweite, dritte usw. Option auswählen).

Ich habe wie verrückt gegoogelt und alle möglichen Dinge ausprobiert, aber kein Glück.

Ich konnte es mit dem Wert auswählen:

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

Aber ich möchte diese Methode nicht verwenden, da sich der Wert ändert und mein Test spröde wird.

Der HTML-Code für das Dropdown-Menü lautet:

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

Ich habe es auch versucht:

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

Aber es führt zu diesem Fehler:

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

Wie kann ich also die erste, zweite, dritte usw. Option aus der Dropdown-Liste auswählen (mit Capybara)?

Antworten:


129

Wenn Sie sich die Quelle der selectMethode ansehen , können Sie sehen, dass sie beim Übergeben eines fromSchlüssels im Wesentlichen Folgendes bewirkt :

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

Mit anderen Worten, es findet das <select>, woran Sie interessiert sind, findet dann das <option>darin und ruft dann select_optionden <option>Knoten auf.

Sie haben die ersten beiden Dinge schon so ziemlich erledigt, ich würde sie nur neu anordnen. Dann können Sie die select_optionMethode am Ende angehen :

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

1
Vielen Dank Carol! Wirklich dankbar für die Hilfe! : D
Farooq

2
Möchte diese Referenz für diejenigen hinzufügen, die dies in Zukunft erforschen
BKSpurgeon

3
Gute Antwort! Ich möchte hinzufügen, dass Sie dies in Rails 5 auch folgendermaßen tun können : select('option_name', from: 'select_box'). Wo die Werte sein können: ID, Name, zugehöriges Beschriftungselement. Weitere Informationen zu Capybara- und DSL-Optionen finden Sie hier .
Nesha Zoric

177

Aus irgendeinem Grund hat es bei mir nicht funktioniert. Also musste ich etwas anderes benutzen.

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

arbeitete für mich.


1
Seltsam, das funktioniert bei mir nicht, da die Methode mindestens drei Optionen zu bieten scheint. Obwohl der von Ihnen vorgeschlagene Code mit dem Beispielcode aus dem Capybara-Handbuch übereinstimmt.
Linus

1
es ist nicht form, es ist from. Hier ist die Dokumentation zu select
fontno

3
Möglicherweise ist der from-Wert der Name, die ID oder der Beschriftungstext. dh "#organizationSelect" ist falsch, aber "organisationSelect" sollte funktionieren.
MZB

Das hat bei mir nicht funktioniert, aber die Lösung von carols10cents. Dies ist kein Kritiker Ihrer Antwort. Ich finde es nur wirklich seltsam, dass selbst in der neuesten Version von Capybara einige Anrufe funktionieren und einige Anrufe nicht einmal, wenn Intution Sie glauben lässt, dass mehrere Lösungen gültig aussehen. Es macht mich wahnsinnig. Hat dies etwas mit Firefox zu tun (oder mit welchem ​​Browser Capybara letztendlich verwendet wird)?
Chaostheorie

Ich denke, dies wird nur funktionieren, wenn der Optionsname und der Optionswert gleich sind.
Pixelearth

8

Eine andere Möglichkeit besteht darin, eine solche Methode hinzuzufügen

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

Hilfreiche Optionenfind("select[name='organization_search[role]']").find(:option, text: :Staff).select_option
Pixelearth

find(:css, "#search_field").find(:option, "Opp Last Name").select_option, das ist der angezeigte Optionstext, hat bei mir funktioniert, der Wert der Option jedoch nicht.
Codenoob

4

Leider hat die beliebteste Antwort bei mir nicht ganz funktioniert. Ich musste .select_optionam Ende der Aussage hinzufügen

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

ohne das select_optionwurde keine Auswahl durchgeführt


Wie kommt es, dass Sie aufrufen können .select_option, da die selectMethode einen booleschen Wert zurückgibt?
Ruby

4

Um dem Stapel noch eine weitere Antwort hinzuzufügen (weil es anscheinend so viele Möglichkeiten gibt, dies abhängig von Ihrem Setup zu tun), habe ich das Literal ausgewählt option und darauf geklickt

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

Es ist nicht sehr hübsch, aber es funktioniert: /


2

Keine der Antworten hat 2017 mit Capybara 2.7 für mich funktioniert. Ich habe "ArgumentError: falsche Anzahl von Argumenten (gegeben 2, erwartete 0)"

Aber das tat:

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

0

Es ist keine direkte Antwort, aber Sie können (wenn Ihr Server dies zulässt):

1) Erstellen Sie ein Modell für Ihre Organisation. extra: Es wird einfacher sein, Ihr HTML zu füllen.

2) Erstellen Sie eine Fabrik (FactoryGirl) für Ihr Modell;

3) Erstellen Sie eine Liste (create_list) mit der Fabrik;

4) Wählen Sie eine Organisation aus der Liste aus mit:

# 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
Wenn ich ein Modell erstellen muss, macht es keinen Sinn,
capybara zu

Es ist überhaupt keine Antwort. Dies ist eine Frage zu Capybara.
Robin Daugherty

0

Hier ist der prägnanteste Weg, den ich gefunden habe (mit Capybara 3.3.0 und Chromtreiber):

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

wählt die 2. Option. Erhöhen Sie den Index nach Bedarf.


0

In Capybara können Sie nur verwenden , finden mit XPath

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

und Methode klicken

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.