2009-10-08 5 views
21

Seleniumを使ってWebページに要素を配置するときにXPathを多く使い、node1/node2を使ってからnode1/descendant :: node2をもっと最近使用する方向に移動しました。 2つの方法の違いは何ですか?他のものより効率的ですか?xpathの// nodeと/ descendant :: nodeの違いは何ですか?

<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> 

だからだろう::

例XMLスニペットは、実証する

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

か:

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

答えて

24

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

を参照してください。//だけですDの省略形escendant ::軸

編集

は引用すると:

//パラが短いために/子孫-または-self :: node()/の子::パラ

つまり、コンテキストノードの子であるすべてのpara、またはコンテキストノードの子孫ノードを指します。私が知る限り、それはコンテキストノードの子孫パラメータに変換されます。

+1

から取られました。他の人にはhttp://www.w3.org/TR/xpath#path-abbrevが該当するセクションです。それは、//それは、descendant-or-selfの略語なので、まったく同じではありませんが、現れます。また、私が//使用していない理由は、// node [1]が/ descendant :: node [1]と同じでないからです。 –

+1

私は上記の点を拡張しました。 //子孫 - または - 自己ではない、それは子孫 - または - 自己/子....私の子孫のように非常に多く見える.... –

+0

合意。よく注目される。 :) –

2

簡潔さを除いて、私は違いを認識していません。

8

コンテキストグループには違いがあります。 //para[1]/descendant-or-self::node()/child::para[1]の略で、親の最初の子であるすべてのparaを返します。 /descendant::para[1]は、サブツリー全体の最初のパラだけを返します。

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

リターン同じ結果:あなたのケース

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

とで

+0

また、(/ para)[1]も動作するはずですが、Selenium 1ではないので、/ descendant :: para [1]を使用する必要があります。コンテキスト・グループが// node [1]と/ descendant :: node [1]の間で異なってどのように適用されるかは、誰でも知っていますか? –

4

実際には、これまでに述べたように、id('books')//td[@class='title']id('books')/descendant-or-self::node()/td[@class='title']を意味し、これは概念的にはid('books')/descendant::td[@class='title']とは異なります。

には、以下の注意を参照してください:

注:ロケーションパス//パラ[1]ロケーションパス/子孫と同じ意味ではありません::パラ[1]。後者は最初の子孫para要素を選択します。前者は両親の最初の子である子孫パラ要素をすべて選択します。

このノートは私が尋ねる前にTRを精練している必要がありhttp://www.w3.org/TR/xpath#path-abbrev

関連する問題