Ich arbeite mit vielen jQuery-Plugins, die häufig DOM-Elemente ohne ID oder andere Identifikationseigenschaften erstellen. Die einzige Möglichkeit, sie in Capybara abzurufen (zum Beispiel zum Klicken), besteht darin, zuerst ihren Nachbarn (ein anderes Kind seines Vorfahren) abzurufen . Aber ich habe nirgendwo etwas gefunden, unterstützt Capybara solche Dinge zum Beispiel:
find('#some_button').parent.fill_in "Name:", :with => name
?
Antworten:
Ich fand Jamuraas Antwort wirklich hilfreich, aber wenn ich mich für den vollständigen xpath entschied, bekam ich in meinem Fall den Albtraum einer Zeichenfolge. Daher nutzte ich glücklich die Möglichkeit, Funde in Capybara zu verketten, um CSS- und xpath-Auswahl zu mischen. Ihr Beispiel würde dann so aussehen:
Capybara 2.0-Update :
find(:xpath,".//..")
führt höchstwahrscheinlich zu einemAmbiguous match
Fehler. Verwenden Sie in diesem Fallfirst(:xpath,".//..")
stattdessen.quelle
.//..
den Elternteil nicht finden -..
reicht nur aus, und das ist auch nie mehrdeutig.Mit Capybara und CSS gibt es keine Möglichkeit, dies zu tun. Ich habe in der Vergangenheit XPath verwendet, um dieses Ziel zu erreichen, das eine Möglichkeit bietet, das übergeordnete Element abzurufen, und das von Capybara unterstützt wird:
quelle
find(:xpath, '//*[@id="some_button"]/..')
Ich habe folgendes gefunden, das funktioniert:
Capybara wurde aktualisiert, um dies zu unterstützen.
https://github.com/jnicklas/capybara/pull/505
quelle
Wenn Sie über diesen Versuch gestolpert sind, herauszufinden, wie Sie einen übergeordneten Knoten (wie im Vorfahren ) finden können (wie in @ vrish88s Kommentar zu @Pascal Lindelaufs Antwort angedeutet):
quelle
Diese Antwort bezieht sich darauf, wie man ein Geschwisterelement manipuliert, worauf die ursprüngliche Frage meines Erachtens anspielt
Ihre Fragenhypothese funktioniert mit einer kleinen Änderung. Wenn das dynamisch generierte Feld so aussieht und keine ID hat:
Ihre Anfrage wäre dann:
Wenn die dynamisch generierte Eingabe mit einem ID-Element verbunden ist (seien Sie vorsichtig mit diesen, obwohl sie sich wie im Winkel ändern, wenn sie Elemente hinzufügen und löschen), wäre dies ungefähr so:
Hoffentlich hilft das.
quelle
Ich verwende einen anderen Ansatz, indem ich das übergeordnete Element zuerst anhand des Textes in diesem übergeordneten Element finde:
Vielleicht ist dies in einer ähnlichen Situation nützlich.
quelle
Ich musste einen Vorfahren mit einer CSS-Klasse finden, obwohl es unbestimmt war, ob auf dem Zielvorfahren eine oder mehrere CSS-Klassen vorhanden waren, sodass ich keine Möglichkeit sah, eine deterministische xpath-Abfrage durchzuführen. Ich habe das stattdessen aufgearbeitet:
Warnung: Verwenden Sie diese Option sparsam, da dies bei Tests viel Zeit kosten kann. Stellen Sie daher sicher, dass der Vorfahr nur wenige Schritte entfernt ist.
quelle
break if ancestor[:class].split(" ").include?(css_class)
.ancestor(selector)
eingebaute Methode. Siehe github.com/teamcapybara/capybara/commit/…Hier ist es
http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Base:parent
Es ist eine übergeordnete Methode vorhanden;)
quelle