2013-03-05 31 views
0

鑑於此HTML標記:是否有可能使用xpath獲取輸入的值來搜索相應標籤的值?

<tr> 
    <td class="label">Description</td> 
    <td class="data"><div>QA Test Customer</div></td> 
</tr> 

試圖寫一個Ruby方法,將採取兩個參數「描述」和「QA測試客戶」,並斷言,與標籤「說明」中輸入的值是事實上使用Selenium WebDriver和XPath的「QA測試客戶」。

不熟悉XPath,所以我很掙扎。我知道我需要一個XPath字符串將:

"find a <td> with class of 'label' that has a value of 'Description' then get the value of the <div> embedded in the following <td> with class of 'data' 

任何指針是極大的讚賞!

回答

1
//td[@class='label' and .='Description']/following-sibling::td[@class='data']/div 
+1

來詳細說明wst的答案,'。='Description'也可以寫成'text()='Description'這裏的'.'被稱爲上下文節點,或者n頌與指數 – JWiley 2013-03-05 16:18:04

+0

@JWiley好點,這更可讀。 – wst 2013-03-05 16:25:54

+0

我很確定我做錯了什麼......但我無法讓xpath查詢工作。有任何想法嗎? – 2013-03-06 18:01:15

1

這樣做是爲了引入nokogiri寫的。我不知道,如果使用硒引入nokogiri,或自己的XML解析器,因此可能無法幫助....

我更喜歡CSS,因爲它通常是更簡潔,更容易理解:

require 'nokogiri' 

doc = Nokogiri::HTML(<<EOT) 
<tr> 
    <td class="label">Description</td> 
    <td class="data"><div>QA Test Customer</div></td> 
</tr> 
EOT 

doc.at('td.label + td.data').text 
=> "QA Test Customer" 

doc.at('td.label + td.data').text == 'QA Test Customer' 
=> true 

這只是尋找第一<td class="label">隨後與<td class="data">兄弟,但我們可以在搜索文本也補充:

!!doc.at(%Q/td[class="label"]:contains("Description") + td[class="data"] div:contains("QA Test Customer")/) 
=> true 

談及到這一點,你可以調用的方法變爲:

def td_match(doc, s1, s2) 
    !!doc.at(%Q/td[class="label"]:contains("#{ s1 }") + td[class="data"] div:contains("#{ s2 }")/) 
end 

,把它在IRB:

irb(main):024:0> def td_match(doc, s1, s2) 
irb(main):025:1>  !!doc.at(%Q/td[class="label"]:contains("#{ s1 }") + td[class="data"] div:contains("#{ s2 }")/) 
irb(main):026:1> end 
=> nil 
irb(main):027:0> td_match(doc, 'Description', 'QA Test Customer') 
=> true 

清潔它一點:

def td_match(doc, s1, s2) 
    !!doc.at(
    %Q/td[class="label"]:contains("#{ s1 }") + td[class="data"] div:contains("#{ s2 }")/ 
) 
end 

或者,將其添加到引入nokogiri :: HTML文檔:::

class Nokogiri::HTML::Document 
    def td_match(s1, s2) 
    !!self.at(
     %Q/td[class="label"]:contains("#{ s1 }") + td[class="data"] div:contains("#{ s2 }")/ 
    ) 
    end 
end 

doc.td_match('Description', 'QA Test Customer') 
=> true 
+0

不錯的作品錫文。我在另一個項目中使用了Nokogiri進行了一些屏幕掃描並考慮了它。鑑於你已經拋出了我的壘球,我全部都是這樣做的! – 2013-03-06 13:57:23

+0

在第一個簡單示例中,doc.at('td.label + td.data').text中的文本中出現了nil:NilClass(NoMethodError)的「undefined method' text」。看起來很奇怪,因爲我們傳遞的HTML,所以我們知道文檔不是零... – 2013-03-06 15:39:09

+0

這不是'doc'是零,這是訪問者沒有找到這些類彼此相鄰的標籤。因此,Nokogiri返回'nil','nil.text'不是一個定義的方法。示例HTML可能不是對真實HTML的精確描述? – 2013-03-06 17:16:05

相關問題