Это написано для 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() =' Описание'' '.' Здесь называется контекстным узлом, или n ода с индексом – JWiley
@JWiley Хорошая точка, это более читаемо. – wst
Я уверен, что я делаю что-то неправильно ... но я не могу заставить этот запрос xpath работать. Есть идеи? –