2013-05-10 65 views
1

我想用canoo webtest驗證xpath。標籤之間文本的XPath

我的HTML看起來像這樣:

<div id="myDivId">Firstname Lastname</div> 

的名字和姓氏之間的空間用「&nbsp;」創建。

我嘗試了類似下面的內容,但是當我使用FirePath或Firebug控制檯測試它時,它總是失敗。

//div[@id='myDivId' and contains(.,'Firstname Lastname')] 
//div[@id='myDivId' and contains(.,'Firstname&nbsp;Lastname')] 
//div[@id='myDivId'][contains(text(),'Firstname Lastname')] 
//div[@id='myDivId'][matches(text(),'Firstname.Lastname')] 

有時我真的不知道版本之間的區別。在stackoverflow上找到1000個解決方案後,這或多或少是一個嘗試和錯誤。但它從來沒有爲我工作:/ 我也試着瞭解.text()以及如何包含和匹配作品的區別。但是隻要我所有的測試案例都失敗了,我就不能真正理解它。

我錯了什麼?

+1

看來你的HTML標籤中缺少您發佈。您需要將它們包含爲代碼才能顯示出來。 – mortb 2013-05-10 08:26:58

+0

@mortb感謝您的建議:) – NDY 2013-05-10 10:09:57

回答

1

看來問題是,該NBSP實體沒有定義<!ENTITY nbsp "&#160;">
你也可以試試(應該工作):

"//div[@id='myDivId' and contains(text(),'Firstname&#160;Lastname')])" 

"//div[@id='myDivId' and text() ='Firstname&#160;Lastname'])" 

text()只返回的文本當前元素。
.(在字符串上下文中)返回當前元素的任何子項的測試。

在你的例子中,沒有什麼不同,因爲div在文本旁邊沒有任何孩子。

更新: 這似乎是一個特殊的問題的FireFox擴展FirePath。即使螢火蟲 的document.evalute會做:

var xpath = "//div[@id='myDivId' and text() ='Firstname\xa0Lastname']"; 
divs = document.evaluate(xpath, document, null, XPathResult.ANY_TYPE, null); 
d1=divs.iterateNext(); 

但考慮NBSP爲\0xa0的的JavaScript編碼。

+0

感謝您的幫助。我試着用 的表達式,但螢火蟲沒有找到節點。當我僅使用「名字」時,節點被選中。 – NDY 2013-05-10 09:06:42

+0

@Andy:如果認爲這是一個在FirePaht中的錯誤 – 2013-05-10 14:05:02

+0

你是對的。我只是將它實現在我的測試用例中 - 直接放到我的buildserver上 - 所有的燈都是綠色的。該死的。爲什麼我之前沒有嘗試過......感謝您的幫助。似乎是FirePath的一個問題。接受答案。 – NDY 2013-05-10 16:31:23

1

另一種可能的方式是分裂的話,那麼使用這個xpath-

//div[@id='myDivId' and contains(text(), 'Firstname') and contains(text(), 'Lastname')] 
+0

簡單而直接的想法。我有點像這樣,即使它不完全相同的測試。 +1 – NDY 2013-05-13 14:00:04