1. ホーム
  2. selenium

[解決済み] XPath:ドットとtext()の違い

2022-03-05 17:03:59

質問

ドットの使い方について質問です。 text()XPath . 例えば、次のように find_element の行は同じ要素を返します。

driver.get('http://stackoverflow.com/')

driver.find_element_by_xpath('//a[text()="Ask Question"]')
driver.find_element_by_xpath('//a[.="Ask Question"]')

では、何が違うのでしょうか?を使うことの利点と欠点は何でしょうか? .text() ?

解決方法は?

との間に違いがあります。 .text() しかし、この違いは、入力文書によって表面化しないかもしれません。

入力文書が次のようなものだったとしたら(XPath式から想像できる最も単純な文書)。

例1

<html>
  <a>Ask Question</a>
</html>

次に //a[text()="Ask Question"]//a[.="Ask Question"] は、確かに全く同じ結果を返します。しかし、次のような別の入力文書があるとしよう。

例2

<html>
  <a>Ask Question<other/>
  </a>
</html>

ここで a 要素もまた、子要素 other は、"Ask Question"の直後に続いています。この2つ目の入力文書があるとします。 //a[text()="Ask Question"] は依然として a 要素で、一方 //a[.="Ask Question"] は何も返しません!


これは、2つの述語の意味(すべての間の [] )が異なる。 [text()="Ask Question"] 実際の意味は、要素のテキストノードのいずれかが正確にテキスト "質問をする" を含んでいる場合に真を返すというものです。一方 [.="Ask Question"] の意味は、「もし 文字列の値 と同じです。

XPath モデルでは、XML 要素内のテキストを分割して、いくつかの テキストノード のように他の要素がテキストを妨害する場合、そのテキストは 例2 上記の通りです。そこでは other 要素は "Ask Question" と改行文字の間にあり、これもテキストコンテンツとしてカウントされます。

さらにわかりやすくするために、入力文書として考えてみましょう。

例3

<a>Ask Question<other/>more text</a>

ここで a 要素には、実際には テキストノード、"Ask Question" と "more text" は、どちらも a . これをテストするには、次のように実行します。 //a/text() で区切られた個々の結果)を返します。 ---- ):

Ask Question
-----------------------
more text

では、そのようなシナリオの場合 text() は個々のノードのセットを返しますが . は、すべてのテキストノードの文字列連結として評価されます。繰り返しになりますが、この主張をパス式でテストすることができます。 //a[.='Ask Questionmore text'] を返すと、正常に a 要素を使用します。


最後に、XPath関数の中には、1つの文字列しか入力として受け取ることができないものがあることに留意してください。LarsH がコメントで指摘しているように、もしそのような XPath 関数 (例. contains() が一連のノードを受け取った場合、そのノードは 最初の ノードを生成し,残りは黙って無視する。