0

鉴于此 HTML 标记:

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

尝试编写一个 Ruby 方法,该方法将采用两个参数“Description”和“QA Test Customer”,并使用 Selenium WebDriver 和 XPath 断言带有标签“Description”的输入值实际上是“QA Test Customer”。

不熟悉xpath,所以我很挣扎。我知道我需要一个 xpath 字符串:

"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
//td[@class='label' and .='Description']/following-sibling::td[@class='data']/div
于 2013-03-05T16:10:57.627 回答
1

这是为 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
于 2013-03-05T16:17:15.330 回答