如何使用Capybara在元素中获取HTML?

时间:2010-11-01 18:37:36

标签: cucumber capybara

我正在写一个黄瓜测试,我想在一个元素中获取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

任何人都知道怎么做?

10 个答案:

答案 0 :(得分:51)

您可以调用HTML DOM innerHTML属性:

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

适用于任何浏览器或驱动程序。 您可以在w3schools

上查看所有可用的属性

答案 1 :(得分:24)

这篇文章很老了,但我想如果你还需要这个,我找到了一种方法。

要从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

答案 2 :(得分:16)

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

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

如果您正在寻找表格单元格的内容。 Capybara :: Element上没有content,inner_html,inner_text或node方法。假设人们不仅仅是在制造东西,也许你可以根据你在Capybara上装载的其他东西找到不同的东西。

答案 3 :(得分:7)

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

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

您可以执行以下操作:

find('div').native.inner_html
=> '<strong>Some</strong> HTML'

答案 4 :(得分:5)

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

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

答案 5 :(得分:4)

其他大多数答案仅适用于Racktest(因为它们使用Racktest特定的功能)。

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

html = page.evaluate_script("document.getElementById('my_id').innerHTML")

答案 6 :(得分:1)

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

答案 7 :(得分:0)

嗯,Capybara使用Nokogiri进行解析,所以这个页面可能是合适的:

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

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

答案 8 :(得分:0)

如果您正在使用Poltergeist驱动程序,这些方法将允许您检查匹配的内容:

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

例如:

page.find('[name="form-field"]').native.value == 'something'

答案 9 :(得分: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>)