2017-04-14 26 views
1

私はSelenium WebDriverを使用しています。 (Javaの場合は重要です)。Selenium WebDriver by xpath:子要素のテキストで検索

私は要素の中から、下位要素の下にあるテキストを検索する必要があります。私は現在、要素のリストをループし、getText()を私が望む値と比較することでそれを行いますが、ブラウザがxpathを通してそれを行うようにする方が良いでしょう。私は、次のセレクタを試みた

<span role="button" class="mblToolBarButton mblToolBarButtonHasLeftArrow" tabindex="0" id="dojox_mobile_ToolBarButton_3" dir="ltr" widgetid="dojox_mobile_ToolBarButton_3"><span class="mblToolBarButtonArrow mblToolBarButtonLeftArrow mblColorDefault mblColorDefault45"></span><span class="mblToolBarButtonBody mblColorDefault"><table cellpadding="0" cellspacing="0" border="0" role="presentation" class="mblToolBarButtonText"><tbody><tr><td class="mblToolBarButtonIcon"></td><td class="mblToolBarButtonLabel">Back</td></tr></tbody></table></span></span> 

オンラインで検索した後:

//*[contains(@class,'mblToolBarButtonHasLeftArrow') and text()[contains(.,'Back')]] 

をしかし、それは動作しませんでした

は例えば、ここで私が見つけたい要素です。

理想的には、文字列 "Back"を持つこの要素が見つかるように部分文字列ではなくテキスト全体で検索したいと思いますが、テキスト "Backup"を持つ類似の要素は見つかりません。私は、異なる子要素のテキストを連結する必要はありません。

どのセレクタを書くべきですか?ありがとう!

答えて

0

次のようなものをお探しですか?

// * [テキスト()= '戻る'] /祖先:: * [クラス@ = 'mblToolBarButton mblToolBarButtonHasLeftArrow']

+0

これは、先祖が子供ではなく、これを見つけることを実現するために時間をかけました。ありがとう、これはおそらく動作します!しかし、時には、その要素のfindElement()メソッドを呼び出すことによって、その要素を特定の要素の下でのみ見つける必要があります。私は最初に//を取り除くことができますが、/ ancestor ::はDOMの最初の要素の上を横断します。 –

1

text()の代わりに.を使用するだけです。

//*[contains(@class,'mblToolBarButtonHasLeftArrow') and .[contains(.,'Back')]] 

.すべての子孫を含むツリーのテキストコンテンツに対する一致、しかしtext()は任意の直接の子ノードのテキストコンテンツをチェックします。

しかし、それはさらに簡略化し、代わりにサブストリングのあなたはバックアップと完全に一致する場合は次のことができます。あなたがそうでない(素子間のスペースを無視したい場合は、normalize-space(.)が必要

//*[contains(@class,'mblToolBarButtonHasLeftArrow') and normalize-space(.) = 'Back'] 

を例の中のいずれかを質問に入れておきますが、ここで別の答えが示唆するようにインデントしてもかまいません)。

+0

ありがとう!これは、他の答えよりもはるかに単純ですが、私は "バックアップ"をしたいときに "バックアップ"をキャッチしないようにそれを適応させる方法を理解していません。 '。[" = "戻る"] 'は働くだろうか? –

+0

ええ、基本的に 'contains(...)'をドロップしたいだけです。あなたは 'normalize-space(...)'も使う必要があります。私の更新された答えを見てください。 – sideshowbarker

2

あなたはこのような構成を使用することができます。

//*[contains(@class,'mblToolBarButtonHasLeftArrow') and .//*[text()='Back']] 

指定されたテキストで子供を含む親要素のためのWiki検索します。このようにして、テキスト 'Back'を持つ要素が見つかりますが、 'Backup'を持つ要素は検索されません。

BTW:長い行の代わりに読みやすいHTMLの断片を提供することは、より丁寧です。たとえば、

<span role="button" class="mblToolBarButton mblToolBarButtonHasLeftArrow" tabindex="0" id="dojox_mobile_ToolBarButton_3" dir="ltr" widgetid="dojox_mobile_ToolBarButton_3"> 
    <span class="mblToolBarButtonArrow mblToolBarButtonLeftArrow mblColorDefault mblColorDefault45"></span> 
    <span class="mblToolBarButtonBody mblColorDefault"> 
     <table cellpadding="0" cellspacing="0" border="0" role="presentation" class="mblToolBarButtonText"> 
      <tbody> 
       <tr> 
        <td class="mblToolBarButtonIcon"></td> 
        <td class="mblToolBarButtonLabel">Back</td> 
       </tr> 
      </tbody> 
     </table> 
    </span> 
</span> 
+0

ありがとうございます。次回は長いHTMLを引用して、自動フォーマッタを使用しています。 –

+0

私はこれと一緒に行った、それは動作します。実際には、テキストがその直下にある場合に要素をキャッチする必要があります。このため、これに基づいて使用したフォームは次のようになります。 '// * [contains(@ class、 'mblToolBarButtonHasLeftArrow')と(text ()= 'Back'または.//* [text()= 'Back'])] ' –

関連する問題