如何在使用Capybara的元素中获取HTML?
我正在写一个黄瓜testing,我想要在一个元素的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上所有可用的属性
这个post是旧的,但我想我find了一个方法,如果你仍然需要这个。
要从Capybara元素(使用Capybara 1.0.0beta1,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>"
最后一部分可能会有所不同,但是您应该能够在该节点variables的某处findHTML
在我的环境中,find返回一个Capybara :: Element,它响应上面提到的Eric Hu所提供的native方法,它返回一个Selenium :: WebDriver :: Element(对我来说)。 然后:文本获取内容,所以可以这样简单:
results = find(:xpath, "//td[@id='#{cell_id}']") contents = results.native.text
如果你正在寻找表格单元格的内容。 在Capybara :: Element中没有内容,inner_html,inner_text或节点方法。 假设人们不只是在制作东西,也许你会find不同的东西,这取决于你装什么水豚。
看起来像你可以(node).native.inner_html
来获取HTML内容,例如像这样的HTML:
<div><strong>Some</strong> HTML</div>
你可以做到以下几点:
find('div').native.inner_html => '<strong>Some</strong> HTML'
大多数其他的答案只适用于Racktest(因为他们使用Racktest特定的function)。
如果你的驱动支持javascript评估(比如Selenium),你可以使用innerHTML
:
html = page.evaluate_script("document.getElementById('my_id').innerHTML")
我碰到了与Cyril Duchon-Doris相同的问题,并且根据https://github.com/teampoltergeist/poltergeist/issues/629访问Capybara :: Poltergeist :: Node的HTML的方法是通过outerHTML属性,例如:
find('//tr[2]//td[7]')['outerHTML']
尝试调用find('//tr[2]//td[10]').node
来获取实际的nokogiri对象
那么,水豚使用Nokogiriparsing,所以这个页面可能是适当的:
http://nokogiri.org/Nokogiri/XML/Node.html
我相信content
是你正在寻找的方法。
如果您使用的是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>)