Comment puis-je vérifier qu'un champ de formulaire est correctement pré-rempli à l'aide de capybara?

145

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

fill_in 'Your name', with: 'John'

Je voudrais vérifier la valeur qu'il a avant de le remplir et je ne peux pas le comprendre.

Si j'ajoute après la fill_inligne suivante:

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

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

Qu'est-ce que je rate?

Marc-André Lafortune
la source

Réponses:

179

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

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

Voir http://www.w3schools.com/xpath/xpath_syntax.asp pour plus d'informations.

Pour peut-être une manière 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 d'objet de page (vous devriez l'être!)

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"
DVG
la source
Ah, il me manquait le .valuepeu. Merci!
Marc-André Lafortune
J'avais le même problème, mais avec un div plutôt qu'un champ de formulaire. Pour toute autre personne ayant le même problème, utilisez find_by_id (). Text plutôt que find_field (). Value. Il m'a fallu du temps pour repérer cette valeur ne fonctionnait que sur les champs de formulaire…
John Y
8
Le problème avec cette dernière méthode est qu'elle n'utilise pas le cycle d'interrogation de Capybara et échouera donc instantanément si le champ est défini par un code JS plus long. La première façon est d'être préférée, sauf si vous essayez cela sur un formulaire généré statiquement.
fqxp
1
Je pense que @fqxp a une meilleure réponse qui utilise RSpec Matchers et la nouvelle syntaxe d'attente. D'après ce que je vois dans la documentation, find_fieldet d'autres Node::Finderssont utilisés pour trouver des nœuds et effectuer des actions sur eux plutôt que des attentes. Bien sûr, ce n'est pas une règle, mais pour quelque chose de simple comme cela, aller avec la solution intégrée est une meilleure idée. Je dis juste!
Agent47DarkSoul
Certes, l'attente serait la méthode préférée maintenant, mais cette syntaxe a été publiée environ un mois après cette question.
DVG
309

Une autre jolie solution serait:

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

ou

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

respectivement.

Voir également la référence .

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

fqxp
la source
23
Bien mieux que la réponse choisie!
Agent47DarkSoul
3
Je préférerais toujours la réponse sélectionnée car le message d'erreur vous montre les chaînes attendues et réelles. Cela donne l'erreur inutile "champ attendu" mon champ "pour renvoyer quelque chose". Mais celui-ci lit mieux et suit mieux l'API de mise en page. Des votes positifs tout autour !!!
mraaroncruz
1
Pour autant que je sache, cela ne confirme pas réellement la valeur du champ, juste la présence du champ quelle que soit la valeur. J'imagine que c'est un bug car la documentation dit qu'il devrait filtrer en fonction de la valeur.
Nick
1
La transmission withne retournait définitivement true que si la valeur correspond, pour moi, au résultat attendu.
Ben Saufley
4
Peut-être que le message d'erreur a été amélioré depuis que la réponse a été écrite pour la première fois, mais j'obtiens maintenant expected […] but there were no matches. Also found "", which matched the selector but not all filters..un champ vide qui est très proche d'un très beau message d'erreur.
Patru
2

Si vous souhaitez spécifiquement tester 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 souhaitez tester la valeur saisie par l'utilisateur:

page.should have_field("some_field_name", with: "Some Entered Value")
Jim Stewart
la source
0

Je me demandais comment faire quelque chose de légèrement différent: je voulais tester si le champ avait une certaine valeur (tout en utilisant la capacité de Capybara à re-tester le matcher 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?
}
Jonleighton
la source