Come posso verificare che un campo modulo sia precompilato correttamente usando capybara?


145

Ho un campo con un'etichetta corretta che posso compilare con capybara senza problemi:

fill_in 'Your name', with: 'John'

Vorrei verificare il valore che ha prima di riempirlo e non riesco a capirlo.

Se aggiungo dopo fill_inla seguente riga:

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

Quel test fallisce, anche se il riempimento appena prima ha funzionato come ho verificato salvando la pagina.

Cosa mi sto perdendo?

Risposte:


179

È possibile utilizzare una query xpath per verificare se esiste un inputelemento con un valore particolare (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ù carino:

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

EDIT: Oggi probabilmente userei have_selector

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

Se stai usando il modello a oggetti di pagina (dovresti essere!)

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"

Ah, mi mancava il .valuebit. Grazie!
Marc-André Lafortune,

Stavo avendo lo stesso problema, ma con un div piuttosto che un campo modulo. Per chiunque abbia lo stesso problema, usa find_by_id (). Text anziché find_field (). Value. Mi ci sono voluti anni per individuare quel valore che funzionava solo sui campi modulo ...
John Y,

8
Il problema con quest'ultimo modo è che non utilizza il ciclo di polling di Capybara e quindi fallirà immediatamente se il campo è impostato da un codice JS più lungo. Il primo modo è preferibile a meno che non lo si stia provando su un modulo generato staticamente.
fqxp,

1
Penso che @fqxp abbia una risposta migliore che utilizza RSpec Matchers e la nuova sintassi delle aspettative. Da quello che vedo nella documentazione, find_fielde altri Node::Finderssono usati per trovare nodi ed eseguire azioni su di essi piuttosto che sulle aspettative. Ovviamente questa non è una regola, ma per qualcosa di semplice come andare con la soluzione integrata è un'idea migliore. Sto solo dicendo!
Agent47DarkSoul,

È vero, aspettarsi sarebbe il modo preferito ora, tuttavia che la sintassi è stata rilasciata circa un mese dopo questa domanda.
DVG

309

Un'altra soluzione carina sarebbe:

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

o

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

rispettivamente.

Vedi anche il riferimento .

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


23
Molto meglio della risposta selezionata!
Agent47DarkSoul

3
Preferirei comunque la risposta selezionata perché il messaggio di errore mostra le stringhe attese ed effettive. In questo modo viene restituito l'errore "campo previsto" il mio campo "inutile per restituire qualcosa". Ma questo ha sicuramente una lettura migliore e segue meglio l'API di abbinamento pagine. Voti positivi tutto intorno !!!
mraaroncruz,

1
Per quanto ne so, questo in realtà non conferma il valore del campo, ma solo la presenza del campo indipendentemente dal valore. Immagino sia un bug poiché i documenti dicono che dovrebbe filtrare in base al valore.
Nick,

1
Il passaggio withsicuramente restituito vero solo se il valore corrisponde, per me, che è il risultato atteso.
Ben Saufley,

4
Forse il messaggio di errore è stato migliorato da quando la risposta è stata scritta per la prima volta, ma ora mi trovo expected […] but there were no matches. Also found "", which matched the selector but not all filters..in un campo vuoto che si avvicina molto a un messaggio di errore molto carino.
Patru,

2

Se si desidera specificamente verificare 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 inserito dall'utente:

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.