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&amp;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