2012-05-08 12 views
129

Ho un campo con un'etichetta adeguata che posso riempire con capibara senza problemi:Come posso verificare che il campo di un modulo sia precompilato correttamente usando capybara?

fill_in 'Your name', with: 'John' 

Vorrei controllare il valore che ha prima del riempimento in e non può capire.

Se aggiungo dopo la fill_in la seguente riga:

find_field('Your name').should have_content('John') 

Questo test ha esito negativo, anche se il ripieno appena prima ha lavorato come ho verificato salvando la pagina.

Cosa mi manca?

risposta

159

È possibile utilizzare una query XPath per verificare se c'è un elemento input con un particolare valore (ad esempio 'John'):

expect(page).to have_xpath("//input[@value='John']") 

Vedi http://www.w3schools.com/xpath/xpath_syntax.asp per maggiori informazioni.

Per forse un modo più bello:

expect(find_field('Your name').value).to eq 'John' 

EDIT: (! Si dovrebbe essere) Al giorno d'oggi probabilmente sarei uso have_selector

expect(page).to have_selector("input[value='John']") 

Se si utilizza il modello oggetto pagina

class MyPage < SitePrism::Page 
    element :my_field, "input#my_id" 

    def has_secret_value?(value) 
    my_field.value == value 
    end 
end 

my_page = MyPage.new 

expect(my_page).to have_secret_value "foo" 
+0

Ah, mi mancava il bit '.value'. Grazie! –

+0

Avevo lo stesso problema, ma con un div piuttosto che un campo modulo. Per chiunque abbia lo stesso problema, usa find_by_id(). Text piuttosto che find_field(). Value. Mi ci sono voluti * anni * per individuare quel valore che funzionava solo sui campi del modulo ... –

+8

Il problema con quest'ultimo modo è che non utilizza il ciclo di polling di Capybara e quindi fallirà istantaneamente se il campo è impostato da un codice JS più lungo. Il primo modo è preferibile a meno che non si stia provando su una forma generata staticamente. – fqxp

258

Un'altra soluzione carina sarebbe:

page.should have_field('Your name', with: 'John') 

o rispettivamente

expect(page).to have_field('Your name', with: 'John') 

.

Vedere anche reference.

Nota: per gli ingressi disabilitati, è necessario aggiungere l'opzione disabled: true.

+15

Molto meglio della risposta selezionata! – Agent47DarkSoul

+3

Preferirei comunque la risposta selezionata perché il messaggio di errore mostra le stringhe previste e effettive. Questo dà al campo "campo previsto" inutile il mio campo "restituire qualcosa" errore. Ma questo sicuramente ha una lettura migliore e segue meglio l'API matcher della pagina. Upvotes tutto intorno !!! – mraaroncruz

+0

Questo ha funzionato per me quando si utilizza typeahead.js per verificare il contenuto del campo, mentre il matcher xpath no. –

1

Se specificamente vuole testare per un segnaposto, utilizzare:

page.should have_field("some_field_name", placeholder: "Some Placeholder") 

o:

expect(page).to have_field("some_field_name", placeholder: "Some Placeholder") 

Se si desidera verificare il valore immesso dall'utente:

page.should have_field("some_field_name", with: "Some Entered Value") 
Problemi correlati