2014-09-27 10 views
9

Sto seguendo il tutorial di Ruby on Rails di Michael Hartl. Quando uso rspec/capybara, il metodo fill_in mi rende confuso. Ho il seguente codice della vista:Come funziona fill_in in Rspec/Capybara?

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

Questo è il mio codice di prova:

fill_in "Name", with: "Example User" 

Sembra che etichetta e text_field sono entrambi necessari per FILL_IN per individuare il campo di immissione. Se decollo f.label o cambio <%= f.text_field :name %> in <%= f.text_field :another_name %>, il test mi darà l'errore ElementNotFound. Qualcuno può spiegare come funziona fill_in qui? Il campo di immissione e l'etichetta sono entrambi necessari per il metodo fill_in?

risposta

14

È stated che fill_in cerca il campo name, id o il testo dell'etichetta. Secondo ActionView::Helpers::FormHelper tratto di rotaie guide, il codice della vista, che si chiede circa dovrebbe essere tradotto al seguente codice html:

# 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" /> 

Come si vede, label ha prodotto il testo "Nome", che si chiede all'interno della vostra fill_in espressione. Ma id e name proprietà del input campo sono leggermente differenti, così si dovrebbe hanno utilizzato id selettore di base per ottenere lo stesso risultato:

fill_in "user_name", with: 'Example User'

Quindi, per riassumere, label campo non è necessaria, ma si dovresti controllare attentamente il codice html e selezionare i parametri appropriati per l'espressione fill_in.

+0

Vuol dire che se uso il nome dell'etichetta nell'espressione, il metodo FILL_IN sta andando a riempire l'ingresso subito dopo l'etichetta? –

+0

@JoeyHu bene, non proprio. Dai uno sguardo allo snippet 'html' nella mia risposta - l'attributo' for' dell'etichetta ha lo stesso valore di 'id' di input, quindi sono collegati insieme indipendentemente dalla posizione effettiva sulla pagina. – twonegatives

3

Giusto per aggiungere a quello twonegatives pubblicato. Ecco quello che i documenti Capybara dicono per il metodo FILL_IN():

Il campo può essere trovata attraverso il suo nome [attributo], id [attributo] o il testo dell'etichetta

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

quando si elimina l'etichetta di 'Nome', posso utilizzare una delle seguenti ed i test ancora passare:

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 rubino, alcuni caratteri non possono essere utilizzati come nome ymbol a meno che non venga citato l'intero simbolo.

Capybara deve recuperare tutti i campi di testo (o aree di testo) dalla pagina, quindi ottenere i valori dell'ID e degli attributi del nome (fatto facilmente con qualcosa come Nokogiri) quindi verificare se uno dei due valori è uguale al primo argomento to fill_in() (dopo aver convertito il primo argomento in una stringa tramite to_s()).

3

Ho fornito i miei 2 centesimi qui: Capybara not finding form elements.

Se si chiama l'helper Rails text_text con underscore (: first_name), il DOM viene visualizzato come "Nome" e ciò di cui Capybara avrà bisogno. Non c'è bisogno di un attributo id.

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

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