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

问题描述 投票:0回答:11

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

有人知道该怎么做吗?

cucumber capybara
11个回答
75
投票

可以调用 HTML DOM

innerHTML
属性:

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

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

上查看所有可用房产

27
投票

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

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


20
投票

在我的环境中,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 或节点方法。假设人们不只是编造事情,也许你会从 find 中得到不同的东西,具体取决于你用 Capybara 加载的其他内容。


15
投票

看起来您可以执行

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

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

您可以执行以下操作:

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

11
投票

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

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

4
投票

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

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

innerHTML
:

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

2
投票

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

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

例如:

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

1
投票

尝试调用

find('//tr[2]//td[10]').node
来获取实际的 nokogiri 对象


0
投票

嗯,Capybara 使用 Nokogiri 来解析,所以这个页面可能合适:

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

我相信

content
就是您正在寻找的方法。


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>)

0
投票

你可以使用更简单的东西。

find('div').text

https://www.rubydoc.info/gems/capybara/Capybara/Node/Element#text-instance_method

© www.soinside.com 2019 - 2024. All rights reserved.