2017-04-14 157 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')]] 

但沒有奏效。

理想情況下,我想搜索整個文本,而不是一個子字符串,以便這個元素與文本「後退」將被發現,但與文本「備份」的另一個相似的元素將不會被發現。我不需要連接不同子元素中的文本。

我應該寫什麼選擇器?謝謝!

回答

0

你在找什麼樣的東西?

// * [文本()= '後退'] /祖先:: * [@類= 'mblToolBarButton mblToolBarButtonHasLeftArrow']

+0

花了我一些時間才意識到這會找到祖先,而不是孩子。謝謝,這可能會起作用!但有時我只需要通過調用該元素的findElement()方法在給定元素下找到這些元素。我可以在開始時刪除//,但是/ ancestor ::會在最初的元素上面遍歷DOM嗎? –

1

您只需要使用.而不是text(),對吧?對樹的文本內容

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

.比賽,包括所有的後裔,但text()只檢查任何直接的子節點的文本內容。

但是,這可以進一步簡化了的,如果不是串你想爲備份的精確匹配:

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

如果你想忽略元素間空間(你沒有,你需要normalize-space(.)在問題的例子中有任何的,但如果你縮進這裏的另一個答案)。

+0

謝謝!這其中比其他答案簡單得多,但我不明白在我想要「返回」時如何適應它不捕捉「備份」。 '。[。=「返回」]工作嗎? –

+0

是的,你基本上只想刪除'contains(...)'。購買你也需要使用'normalize-space(...)'。看到我更新的答案。 – sideshowbarker

2

您可以使用這樣的結構:

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

到SEACH的父元素,其中包含孩子指定的文本。通過這種方式,可以找到帶有「後退」文本的元素,但是具有「備份」的元素不會。

順便說一句:提供可讀的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')and(text ()='Back'或.//* [text()='Back'])]' –

相關問題