我正在编写一个黄瓜测试,我想在元素中获取 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
有人知道该怎么做吗?
可以调用 HTML DOM
innerHTML
属性:
find('//tr[2]//td[7]')['innerHTML']
适用于任何浏览器或驱动程序。 您可以在 w3schools
上查看所有可用房产这篇文章很旧,但我想我找到了一种方法,如果你仍然需要这个。
要从 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
在我的环境中,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 加载的其他内容。
看起来您可以执行
(node).native.inner_html
来获取 HTML 内容,例如使用这样的 HTML:
<div><strong>Some</strong> HTML</div>
您可以执行以下操作:
find('div').native.inner_html
=> '<strong>Some</strong> HTML'
我遇到了与 Cyril Duchon-Doris 相同的问题,并且根据 https://github.com/teampoltergeist/poltergeist/issues/629 访问 Capybara::Poltergeist::Node 的 HTML 的方式是通过 outerHTML 属性,例如:
find('//tr[2]//td[7]')['outerHTML']
大多数其他答案仅适用于 Racktest(因为它们使用 Racktest 特定的功能)。
如果您的驱动程序支持 javascript 评估(如 Selenium),您可以使用
innerHTML
:
html = page.evaluate_script("document.getElementById('my_id').innerHTML")
如果您使用 Poltergeist 驱动程序,这些方法将允许您检查匹配的内容:
http://www.rubydoc.info/gems/poltergeist/1.5.1/Capybara/Poltergeist/Node
例如:
page.find('[name="form-field"]').native.value == 'something'
尝试调用
find('//tr[2]//td[10]').node
来获取实际的 nokogiri 对象
嗯,Capybara 使用 Nokogiri 来解析,所以这个页面可能合适:
http://nokogiri.org/Nokogiri/XML/Node.html
我相信
content
就是您正在寻找的方法。
您还可以切换到 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>)
你可以使用更简单的东西。
find('div').text
https://www.rubydoc.info/gems/capybara/Capybara/Node/Element#text-instance_method