这是为 Nokogiri 写的。我不知道 Selenium 是使用 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::Document:
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