這樣做是爲了引入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
來詳細說明wst的答案,'。='Description'也可以寫成'text()='Description'這裏的'.'被稱爲上下文節點,或者n頌與指數 – JWiley 2013-03-05 16:18:04
@JWiley好點,這更可讀。 – wst 2013-03-05 16:25:54
我很確定我做錯了什麼......但我無法讓xpath查詢工作。有任何想法嗎? – 2013-03-06 18:01:15