我正在写一个黄瓜测试,我想在一个元素中获取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
任何人都知道怎么做?
答案 0 :(得分:51)
您可以调用HTML DOM innerHTML
属性:
find('//tr[2]//td[7]')['innerHTML']
适用于任何浏览器或驱动程序。 您可以在w3schools
上查看所有可用的属性答案 1 :(得分:24)
这篇文章很老了,但我想如果你还需要这个,我找到了一种方法。
要从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
答案 2 :(得分:16)
在我的环境中,find返回一个Capybara :: Element - 响应上面提到的Eric Hu的native方法,它返回一个Selenium :: WebDriver :: Element(对我来说)。然后:文本获取内容,因此它可以简单:
results = find(:xpath, "//td[@id='#{cell_id}']")
contents = results.native.text
如果您正在寻找表格单元格的内容。 Capybara :: Element上没有content,inner_html,inner_text或node方法。假设人们不仅仅是在制造东西,也许你可以根据你在Capybara上装载的其他东西找到不同的东西。
答案 3 :(得分:7)
看起来你可以(node).native.inner_html
来获取HTML内容,例如使用这样的HTML:
<div><strong>Some</strong> HTML</div>
您可以执行以下操作:
find('div').native.inner_html
=> '<strong>Some</strong> HTML'
答案 4 :(得分:5)
我遇到了与Cyril Duchon-Doris相同的问题,并且每https://github.com/teampoltergeist/poltergeist/issues/629访问 Capybara :: Poltergeist :: Node 的HTML的方式是通过 outerHTML 属性,例如:
find('//tr[2]//td[7]')['outerHTML']
答案 5 :(得分:4)
其他大多数答案仅适用于Racktest(因为它们使用Racktest特定的功能)。
如果您的驱动程序支持javascript评估(如Selenium),您可以使用innerHTML
:
html = page.evaluate_script("document.getElementById('my_id').innerHTML")
答案 6 :(得分:1)
尝试在其上调用find('//tr[2]//td[10]').node
以获取实际的nokogiri对象
答案 7 :(得分:0)
嗯,Capybara使用Nokogiri进行解析,所以这个页面可能是合适的:
http://nokogiri.org/Nokogiri/XML/Node.html
我相信content
是您正在寻找的方法。
答案 8 :(得分:0)
如果您正在使用Poltergeist驱动程序,这些方法将允许您检查匹配的内容:
http://www.rubydoc.info/gems/poltergeist/1.5.1/Capybara/Poltergeist/Node
例如:
page.find('[name="form-field"]').native.value == 'something'
答案 9 :(得分: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>)