0

このHTMLマークアップを考えると:

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

2つのパラメーター「Description」と「QATestCustomer」を取り、「Description」というラベルの付いた入力の値が実際にはSeleniumWebDriverとXPathを使用して「QATestCustomer」であることを表明するRubyメソッドを作成しようとしています。

xpathに精通していないため、苦労しています。次のようなxp​​ath文字列が必要なことはわかっています。

"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'

どんなポインタでも大歓迎です!!

4

2 に答える 2

1

これはのこぎりのために書かれています。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
于 2013-03-05T16:17:15.330 に答える
1
//td[@class='label' and .='Description']/following-sibling::td[@class='data']/div
于 2013-03-05T16:10:57.627 に答える