5 答え

2つのテキストノードで必要な div を一致させるためにXPath以下を使用してみてください。

//div[normalize-space(text())="start of div text - part 1" and normalize-space(text()[2])="end of div text - part 2"]
2
追加された
@cruisepandey、私たちは最も信じられない状況を想像することができます...しかし、OPは "...テキストは2つの部分に分割されています" と言っています
追加された 著者 Andersson,
それはすごい!
追加された 著者 Rajagopalan,
@アンダーソン:効率的な解決策ではありませんが、IMOでは、テキストを3つか4つに分割するとどうなるでしょう。 text()[2]、text()[3]、text()[4]などと書く必要はありません。
追加された 著者 cruisepandey,

あなたはほとんどそこにいました。次のように text(). に置き換えるだけです。

//div[contains(., 'start of div text') and contains(., 'end of div text')]

これが検証のスナップショットです。

xpath_tester

1
追加された
@ Alex.K別の<div> が粗い場合は、 xpath が変わります。私の答えでは、私は常にOPのイノベーションを維持しようとしています。最も有用な答えを選択するのはあなたの決断です:)すべて最高!
追加された 著者 DebanjanB,
私はあなたの解決策が好きです、結果XPathは清潔でシンプルに見えます。ただし、ターゲットタグの周囲に別の<div>タグがある場合は、囲んでいるものではなく、このXPathで囲んでいるものが見つかります。
追加された 著者 Alex.K,
さて、あなたは複数のdivを区別する方法を知っているべきです。あなたがアンダーソンから持っている現在の解決策はたった2つのテキスト分割に対してうまくいくでしょう。前に述べたように、あなたのxpathはUIにある正確なテキストを含むべきではありません。テキストがUIで変更された場合は、xpathを変更する必要がありますが、これは不要です。
追加された 著者 cruisepandey,
残念ながら、ターゲットページには同じIDと属性を持つdivがたくさんあるので、私の場合は@idを使用することはできません。
追加された 著者 Alex.K,

これらの子テキスト要素の div 要素だけが必要な場合は、「パート1」から一意のコンテンツを分離して次のことを試してください。

//* [contains(。、 'part 1')]/parent :: div

こうすれば、 div の属性について考える必要はありません。

ただし、これは通常ありませんベストプラクティスです。理想的には、ほとんどの場合次のXpathを使うべきです。

//div [@id、( 'some id')and contains(。、 'part 1')]

0
追加された

これはうまくいくはずです。

//div[contains(text(), 'start of div text') and contains(./a/text(), 'end of div text')]
0
追加された