2012-09-04 3 views
56

Für die HTMLCapybara: Wählen Sie eine Option Wert Text nicht

<select id="date"> 
    <option value="20120904">Tue 4 Sep 2012</option> 
    <option value="20120905">Wed 5 Sep 2012</option> 
    <option value="20120906">Thu 6 Sep 2012</option> 
</select> 

Ich habe folgende Capybara Ruby-Code:

select "20120905", :from => "date" 

Aber diese Fehler mit:

cannot select option, no option with text '20120905' in select box 'date' (Capybara::ElementNotFound) 

jedoch , wenn ich mache

select "Wed 5 Sep 2012", :from => "date" 

Es ist in Ordnung.

Ist es möglich, eine Option in Capybara von Wert auswählen nicht Text?

Dank

Antwort

66

Dies funktioniert eine Option von Wert wählen:

find("option[value='20120905']").click 

den Umfang der Wähler halten Sie es in nur einen Block als solche wickeln könnte:

within '#date' do 
    find("option[value='20120905']").click 
end 
+22

Nach dem Wechsel von Selenium zu Poltergeist festgestellt, dass diese Methode nicht funktioniert. Daher ersetzt durch find ('# select_id'). Find ('option [wert = "1"]') select_option Sorry für schlechtes Englisch. – woto

+0

@woto All diese Optionen funktionieren nicht für mich. Grundsätzlich ist die Option ohne Probleme gefunden. Ich habe das Ergebnis überprüft und es wird die richtige Option gefunden, aber es wird nicht geklickt oder ausgewählt. Ich denke, es muss zuerst die Auswahl öffnen, bevor Sie die Option auswählen. –

4

Sie können es auch erreichen, indem Sie Folgendes tun:

find_by_id('date').find("option[value='20120905']").click 
38

Mit Poltergeist als Fahrer, den ich nicht auf eine Option klicken können, wie oben in einige der anderen Optionen vorgeschlagen, stattdessen können Sie folgendes tun:

page.find_by_id('date').find("option[value='20120905']").select_option

+0

Super nützlich. Ich habe eine Hilfsmethode in spec/support/capybara.rb erstellt: def select_option params id = params [: id] Wert = Parameter [: Wert] page.find_by_id (id) .find ("option [Wert = '# {Wert} '] "). select_option Ende – justingordon

+3

' click' Ursache für mich 'Das Element, mit dem Sie interagieren möchten, ist entweder nicht Teil des DOM oder ist momentan nicht auf der Seite sichtbar, aber' select_option' funktioniert für mir geht es gut. Vielen Dank! –

+0

Dies ist auch die Antwort für Capybara-Webkit. – dojosto

18

ich eine Hilfsmethode schrieb:

def select_by_value(id, value) 
    option_xpath = "//*[@id='#{id}']/option[@value='#{value}']" 
    option = find(:xpath, option_xpath).text 
    select(option, :from => id) 
end 

Speicher in einer Datei .rb in spec/support/

Beispiel für die Verwendung:

before do 
    select_by_value 'some_field_id', 'value' 
    click_button 'Submit' 
end 
+0

Absicht-aufschlussreicher Name, nette Implementierung. Vielen Dank. – slothbear

+0

Dies (noch) scheint die einzige Version zu sein, die ohne Javascript funktioniert und etwas vom Treiber unabhängig ist ... – Patru

0

Click find_field mit adaequat:

find_field("date").find("option[value='20120905']").click 
+0

Es gab mir einen Fehler. Kann css nicht finden "Option [Wert = '20120905']" –

1

Das Hilfsmethode ziemlich clever. Ich würde es ein wenig ändern:

def select_by_value(id, value) 

    option_xpath = "//*[@id='#{id}']/option[@value='#{value}']" 

    find(:xpath, option_xpath).click 

Ende

oder gerade:

find(:xpath, "//select[@id='date']/option[@value='20120904']").click 
0

Sie auch capybara-ui verwenden könnte, die aussehen wird zuerst den Text passen dann den Wert anzupassen.

# define your form widget, in this case in a role 
class UserRole < Capybara::UI::Role 
    form :my_form do 
    select :my_select, 'my_select' 
    end 
end 

# then just submit your form params via #submit 
role = UserRole.new 

role.submit :my_form, my_select: '20120905' 

Sehen Sie mehr über Capybara-ui Formen here.

1

In meinem Fall habe ich ein paar Optionen mit dem gleichen Text, das ist der Grund, warum ich nach Wert auswählen muss. Kombiniere ein paar Antworten zusammen Ich habe die beste Lösung für mich gefunden: