76

我正在编写一个黄瓜测试,我想在一个元素中获取 HTML。

例如:

within 'table' do
  # this works
  find('//tr[2]//td[7]').text.should == "these are the comments" 

  # I want something like this (there is no "html" method)
  find('//tr[2]//td[7]').html.should == "these are the <b>comments</b>" 
end

有人知道怎么做吗?

4

10 回答 10

68

您可以调用 HTML DOMinnerHTML属性:

find('//tr[2]//td[7]')['innerHTML']

应该适用于任何浏览器或驱动程序。您可以在w3schools上查看所有可用的属性

于 2014-05-18T19:30:38.473 回答
26

这篇文章很旧,但我想我找到了一种方法,如果你仍然需要它。

要从 Capybara 元素访问 Nokogiri 节点(使用 Capybara 1.0.0beta1、Nokogiri 1.4.4),请尝试以下操作:

elem = find('//tr[2]//td[10]')
node = elem.native
#This will give you a Nokogiri XML element

node.children[1].attributes["href"].value.should == "these are the <b>comments</b>"

最后一部分可能因您而异,但您应该能够在该节点变量中的某处找到 HTML

于 2011-06-07T01:33:13.473 回答
19

在我的环境中, find 返回一个 Capybara::Element - 响应 :native 方法,如 Eric Hu 上面提到的,它返回一个 Selenium::WebDriver::Element (对我来说)。然后 :text 获取内容,所以它可以很简单:

results = find(:xpath, "//td[@id='#{cell_id}']")
contents = results.native.text

如果您正在查找表格单元格的内容。Capybara::Element 上没有内容、inner_html、inner_text 或节点方法。假设人们不只是在编造东西,也许你会得到与 find 不同的东西,这取决于你用 Capybara 加载的其他内容。

于 2013-03-15T18:11:03.837 回答
12

看起来您可以(node).native.inner_html获取 HTML 内容,例如使用这样的 HTML:

<div><strong>Some</strong> HTML</div>

您可以执行以下操作:

find('div').native.inner_html
=> '<strong>Some</strong> HTML'
于 2013-09-23T23:12:04.327 回答
7

我遇到了与 Cyril Duchon-Doris 相同的问题,并且根据https://github.com/teampoltergeist/poltergeist/issues/629访问Capybara ::Poltergeist::Node的 HTML 的方法是通过outerHTML属性,例如:

find('//tr[2]//td[7]')['outerHTML']
于 2017-02-03T15:42:40.510 回答
4

大多数其他答案仅在 Racktest 中有效(因为它们使用 Racktest 特定的功能)。

如果您的驱动程序支持 javascript 评估(如 Selenium),您可以使用innerHTML

html = page.evaluate_script("document.getElementById('my_id').innerHTML")
于 2013-03-17T10:35:05.673 回答
1

尝试调用find('//tr[2]//td[10]').node它以获取实际的 nokogiri 对象

于 2010-11-19T18:10:24.333 回答
1

如果您使用 Poltergeist 驱动程序,这些方法将允许您检查匹配项:

http://www.rubydoc.info/gems/poltergeist/1.5.1/Capybara/Poltergeist/Node

例如:

page.find('[name="form-field"]').native.value == 'something'
于 2014-11-05T00:15:08.717 回答
0

好吧,Capybara 使用 Nokogiri 来解析,所以这个页面可能是合适的:

http://nokogiri.org/Nokogiri/XML/Node.html

我相信content这是您正在寻找的方法。

于 2010-11-05T00:13:08.877 回答
0

您还可以切换到capybara-ui并执行以下操作:

# define your widget, in this case in your role
class User < Capybara::UI::Role
  widget :seventh_cell, [:xpath, '//tr[2]//td[7]']
end

# then in your tests
role = User.new

expect(role.widget(:seventh_cell).html).to eq(<h1>My html</h1>)
于 2016-01-22T16:11:01.783 回答