これはのこぎりのために書かれています。SeleniumがNokogiriを使用しているのか、それとも独自のXMLパーサーを使用しているのかわからないので、役に立たないかもしれません。
私はCSSの方が好きです。なぜなら、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