2014-09-27 3 views
9

Ich folge Michael Hartls Ruby on Rails Tutorial. Wenn ich rspec/capybara verwende, verwirrt mich die fill_in-Methode. Ich habe den folgenden Code anzeigen:Wie funktioniert fill_in in Rspec/Capybara?

<%= f.label :name %> 
<%= f.text_field :name %> 

Dies ist mein Testcode:

fill_in "Name", with: "Example User" 

Es scheint, dass Etikett und text_field sind beide erforderlich für fill_in das Eingabefeld zu finden. Wenn ich entweder f.label ausziehe oder <%= f.text_field :name %> auf <%= f.text_field :another_name %> setze, wird der Test mir ElementNotFound Fehler geben. Kann mir jemand erklären, wie die fill_in hier funktioniert? Sind für die Methode fill_in Eingabefeld und Label erforderlich?

Antwort

14

Es ist stated, dass fill_in nach Feld name, id oder Beschriftungstext sucht. Nach ActionView::Helpers::FormHelper Abschnitt der Schienen Führungen, die die Ansicht Code, den Sie zu fragen, sollte auf den folgenden HTML-Code übersetzt werden:

# I assume that you made a form for a @user object 
<label for="user_name"> 
    Name 
</label> 
<input id="user_name" name="user[name]" type="text" /> 

Wie Sie sehen, label den „Namen“ Text erzeugt, die Sie im Innern fragen Ihre fill_in Ausdruck. Aber id und name Eigenschaften von input Feld sind etwas anders, so sollten Sie id basierte Wähler wurden mit dem gleichen Ergebnis zu erzielen:

fill_in "user_name", with: 'Example User'

Also, um es zusammenzufassen, label Feld nicht erforderlich ist, aber Sie sollten Sie sorgfältig auf Ihren HTML-Code achten und die entsprechenden Parameter für den Ausdruck fill_in auswählen.

+0

das bedeutet, wenn ich Markennamen im Ausdruck verwenden, wird die fill_in Methode werde im Eingabe füllen direkt nach dem Etikett? –

+0

@JoeyHu gut, nicht wirklich. Sehen Sie sich das 'html'-Snippet in meiner Antwort an - das' for'-Attribut des Labels hat den gleichen Wert wie das 'id' für die Eingabe, so dass sie unabhängig von der tatsächlichen Position auf der Seite miteinander verknüpft sind. – twonegatives

3

Nur um hinzuzufügen, was twonegatives geschrieben hat. Hier ist, was die Capybara docs sagen für die fill_in() -Methode:

Das Feld kann über seinen Namen [Attribut] id [Attribut] oder Beschriftungstext

http://rubydoc.info/github/jnicklas/capybara/Capybara/Node/Actions:fill_in

finden als ich den ‚Name‘ Etikett löschen, kann ich eine der folgenden Aktionen verwenden und die Tests bestehen nach wie vor:

fill_in 'user_name', with: "Example User" #locate text field by id attribute 
fill_in :user_name, with: "Example User" #locate text field by id attribute 

fill_in 'user[name]', with: "Example User" #locate text field by name attribute 
fill_in :'user[name]' with: "Example User" #locate text field by name attribute 

in Rubin, können einige Zeichen nicht in so verwendet werden, Name des Symbols, sofern nicht das ganze Symbol angegeben ist.

Capybara muss alle Textfelder (oder Textbereiche) von der Seite abrufen, dann die Werte der ID- und Namensattribute (leicht mit etwas wie Nokogiri) und dann prüfen, ob der Wert dem ersten Argument entspricht to fill_in() (nach dem Konvertieren des ersten Arguments in einen String über to_s()).

3

Ich stellte meine 2 Cent hier: Capybara not finding form elements.

Wenn Sie den Rails text_field-Helper mit Unterstrich (: first_name) aufrufen, wird das DOM als "First name" gerendert und dessen, was Capybara benötigt. Keine Notwendigkeit für ein ID-Attribut.

Ausblick: <%= form.text_field :first_name %>

Test: fill_in "First name", with: 'Elaine'