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

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

有人知道怎么做吗?

52477 次浏览

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

Http://nokogiri.org/nokogiri/xml/node.html

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

试着调用 find('//tr[2]//td[10]').node来获取真正的 nokogiri 物体

这个帖子很旧了,但是我想我找到了一个方法,如果你还需要这个的话。

要从 Capybara 元素(使用 Capybara 1.0.0 beta1,Nokogiri 1.4.4)访问 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

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

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

如果要查找表单元格的内容,请使用。Capybara: : Element 上没有 content、 inner _ html、 inner _ text 或节点方法。假设人们不是在胡编乱造,也许你从发现中得到了不同的东西,这取决于你还装载了什么其他的水豚。

大多数其他答案只能在 Racktest 中工作(因为它们使用 Racktest 特定的特性)。

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

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

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

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

你可以这样做:

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

可以调用 HTML DOM innerHTML属性:

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

应该适用于任何浏览器或驱动程序。 你可以查看所有可用的属性在 < a href = “ https://www.w3school. com/jsref/dom _ obj _ all.asp”rel = “ norefrer”> w3school

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

Http://www.rubydoc.info/gems/poltergeist/1.5.1/capybara/poltergeist/node

例如:

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

您也可以切换到 水豚并执行以下操作:

# 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 相同的问题,根据 https://github.com/teampoltergeist/poltergeist/issues/629,访问 水豚: : Poltergeist: : Node的 HTML 的方法是通过 外部 HTML属性,例如:

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