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


71

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

有人知道怎么做吗?

Answers:


64

您可以调用HTML DOMinnerHTML属性:

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

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


7
工程与poltergeist太。
杰西·费舍尔

26

这篇文章很旧,但是我认为如果您仍然需要此方法,我已经找到了一种方法。

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

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。


使用硒,这个答案对我不起作用,但是这个答案对我有用。
杰森·斯威特

18

在我的环境中,find返回Capybara :: Element-响应上述Eric Hu的:native方法,该方法返回Selenium :: WebDriver :: Element(对我而言)。然后:text获取内容,因此可能很简单:

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

如果要查找表格单元格的内容。Capybara :: Element上没有内容,inner_html,inner_text或节点方法。假设人们不仅在编造东西,也许您会从水豚身上得到不同的收获,这取决于水豚身上还装载了什么。


10

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

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

您可以执行以下操作:

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

9
并非适合所有人undefined method inner_html for #<Capybara::Poltergeist::Node:0x007ff9aa8c59a0>
西里尔·杜尚-多丽丝


4

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

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

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



0

好吧,水豚使用Nokogiri进行解析,因此此页面可能合适:

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

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


1
没有评论方法...试图这样做:find('//tr[2]//td[10]').content
Jon Kruger 2010年

您可以发布您的实际步骤吗?在这里查看您的工作将很有帮助。我已经完成了page.find(...),并参考了Nokogiri文档来解析响应。也许我只是很幸运...请注意,我说了page.find。我认为Capybara提供了页面对象,而Webrat提供了响应对象。
史蒂夫·罗斯

该步骤的内容在原始帖子中。
乔恩·克鲁格

inner_html()应该为您提供给定节点内的所有内容。inner_text()应该给您节点内的所有文本。
史蒂夫·罗斯

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>)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.