如何在使用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>)