2013-12-15 108 views
1

我試圖使用XPath找到鏈接基於鏈接的文本(標籤)列表的鏈接。問題是他們也有圖標(目前隱藏),所以簡單地使用text()不符合它們。的XPath選擇通過鏈接中的文本,鏈接還包含我

我想:

  • //ul[contains(@class, 'nav-tabs')]/li/a[text()='Details']
  • //ul[contains(@class, 'nav-tabs')]/li/a[normalize-space(text())='Details']

但既不找到詳細信息選項卡。簡單地做//ul[contains(@class, 'nav-tabs')]/li/a不會讓我所有的鏈接,我可以在其中看到<i>Details文本的話,但我不能得到公正的「詳細信息」鏈接。

我想避免使用含有(),因爲我擔心,我們將有可能這樣,如果一個詞是一個較大的字內匹配兩個標籤,所以我想完全匹配它。

HTML:

<ul class="nav nav-tabs"> 
    <li class="active"> 
     <a href="#s52ae1defa2b1e_1" data-toggle="tab"> 
      <i class="icon-exclamation-sign has-errors hide"></i> 
      Details 
     </a> 
    </li> 
    <li class=""> 
     <a href="#s52ae1defa2b1e_2" data-toggle="tab"> 
      <i class="icon-exclamation-sign has-errors hide"></i> 
      Description 
     </a> 
    </li> 
    <li class=""> 
     <a href="#s52ae1defa2b1e_3" data-toggle="tab"> 
      <i class="icon-exclamation-sign has-errors hide"></i> 
      SEO 
     </a> 
    </li> 
</ul> 
+0

你的第一個試用效果完美的我 –

+0

當我在控制檯中做到這一點,它不工作,並運行在貝哈特測試時要麼不工作,所以我不知道它是如何工作爲你。 – Jessica

+0

我只是複製粘貼HTML文件和XPath表達式[here](http://videlibri.sourceforge.net/cgi-bin/xidelcgi)並顯示「Details」錨點。另外,我會建議你看看這個[問題](http://stackoverflow.com/questions/20247327/find-out-if-class-name-contains-certain-text/20247406#20247406),看看爲什麼你使用的'contains'可能會在將來遇到不必要的類,比如'disabled-nav-tabs',從而給你帶來麻煩 –

回答

2

可以使用//ul[contains(@class, 'nav-tabs')]/li/a[normalize-space(.)='Details']

//ul[contains(@class, 'nav-tabs')]/li/a[text()[normalize-space(.)='Details']]

normalize-space()需要字符串作爲參數,所以上下文節點.將被轉換爲一個字符串。在這種情況下,a元素內的文字表示。

你甚至可以ommit上下文節點並使用//ul[contains(@class, 'nav-tabs')]/li/a[normalize-space()='Details']

the XPath 1.0 docs

正規化空間函數返回的參數字符串,這些空白被剝離前後空白和更換空白的序列歸字符由一個空格。空白字符與XML中S生產所允許的字符相同。如果省略參數,則默認將上下文節點轉換爲字符串,換句話說就是上下文節點的字符串值。


OP的評論後,一些更多的解釋:

text()是一個節點測試(見this link),但不給你一個上下文節點的字符串值,它在你的XPath表達式

測試

節點測試文本()對於任何文本節點均爲true。

normalize-space(text())確實會返回一個字符串,但空單,你的情況。將匹配上下文節點的所有文本子節點的節點集參數text()將被轉換爲字符串值,但僅考慮節點集中的第一個節點。見the string() function description

節點集是通過在返回的節點字符串值轉換爲字符串的節點集即第一文檔順序。如果節點集爲空,則返回空字符串。

這也適用於normalize-space()

所以如果你使用normalize-space(text()),你會在你的a上下文中得到一個空字符串。

您可以使用示例HTML在http://www.freeformatter.com/xpath-tester.html上用//ul[contains(@class, 'nav-tabs')]/li/a/text()驗證此情況。你會得到

Text='' <-- this will be used in //li/a[normalize-space(text())... 
Text='Details' 
Text='' 
Text='Description' 
Text='' 
Text='SEO' 

而且你可以看到normalize-space(//ul[contains(@class, 'nav-tabs')]/li/a/text())返回一個空字符串。

但是如果你使用normalize-space(.)normalize-space()字符串值將從開頭和結尾的空白剝離會在你的情況上下文節點,a的字符串值:

元素節點的字符串值是文檔順序中元素節點的所有文本節點後代的字符串值的串聯。

+0

不是text()返回一個字符串嗎?我可以發誓我們之前使用了normalize-space(text()),它的工作 – Jessica

+0

@Jessica,我已經添加了一些進一步的解釋。希望能幫助到你。 –

相關問題