2017-05-09 1 views
0

Java Dev und neu zu Xpath ist. Googelt und RTFM-ed ist ziemlich viel, aber stecken geblieben. Das Unternehmen hat eine große Webapplikation in Java geschrieben, die das Java-Wicket-Framework verwendet. Selen in Kombination mit Gurke und Junit zum Testen verwenden. Daher müssen viele Xpath-Ausdrücke geschrieben werden. Stuck mit dem folgenden.Xpath. Text des Labels kann nicht ausgewählt werden - wenn ein anderes Element wie zwischen den <label> Tags

Ein Bildschirm mit einem Formular und zwei toggles() und Text dahinter. Relevanter Auszug

<label> 
    <input id="idf1" name="removeConditionViaTreeStep:resultsRadioGroup" value="radio3" checked="checked" type="radio"> 
    Safe to delete 
    </label> 

    <label> 
    <input id="idf2" name="removeConditionViaTreeStep:resultsRadioGroup" value="radio4" type="radio"> 
    Unsafe to delete 
    </label> 

Hinweis: Mit dem Wicket Rahmen bedeutet, dass die Attribute id und Wert sind/können jedes Mal anders sein, die Anwendung so ausgeführt wird, kann sie nicht benutzen. Kann das HTML auch nicht ändern.

Plan A ich einen bestimmten Toggle auswählen wollte (und klicken emulieren/es auswählen) durch den Beschriftungstext als uniq Selektor aber die Tatsache, dass zwischen den Tags gibt es .. gibt mir Probleme. In Clean-Label-Situationen kann ich ein bestimmtes Label ohne Probleme auswählen. Es kann nicht wie // label [contains (text(), 'Unsafe to delete') in diesem Fall funktionieren.

gab auf und ging für Plan B.

Mit firepath Addon für Firebug für die Prüfung und kam mit dem Follow-up: // input [@ name = 'removeConditionViaTreeStep: resultsRadioGroup'] Dies firepath Ergebnisse in zwei Spielen. Ich hoffte, mit etwas wie [2] den zweiten Toggle zu wählen, konnte es aber nicht herausfinden.

Plan C - Rückgriff auf Java und Xpath funktionierte.
Listenelemente = findElementsByXpath ("// input [@ name = 'removeConditionViaTreeStep: resultsRadioGroup']"); elements.get (1) // Wählen Sie den zweiten Schalter.

Haben Sie das Gefühl "// label [contains (text(), 'Unsafe to delete')]" funktioniert nicht, weil alles gestreamt wird und nichts im Speicher durch den Webtreiber von Selen gespeichert ist. Daher bricht das Element den Strom oder so ähnlich ......

Vielleicht kann jemand ein paar Tipps und Hinweise geben oder sogar eine Lösung für Plan A und B.

Bearbeiten der schließenden Klammer Tippfehler korrigiert, wie erwähnt von Bill Hileman.

+1

Versuchen Sie '" // label [normalize-space() = 'Nicht sicher zu löschen'] "' – Andersson

+0

haben Sie versucht, etwas wie 'Elemente.getAtrribute ("textContent"); ' – kushal

Antwort

0

Ich weiß, Sie sagten, Sie können den HTML nicht ändern, aber vielleicht können Sie die Anwendung im Wickets-Entwicklungsmodus auf der Testumgebung ausführen? Auf diese Weise sollte, wenn ich mich richtig erinnere, wicket:id gerendert werden und Sie hätten eine leichtere Zeit, Elemente auszuwählen. wie Sie

+0

Die Tests müssen im Produktionsmodus gegen eine Wicket-Anwendung ausgeführt werden. Der Entwicklungsmodus führt einige Extras auf der gerenderten Seite ein, die Selen nicht mögen. Sonst könnte ich sogar ein paar Dinge tun, wie in https://www.jdev.it/testing-a-wicket-application-with-selenium-ide/ erwähnt. Aber das Team hat sich vor ein paar Jahren dagegen entschieden, da das HTML ziemlich verschmutzt wäre und da wir komplexe Seiten haben, wenn etwas hinzugefügt würde, würde es die Tests zu leicht brechen. Das sagen mir die Entwickler. Danke für die Kommentare übrigens. – user1987876

0

Ihr XPath Versuch getippt es ist:

//label[contains(text(),'Unsafe to delete'] 

Es sei denn, dass ein Tippfehler hier nur war, verpassten Sie eine schließende Klammer.

//label[contains(text(),'Unsafe to delete')] 

Dieser Xpath sollte funktionieren.

+0

Sogar mit einer schließenden Klammer funktioniert Ihr 'XPath' nicht – Andersson

+0

Meinst du, dass es das Label webelement nicht zurückgibt oder dass es nicht anklickbar ist? Wenn letzteres, nur Hinzufügen/Eingabe an das Ende würde das Eingabeelement, oder bin ich wieder falsch? '// label [enthält (text(),' Unsafe to delete ')]/input' –

+0

Ich meine, es wird kein 'Label' zurückgegeben. Wenn Sie "count (// label/text())" aktivieren, sehen Sie, dass es '2' zurückgibt. Dies bedeutet, dass das Element "label" über zwei Textknoten verfügt: Der erste besteht aus Leerzeichen. Es enthält keine "Unsicher zu löschenden". Der, der funktionieren sollte, ist '// label [contains (text() [2], 'Unsafe to delete')]'. Beachten Sie, dass Sie im zweiten Textknoten nach '' Unsafe to delete ''suchen, das wirklich die erforderliche Zeichenfolge enthält – Andersson

Verwandte Themen