2011-04-27 83 views
8

我有HTML,看起來基本上像一個元素如下:選擇與XPath和硒

...  
    <a class="btnX btnSelectedBG" href="#"><span>Sign in</span></a> 
... 

硒以下XPath未能找到元素

//a[contains(text(), 'Sign in') and contains(@class,'btnX')] 

以下的XPath在硒中取得成功,但對我來說還不夠具體。

//a[contains(text(), 'Sign in')] 
//a[contains(@class, 'btnX')] 

爲什麼xpath無法找到元素,我該怎麼做才能使它工作?

+1

'//一個[包含(文本() ,'Sign in')]'不應該選擇那個元素 – 2011-04-27 19:18:38

+0

是的,在這兩個選項中,我會同意第一個應該*不*工作 - 除非它是獲取子元素的文本()並加入它們,就像JavaScript一樣。然而,我並沒有將這一點與它與另一個測試結合起來的事實進行協調,除了*當我編寫了某種模糊邏輯之後,我曾經爲表達式使用了一個特定的「上下文」元素,除此之外無法評估其他表達方式。 – cgp 2011-04-27 19:39:58

+0

它會工作,因爲它也收集子元素的文本。這可以是一個痛苦和一個恩惠:) – Ardesco 2011-04-28 13:52:25

回答

13

比賽情況Sign in是直接的a兒童或兒童的另一個元素:

 
//a[contains(@class,'btnX') and .//text()='Sign in'] 

我的意思是

<a class="btnX btnSelectedBG" href="#">Sign in</a>

<a class="btnX btnSelectedBG" href="#"><b>Sign in</b></a>

0

Yaaa對我來說。我認爲這是最好的答案,但對其他解決方案開放!

//a[contains(@class,'btnX') and span[text()='Sign in']] 
+1

當然:''a [包含(@ class,'btnX')幷包含(。,'登錄')]'。**不要在混合內容模式(如XHTML **)中尋址文本節點。 – 2011-04-27 19:48:06

+0

你確實認識到它在功能上與// a [contains(@class,'btnX')] [span [。='Sign in']]相同,而不是使用一個,我只是把它們分成兩個條件:) – Ardesco 2013-04-15 22:19:21

4

// a [包含(@ class,'btnX')和span [text()='Sign in']]不是一個好主意,因爲您要通過DOM搜索每個錨點,然後嘗試並將其與您的搜索條件相比較。

理想情況下,您希望將XPath鍵入具有ID的第一個上升元素,然後按照樹的順序進行操作。

例如如果您的HTML是

<div id="foo"> 
    <a class="btnX btnSelectedBG" href="#"><span>Sign in</span></a> 
</div> 

你可以使用:

//div[@id='foo']/a[contains(@class, 'btnX')][span[.='Sign in']] 

不幸的是我不知道的頁面結構的其餘部分,所以我不能給你什麼更具體的比:

//a[contains(@class, 'btnX')][span[.='Sign in']] 

但它確實不是一個很好的xpath。

(我XPath的會略有不同的你,因爲我都習慣了。作爲文本的快捷方式()和第二組的[]作爲一個快捷方式,並)

+0

我很好奇。符號和何時可以使用。感謝這個例子。 – cgp 2011-04-29 14:39:35