174 votes

Comment puis-je vérifier qu'un champ de formulaire est correctement pré-rempli en utilisant capybara ?

J'ai un champ avec une étiquette appropriée que je peux remplir avec capybara sans problème :

fill_in 'Your name', with: 'John'

J'aimerais vérifier sa valeur avant de le remplir et je n'y arrive pas.

Si j'ajoute après le fill_in la ligne suivante :

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

Ce test échoue, bien que le remplissage effectué juste avant ait fonctionné, comme je l'ai vérifié en sauvegardant la page.

Qu'est-ce que je manque ?

361voto

fqxp Points 1170

Une autre solution intéressante serait la suivante :

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

ou

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

respectivement.

Voir aussi le référence .

Note pour les entrées désactivées, vous devez ajouter l'option disabled: true .

28 votes

Bien mieux que la réponse choisie !

3 votes

Je préfère encore la réponse sélectionnée car le message d'erreur indique les chaînes attendues et réelles. Cela donne l'erreur peu utile "expected field "my field" to return something" (on s'attendait à ce que le champ "my field" renvoie quelque chose). Mais celle-ci se lit mieux et suit mieux l'API du page matcher. Tous les commentaires sont positifs !!!

0 votes

Cela a fonctionné pour moi lorsque j'ai utilisé typeahead.js pour vérifier le contenu du champ, alors que l'outil xpath matcher ne l'a pas fait.

196voto

DVG Points 7293

Vous pouvez utiliser un requête xpath pour vérifier s'il existe un input avec une valeur particulière (par exemple "John") :

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

Véase http://www.w3schools.com/xpath/xpath_syntax.asp pour plus d'informations.

Pour une manière peut-être plus jolie :

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

EDIT : De nos jours, j'utiliserais probablement have_selector

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

Si vous utilisez le modèle de page-objet (vous devriez le faire !)

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"

1 votes

Ah, il me manquait le .value bit. Merci d'avance !

0 votes

J'avais le même problème, mais avec une div plutôt qu'un champ de formulaire. Pour tous ceux qui ont le même problème, utilisez find_by_id().text plutôt que find_field().value. Cela m'a pris âges pour constater que cette valeur ne fonctionnait que pour les champs de formulaire

9 votes

Le problème de cette dernière méthode est qu'elle n'utilise pas le cycle d'interrogation de Capybara et qu'elle échouera donc instantanément si le champ est défini par un code JS plus long. La première méthode doit être préférée à moins que vous n'essayiez ceci sur un formulaire généré statiquement.

3voto

Jim Stewart Points 6811

Si vous souhaitez tester spécifiquement un espace réservé, utilisez :

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

ou :

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

Si vous voulez tester la valeur introduite par l'utilisateur :

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

1voto

jonleighton Points 476

Je me demandais comment faire quelque chose de légèrement différent : je voulais tester si le champ avait certains (tout en utilisant la valeur La capacité de Capybara à tester à nouveau l'outil d'appariement jusqu'à ce qu'il corresponde. ). Il s'avère qu'il est possible d'utiliser un "bloc de filtre" pour ce faire :

expect(page).to have_field("field_name") { |field|
  field.value.present?
}

1voto

Obromios Points 53

Si le champ est un champ caché dont l'identifiant est 'some_field', vous pouvez utiliser

expect(find("input#somefield", :visible => false).value).to eq 'John'

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X