Capybara ne trouverez pas un bouton par son attribut “name”
W3C-validé HTML 5 de la page web contient ce travail, simple bouton à l'intérieur d'un formulaire de connexion.
<input data-disable-with="Signing in, please wait&hellip;"
name="commit" type="submit" value="Sign in" />
Je suis en train d'écrire une grande partie inutile de tester 🙂 dans un des Rails 3.2.17 application c'est juste pour le coup de Capybara et j'ai déjà collé Googler, lire de la documentation et de la lecture du code source du framework de test, sans joie - de tenter de trouver ce bouton par ses name
(c'est à dire "commit"
) échoue.
click_button("commit")
find_button("commit")
La fois le résultat de Capybara::ElementNotFound: Unable to find button "commit"
. Si j'utilise le visible texte du bouton de Sign in
puis l'élément est, à savoir:
click_button("Sign in")
find_button("Sign in")
...les deux fonctionnent très bien, il semblerait donc que l'analyseur XML n'est pas du tout avoir de la difficulté à trouver l'élément.
Documentation pour click_button
dit que la recherche fonctionne sur la "id, texte ou la valeur", le "texte" d'être vide de sens pour un input
élément comme suit (le texte visible est pris à partir de la value
attribut), mais peut-être pour button
éléments. Donc, on pourrait s'attendre à ce qu'à l'échec, si nous considérons le code via la documentation, de trouver qu'il appelle à find
de la même manière que find_button
. Encore find_button
est décrite différemment; il dit qu'il localise par "l'identification, le nom ou la valeur". Donc, malheureusement, nous savons de ce que la documentation est cassé parce qu'il dit deux choses différentes pour ce qui s'avère être identique d'un appel à la fin.
De toute façon, l'élément n'est pas trouvé par un nom, et cela signifie que le niveau inférieur find
appel n'est pas à la recherche name
attributs d'aussi loin que je peux voir. Cela signifie que le Capybara (2.2.1, sur Nokogiri 1.6.1) est plutôt rompu à cet égard. Comment se fait personne n'a remarqué? J'ai Googlé pour les âges et il ne semble pas venir. J'ai l'impression d'être plutôt à côté de la question 🙂
Pourquoi ne suis-je pas la recherche pour le texte anglais dans le bouton, vous pourriez demander? En raison de l'internationalisation. Ce vieux Rails 1 -> 2 -> 3 application mise à niveau a quelques I18n des pièces et d'autres de texte statique des pièces. Je ne veux pas être obligé de mettre I18n en tout point de vue que le Capybara tests, juste pour que je puisse avoir l'utilisation de test de I18n.t()
pour assurer un match, malgré les différences de langues ou régionaux ou les mises à jour de fichiers. De même, il serait de toute évidence très stupide en 2014 à l'écriture codée en dur chaînes en anglais dans mes tests.
C'est pourquoi nous avons les noms et Identifiants et... L'unique (en théorie!) les identificateurs qui sont à la machine à lire, l'homme n'est pas lu.
Je pouvais pirater quelque chose que CSS-sélectionné par le "type=submit" mais sérieusement, pourquoi n'est-ce pas Capybara la recherche d'un nom d'attribut lorsque sa documentation indique qu'il ne, et pourquoi la documentation en désaccord sur ce que les attributs sont recherchées sur les deux méthodes appel à exactement le même back-end de mise en œuvre avec exactement les mêmes paramètres?
TIA 🙂
Capybara::ElementNotFound: Unable to find button "commit"
Vous n'avez pas de bouton, vous disposez d'une entrée.C'est ce "bouton" signifie dans ce contexte. Le sous-jacent
find
appel prend différentes valeurs du premier paramètre avec beaucoup de significations différentes. Par exemple, je peux passer :xpath
ou :fillable_field
. Voir lib/capybara/selector.rb
de la façon dont elles sont ajoutées; :button
passe à XPath::HTML.button
et rdoc.info/github/jnicklas/xpath/XPath/HTML dit que cela correspond à "un submit
, image
, ou button
élément". Compte tenu de cela, si vous êtes responsable de la question downvote je l'apprécierais si vous souhaitez révoquer.Si vous réécrivez la question de découper la moitié de la conversation de se concentrer seulement sur la question, j'en serais heureuse.
Il s'agit de dire "tl;dr" (et vous êtes à la de mal à ce que ces appels ne, voir mon autre commentaire). Si vous ne voulez pas lire une question et répondre intelligemment, merci de ne pas polluer StackOverflow avec commentaire vide de sens et de downvotes. Gardons les choses civiles et technique et précis que possible. Merci.
OriginalL'auteur Andrew Hodgkinson | 2014-03-13
Vous devez vous connecter pour publier un commentaire.
Il s'avère que les docs sont trompeuses pour les deux appels, ni de regarder les attributs répertoriés. Il est également clairement très confus ce qu'est exactement un "bouton" s'entend, car un couple de personnes ici semblent penser que cela ne signifiait littéralement HTML
button
élément, mais ce n'est pas le cas.Si vous affichez la source de la documentation de, disons,
click_button
:https://github.com/jnicklas/capybara/blob/a94dfbc4d07dcfe53bbea334f7f47f584737a0c0/lib/capybara/node/actions.rb#L36
...vous verrez que cela appelle juste (comme je l'ai mentionné ailleurs) à
find
avec un type de:button
, qui à son tour passe par Capybara estQuery
moteur qui, à son tour, se termine juste en utilisant le standard interne un mécanisme de sélection pour trouver des choses. C'est assez élégant; de la même manière qu'un client externe peuvent ajouter leurs propres sélecteurs de faire de trouver des choses plus commode:http://rubydoc.info/github/jnicklas/capybara/master/Capybara#add_selector-class_method
...donc Capybara ajoute ses propres sélecteurs à l'interne, y compris, surtout,
:button
:https://github.com/jnicklas/capybara/blob/a94dfbc4d07dcfe53bbea334f7f47f584737a0c0/lib/capybara/selector.rb#L133
Il n'est pas fait par n'importe quel cas particulier de la magie, juste quelques personnalisés prédéfinis sélecteurs. Ainsi, si vous vous demandez ce que la coutume de sélecteurs sont disponibles à partir de l'obtenir-aller dans le Capybara, c'est le fichier à lire (c'est probablement enterré dans les docs aussi, mais je n'ai pas trouvé la liste moi-même encore).
Ici, nous voyons que le code du bouton est en fait l'appel
XPath::HTML.button
, qui est un autre morceau de code dans un autre référentiel, avec cette documentation:http://rdoc.info/github/jnicklas/xpath/XPath/HTML#button-instance_method
...qui est au moment de la rédaction légèrement en dehors de la date avec le respect du code, car le code de la montre de beaucoup plus de choses d'être reconnu, y compris
input
types dereset
etbutton
(c'est à dire<input type="button"...>
plutôt que<button...>...</button>
, si celui-ci est également inclus bien sûr).https://github.com/jnicklas/xpath/blob/59badfa50d645ac64c70fc6a0c2f7fe826999a1f/lib/xpath/html.rb#L22
Nous pouvons aussi voir dans ce code que la méthode de recherche vraiment ne trouve par
id
,value
ettitle
- c'est à dire pas par "texte" et pas par nom.Donc en supposant XPath est de se comporter comme prévu, si ce n'est pas clair à partir de documents, nous pouvons voir que le Capybara n'est pas de documenter correctement mais sans doute convient de rendre le lien en bas de XPath Api pour plus d'information, afin d'éviter les chevauchements actuels de l'information et les problèmes que cela peut causer à la fois des spécialistes de la maintenance et de l'API clients.
Dans le temps de le dire, j'ai déposé cette question:
https://github.com/jnicklas/capybara/issues/1267
L'un des meilleurs de débordement de pile répond jamais. Merci!!!!
OriginalL'auteur Andrew Hodgkinson
Vous pouvez également utiliser les sélecteurs css qui sont par défaut capybara locators. Les gens disent qu'ils sont plus rapides.
Capybara ne pas regarder
name
attribut dans les trouveurs 🙁OriginalL'auteur Ievgen
Vous pouvez utiliser xpath sélecteur si vous voulez
Depuis le sous-jacent XPath code ne marche tout simplement pas vérifier "nom" et n'a pas l'air de docs comme si elle ne l'a jamais été l'intention de le faire, je vais prendre cette route; il est très lisible, même avec la syntaxe XPath de la ponctuation. Merci encore.
OriginalL'auteur Babasaheb Gosavi
Si quelqu'un veut il est possible d'ajouter (assez facilement) recherche par nom sélecteur. Pour ce faire:
Ajoutez le code suivant à
test/test_helper.rb
(pour minitest)Utiliser
Maintenant dans vos tests, vous pouvez utiliser le sélecteur suivant:
Il va trouver tous les éléments qui
name
attribut contient cherché valeur.Exemple
Cela permettra de trouver des éléments (élément peut être de tout type):
OriginalL'auteur jmarceli
Vous pouvez utilisez ce sélecteur pour trouver un bouton sur une page avec RSpec et le Capybara:
OriginalL'auteur The Whiz of Oz
Vérifier votre bijou depencies. RSpec 3 ou plus travaille avec gem 'rspec rails', '~> 3.7.1 " puis capybara version doit être gem 'capybara', '~>2.18.0 "et de" poltergeist " devrait être gem 'poltergeist', '~>1.17.0'.
OriginalL'auteur samanthi22