2010-09-09 13 views
61

Ich schreibe einen Selenium-Testfall. Und hier ist der XPath-Ausdruck, den ich benutze, um alle "Ändern" -Buttons innerhalb einer Datentabelle abzugleichen.Wie wähle ich den angegebenen Knoten in Xpath-Knoten durch Index mit Selenium aus?

Meine Frage ist, wie kann ich die Matched Node Sets nach Index besuchen? Ich habe versucht, mit

//img[@title='Modify'][i] 

und

//img[@title='Modify' and position() = i] 

aber weder Werke .. ich auch mit XPath Checker (Ein Firefox-Erweiterung) versucht. Es sind insgesamt 13 Treffer gefunden, dann habe ich überhaupt keine Ahnung, wie ich einen davon auswählen soll. Oder unterstützt XPath eine bestimmte Auswahl von Knoten, die nicht unter demselben Elternknoten sind?

Antwort

131

Dies ist eine FAQ ist:

//someName[3] 

bedeutet: alle someName Elemente in dem Dokument, das die dritte someName Kind ihrer Eltern sind - dort kann viele solcher Elemente sein.

Was Sie wollen, ist genau das 3. someName Element:

(//someName)[3] 

Erklärung: die [] hat eine höhere Priorität (Priorität) als //.Denken Sie daran, immer Ausdrücke des Typs //someName in Klammern zu setzen, wenn Sie den N-ten Knoten der ausgewählten Knotenliste angeben müssen.

+8

+1 für die Präzedenzerklärung. –

+1

Vielen Dank! Entschuldigung, ich habe die Präzedenzfälle vergessen. Ich habe es einfach versucht und es funktioniert! –

+0

@ Kymair-Wu: Ich bin froh, dass diese Antwort für Sie nützlich war. Hier bei SO ist der Ausdruck der Dankbarkeit eine Antwort (Hinweis: Klicken Sie auf das Häkchen neben der Antwort). :) –

13

In XPath gibt es keine i.

Entweder verwenden Sie wörtliche Zahlen: //img[@title='Modify'][1]

Oder Sie bauen den Ausdruck Zeichenfolge dynamisch: '//img[@title='Modify']['+i+']' (aber denken Sie daran, dass die dynamische XPath-Ausdrücke funktionieren nicht aus innerhalb XSLT).

Oder XPath-Unterstützung Auswahl von Knoten festgelegt, die nicht unter demselben übergeordneten Knoten sind?

Ja "jede <img> mit einem Titel von 'Ändern' und ein untergeordnetes Element <i> dem Namen" (//img[@title='Modify'])[13]


Diese //img[@title='Modify'][i] Mittel

+0

+1 für Erklärung in es mehrere Übereinstimmungen zu finden, etwa '[i]' Prädikat der Bedeutung –

+0

Thank Sie sehr viel :) Ich habe mein Problem gelöst .. –

+0

Aus irgendeinem Grund musste ich den Index vor dem Attribut Ausdruck enthalten. Um zum Beispiel 'td's zu finden, die das sechste Kind eines' tr' sind und keinen leeren Inhalt haben: '// tr/td [6] [string-length (text())> 0]' –

1
//img[@title='Modify'][i] 

ist die Abkürzung für

/descendant-or-self::node()/img[@title='Modify'][i] 

daher wird die unter dem gleichen Elternknoten i-ten Knoten zurückkehrt.

Sie wollen

/descendant-or-self::img[@title='Modify'][i] 
+0

Nur '/ abcendant :: img [@ title = 'Ändern'] [$ index]' wird gut funktionieren. Beachten Sie auch, dass '[i]' Prädikat Test für das Vorhandensein von 'i' Kind Element. –

0

(// * [@ attribute = 'value']) [index] Ziel von Element zu finden, während die

+1

Können Sie ein bisschen mehr erklären? – abhiarora

Verwandte Themen