2009-10-08 3 views
21

Używam dużo XPath podczas lokalizowania elementów na stronach internetowych przy użyciu Selenium i odeszliśmy od korzystania z węzła1 // węzeł2 w kierunku korzystania z węzła1/potomka :: węzeł2 jeszcze niedawno. Jaka jest różnica między tymi dwoma metodami? Czy jest bardziej wydajny niż inny?Jaka jest różnica między węzłem // i potomkiem :: węzeł w ścieżce xpath?

fragment

Przykład XML wykazać:

<div id="books"> 
    <table> 
    <tr><td class="title">Lord of the Rings</td><td class="author">JRR Tolkein</td></tr> 
    <tr><td class="title">The Hitch-Hikers Guide to the Galaxy</td><td class="author">Douglas Adams</td></tr> 
    </table> 
</div> 

Więc byłoby:

id('books')//td[@class='title']

lub:

id('books')/descendant::td[@class='title']

Odpowiedz

24

zobaczyć http://www.w3.org/TR/xpath#path-abbrev

// to tylko skrót do d escendant :: oś

Edit

Cytując:

// para jest skrótem/lub potomka-jaźni :: node()/child :: para

Oznacza to, że odnosi się do wszystkich para, które są potomkami węzła kontekstu lub dowolnego węzła pochodzącego z węzła kontekstu. O ile mogę powiedzieć, że przekłada się na każdy potomek para węzła kontekstu.

+1

powinienem prane TR przed pytaniem. Dla innych http://www.w3.org/TR/xpath#path-abbrev jest odpowiednią sekcją. Wydaje się jednak, że // jest skrótem od potomka, więc nie jest dokładnie taki sam.Powodem, dla którego nie korzystałem z //, jest to, że // węzeł [1] nie jest tym samym, co/descendant :: node [1] –

+1

. Rozszerzyłem ten punkt powyżej. // nie jest potomkiem ani nie jest potomkiem, to jest potomkiem-lub-ja/dzieckiem .... który wygląda dla mnie bardzo podobnie jak potomek. –

+0

Uzgodnione. Zrozumiano. :) –

2

Poza zwięzłością, nie jestem świadomy żadnej różnicy.

8

Istnieje różnica w grupie kontekstów. //para[1] jest skrótem od /descendant-or-self::node()/child::para[1], który zwraca każdy akapit będący pierwszym dzieckiem jego rodzica. /descendant::para[1] zwraca tylko pierwszy akapit w całym poddrzewie.

+0

Również (// para) [1] powinien również działać, ale nie w selenie 1, więc musisz użyć/descendant :: para [1]. Ktoś wie, w jaki sposób grupa kontekstowa jest inaczej stosowana między węzłem [1] a/potomkiem :: węzeł [1]? –

4

W twoim przypadku

id('books')//td[@class='title'] 

oraz:

id('books')/descendant::td[@class='title'] 

zamian ten sam rezultat.

Ale w rzeczywistości, jak to było już wcześniej powiedziane, id('books')//td[@class='title'] oznacza id('books')/descendant-or-self::node()/td[@class='title'], co różni się od koncepcji id('books')/descendant::td[@class='title'].

Patrz poniższa uwaga:

UWAGA: Położenie ścieżka // para [1] Nie znaczy taka sama jak ścieżka Lokalizacja/potomek :: ust [1]. Ten ostatni wybiera pierwszy element potomny para; pierwszy wybiera wszystkie potomne elementy para, które są pierwszymi dziećmi z ich rodziców.

uwaga ta została podjęta z http://www.w3.org/TR/xpath#path-abbrev