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

Cucumber 如何使用Capybara在元素中获取HTML?,cucumber,capybara,Cucumber,Capybara,我正在编写一个cucumber测试,希望在元素中获得HTML 例如: page.find('[name="form-field"]').native.value == 'something' 在“表”中 #这很有效 find('//tr[2]//td[7]')。text.should==“这些是注释” #我想要这样的东西(没有“html”方法) find('//tr[2]//td[7]')。html.should==“这些是b命令/b” 结束 有人知道怎么做吗?好吧,水豚使用Nokogiri

我正在编写一个cucumber测试,希望在元素中获得HTML

例如:

page.find('[name="form-field"]').native.value == 'something'
在“表”中
#这很有效
find('//tr[2]//td[7]')。text.should==“这些是注释”
#我想要这样的东西(没有“html”方法)
find('//tr[2]//td[7]')。html.should==“这些是b命令/b”
结束

有人知道怎么做吗?

好吧,水豚使用Nokogiri进行解析,所以这个页面可能合适:


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

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

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

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

elem=find('//tr[2]//td[10]'))
node=elem.native
#这将为您提供一个Nokogiri XML元素
node.children[1]。属性[“href”].value.should==“这些是b项/b”

最后一部分可能会有所不同,但您应该能够在该节点变量中的某个地方找到HTML。在我的环境中,find返回一个Capybara::Element-它响应于上面提到的:native方法,该方法返回一个Selenium::WebDriver::Element(对于我)。然后:文本获取内容,因此可以简单到:

results=find(:xpath,“//td[@id='{cell\u id}']))
contents=results.native.text

如果要查找表格单元格的内容。Capybara::元素上没有内容、内部html、内部文本或节点方法。假设人们不仅仅是在编造东西,也许你会从find中得到一些不同的东西,这取决于你用Capybara加载的其他东西。

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

如果驱动程序支持javascript计算(如Selenium),则可以使用
innerHTML

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

看起来您可以执行
(node).native.internal\u html
来获取html内容,例如使用如下html:

<div><strong>Some</strong> HTML</div>
一些HTML
您可以执行以下操作:

find('div').native.inner_html
=> '<strong>Some</strong> HTML'
# 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>)
find('div').native.inner\u html
=>“一些HTML”

您可以调用HTML DOM
innerHTML
属性:

find('//tr[2]//td[7]')['innerHTML']
适用于任何浏览器或驱动程序。
您可以检查

上的所有可用属性如果您使用的是Poltergeist驱动程序,这些方法将允许您检查哪些匹配项:

例如:

page.find('[name="form-field"]').native.value == 'something'
您还可以切换到并执行以下操作:

find('div').native.inner_html
=> '<strong>Some</strong> HTML'
# 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>)
#定义您的小部件,在本例中是您的角色
类用户
我遇到了与Cyril Duchon Doris相同的问题,访问Capybara::Poltergeist::Node的HTML的方法是通过outerHTML属性,例如:

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

没有评论方法。。。尝试执行此操作:
find('//tr[2]//td[10]')。内容
您可以发布实际步骤吗?看看你在这里做什么会很有帮助。我已经完成了page.find(…),并参考了Nokogiri文档来解析响应。也许我只是幸运。。。注意,我说的是page.find。我认为Capybara提供了页面对象,Webrat提供了响应对象。该步骤的内容在原始帖子中。
internal\u html()
应该提供给定节点中的所有内容
internal_text()
应该为您提供节点内的所有文本。也可以与
poltergeist
一起使用。不是每个
未定义的方法internal_html for#
都可以使用Selenium,这个答案对我不起作用,但对我有效。