Capybara nicht finden, eine Taste mit einem "name" - Attribut
Einer W3C-validierte HTML-5-web-Seite enthält diese arbeiten, einfache Schaltfläche im login-Formular.
<input data-disable-with="Signing in, please wait&hellip;"
name="commit" type="submit" value="Sign in" />
Ich Schreibe ein weitgehend sinnlos-test 🙂 in einer Rails-3.2.17-Anwendung, die sich nur um den Dreh von Capybara und ich habe bereits vollkommen fest, Googeln, Lesen, Dokumentationen und das Lesen von Quellcode, um das test-framework, mit dem keine Freude haben - versucht, auf diese Schaltfläche, durch seine name
(d.h. "commit"
) fehlschlägt.
click_button("commit")
find_button("commit")
Beide führen Capybara::ElementNotFound: Unable to find button "commit"
. Wenn ich verwenden Sie die Schaltflächen-text des Sign in
dann das element ist gefunden, d.h. diese:
click_button("Sign in")
find_button("Sign in")
...funktionieren beide gut, so scheint es, dass der XML-parser ist nicht, dass Sie ohne Probleme bei jedem element.
Dokumentation für click_button
sagt, dass der locator arbeitet auf "id, text oder Wert", mit "text" als bedeutungslos für eine input
element (der sichtbare text ist entnommen aus der value
Attribut), aber vielleicht relevant für button
Elemente. So könnten wir erwarten, dass zu scheitern, aber wenn wir den code anzeigen über die Dokumentation, feststellen, dass es Anrufe auf find
in der gleichen Weise wie find_button
. Noch find_button
ist unterschiedlich dokumentiert; es sagt es findet durch "id, name oder Wert". So traurig, wir wissen, dass die Dokumentation ist gebrochen, weil es sagt zwei verschiedene Dinge, für was sich ein identischer Anruf im back-end.
So oder so, wird das element nicht gefunden wird, indem Sie Namen, und das bedeutet, dass die untere Ebene find
rufen Sie nicht auf der Suche name
Attribute so weit wie ich sehen kann. Dies bedeutet Capybara (2.2.1, auf Nokogiri 1.6.1) ist ziemlich kaputt in dieser Hinsicht. Wie kommt es, niemand hat es gemerkt? Ich habe Gegoogelt, für Alter und es scheint nicht zu kommen. Ich scheine eher fehlt der Punkt 🙂
Warum nicht, ich Suche einfach nach dem englischen text in der Schaltfläche, die Sie stellen könnten? Durch die Internationalisierung. Diese alte, Schienen 1 -> 2 -> 3 aktualisierten app hat einige I18n-Teile und andere statische text-Teile. Ich möchte nicht gezwungen werden, sich zu setzen I18n-in jeder Ansicht, die Capybara-tests, nur so kann ich den test verwenden I18n.t()
zu gewährleisten, eine übereinstimmung trotz unterschiedlicher Sprachen oder Gebietsschemas-Datei-updates. Ebenso klar wäre sehr dumm sein im Jahr 2014 zu schreiben hartcodierte englische Zeichenfolgen in meinen tests.
Deshalb haben wir die Namen und IDs und so... Die eindeutige (in der Theorie!) Bezeichner, die Maschine zu Lesen, nicht Menschen Lesen.
Konnte ich hack etwas, das CSS-ausgewählt von "type=submit" aber im ernst, warum nicht Capybara Suche das name-Attribut, wenn die Dokumentation sagt, es tut, und warum wird in der Dokumentation nicht einverstanden sind, auf welche Attribute durchsucht werden auf zwei Methoden nennen, die zu genau dem gleichen back-end-Implementierung mit genau den gleichen Parametern?
TIA 🙂
Capybara::ElementNotFound: Unable to find button "commit"
Sie nicht über eine Schaltfläche, haben Sie eine Eingabe.- Das ist, was "klicken" bedeutet in diesem Zusammenhang. Die zugrunde liegenden
find
Anruf nimmt verschiedene Werte in den ersten parameter, der mit vielen verschiedenen Bedeutungen. Zum Beispiel kann ich pass:xpath
oder:fillable_field
. Sehenlib/capybara/selector.rb
wie diese Hinzugefügt werden;:button
gehtXPath::HTML.button
und rdoc.info/github/jnicklas/xpath/XPath/HTML sagt, dass diese Spiele "einesubmit
,image
oderbutton
element". Angesichts dieser, wenn Sie verantwortlich sind für die Frage, downvote würde ich es begrüßen, wenn Sie möchten, widerrufen, die. - Wenn Sie schreiben, die Frage Schnitt sich die Hälfte eines Gesprächs, um den Fokus nur auf das Thema, ich würde gerne.
- Sie sind im Grunde sagen "tl;dr" (und du bist immer noch falsch, was diese Anrufe tun, siehe meinen anderen Kommentar). Wenn Sie nicht Lesen möchten, eine Frage-und Antwort-intelligent, bitte nicht verschmutzen StackOverflow mit sinnlosen Kommentare und downvotes. Lassen Sie uns die Dinge Zivil-und wie die technische und präzise wie möglich. Danke.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es stellt sich heraus, die docs sind irreführend sowohl für Anrufe, als weder der Blick auf die Attribute aufgelistet. Es ist auch wirklich sehr verwirrend, was genau eine "Taste" bedeutet, da ein paar Leute, die hierin schien zu glauben, es wörtlich gemeint nur eine HTML -
button
element, aber das ist nicht der Fall.Wenn Sie die Quelle für die Dokumentation, sagen wir,
click_button
:https://github.com/jnicklas/capybara/blob/a94dfbc4d07dcfe53bbea334f7f47f584737a0c0/lib/capybara/node/actions.rb#L36
...Sie werden sehen, dass dies nur Anrufe (wie ich schon an anderer Stelle erwähnt) zu
find
mit einer Art von:button
, die wiederum geht durch zu Capybara istQuery
- engine, die wiederum endet nur mit der internen standard-Auswahl-Mechanismus, um Dinge zu finden. Es ist sehr elegant; in der gleichen Weise, dass ein externer client können fügen Sie Ihre eigenen benutzerdefinierten Selektoren so finden Sie Dinge bequemer:http://rubydoc.info/github/jnicklas/capybara/master/Capybara#add_selector-class_method
...so Capybara fügt seine eigene Selektoren intern, einschließlich, wichtiger ist, dass
:button
:https://github.com/jnicklas/capybara/blob/a94dfbc4d07dcfe53bbea334f7f47f584737a0c0/lib/capybara/selector.rb#L133
Es ist nicht von irgendeinem besonderen Fall Magie, nur einige vordefinierte benutzerdefinierte Selektoren. Also, wenn Sie sich gefragt haben, was benutzerdefinierte Selektoren sind von der get-go in der Capybara, das ist die Datei zum Lesen (es ist vermutlich begraben in den docs auch, aber ich habe nicht gefunden, wird die Liste selber noch).
Hier sehen wir, dass der button-code ist eigentlich Berufung
XPath::HTML.button
, das ein anderes Stück code in ein anderes repository, mit dieser Dokumentation:http://rdoc.info/github/jnicklas/xpath/XPath/HTML#button-instance_method
...das ist zu der Zeit des Schreibens etwas veraltet mit Bezug auf den code, da der code zeigt eine ganze Menge mehr Sachen, die anerkannt werden, einschließlich
input
Arten vonreset
undbutton
(d.h.<input type="button"...>
eher als<button...>...</button>
, obwohl die letztere ist ebenfalls enthalten, natürlich).https://github.com/jnicklas/xpath/blob/59badfa50d645ac64c70fc6a0c2f7fe826999a1f/lib/xpath/html.rb#L22
Können wir auch sehen, in diesem code, dass die finder-Methode wirklich nur findet, indem
id
,value
undtitle
- d.h. nicht von "text" und nicht von name.Vorausgesetzt, XPath verhält wie gedacht, aber es ist nicht klar, aus docs, können wir sehen, dass Capybara ist das nicht dokumentieren, ist an sich richtig, aber wahrscheinlich sollten Sie den link unten, um XPath-APIs für weitere Informationen, um die aktuelle zu vermeiden Vervielfältigung von Informationen und die Probleme, die diese verursachen können, für beide Betreuer und API-clients.
In der Zwischenzeit habe ich abgelegt dieser Ausgabe:
https://github.com/jnicklas/capybara/issues/1267
Können Sie auch css-Selektoren, welche die Standard-capybara-locators. Leute sagen, Sie sind schneller.
Capybara schauen nicht auf
name
Attribut im Finder 🙁Verwenden Sie die xpath-Selektor, wenn Sie möchten,
Wenn jemand will, können Sie (ganz einfach) suchen nach name selector. Um dies zu tun:
Fügen Sie folgenden code zum
test/test_helper.rb
(für minitest)Verwenden
Nun in Ihren tests können Sie folgenden Selektor:
Er findet jedes element, das
name
- Attribut enthält, der gesucht Wert.Beispiel
So finden Sie Elemente (element eines beliebigen Typs):
Können Sie verwenden Sie diesen Selektor, um zu finden, eine Taste auf einer Seite mit RSpec und Capybara:
Überprüfen Sie Ihre Edelstein-depencies. RSpec 3 oder höher, funktioniert mit gem 'rspec-rails', '~> 3.7.1' dann capybara-version muss gem 'capybara', '~>2.18.0 " und poltergeist sein sollte, gem 'poltergeist', '~>1.17.0'.