web-dev-qa-db-ja.com

XPath // div [contains(text()、 'string')]は、 'string'を含むdivを選択できません

これはHTMLコードです:

<div>  <span></span>  Elangovan  </div>

含まれているテキストに基づいてdivのXPathを書きたいのですが。私は試した

//div[contains(text(),'Elangovan')]

しかし、これは機能していません。

20
Elangovan S

text()string() に置き換えます。

//div[contains(string(), "Elangovan")]

または、spanの次のテキスト兄弟にテキストが含まれていることを確認できます。

//div[contains(span/following-sibling::text(), "Elangovan")] 

こちらもご覧ください:

24
alecxe

Alecxeの正解(+1)の代わりに、次のわずかに単純でやや慣用的なXPathも同じように機能します。

//div[contains(., "Elangovan")]

text() を使用した元のXPathが機能しない理由は、text()divのすべてのテキストノードの子を選択します。ただし、contains()は最初の引数に文字列を期待します。テキストノードのノードセットが指定された場合、最初の引数のみを使用します。ここでは、最初のテキストノードにシーク後の文字列ではなく空白が含まれているため、テストは失敗します。暗黙の.または明示的な string() の最初の引数を使用すると、すべてのテキストノードの子孫はcontains()テストを実行する前に連結されているため、テストに合格します。

9
kjhughes

@kjhughesのすでに良い答えをもう少し正確にするために、あなたが本当に求めているのは、divの部分文字列を探す方法です string-value

ノードのすべてのタイプについて、そのタイプのノードの文字列値を決定する方法があります。一部のタイプのノードでは、string-valueはノードの一部です。他のタイプのノードの場合、文字列値は子孫ノードの文字列値から計算されます。

コンテキストノード(_._またはdiv自体)とtext()-またはその他の引数によって返されるノードのセットの両方! -containsに渡されると、最初に文字列に変換されます。 1つは単一の要素を参照し、もう1つはノードセットを参照するため、これらはさまざまな方法で変換されます。

単一の要素の文字列値は、そのすべてのテキストノードの子孫の文字列値を連結したものです。一方、ノードセットの文字列値は、ドキュメント順で最初にあるセット内のノードの文字列値です。

したがって、実際の違いは、文字列に変換するものとその変換がどのように行われるかです。

1
Wayne Burkett