Как получить внутренний текст с помощью капибары и полтергейста?

У меня есть этот простой HTML:

<div> Test <span> someting </span></div>

Как я могу получить только innertext див?

С помощью text извлекает весь текст из div:

[1] pry(#<SandBox>)> first(:xpath, '//div').text
=> "Test someting"

С помощью text() в моем запросе XPath приводит к следующей ошибке:

[2] pry(#<SandBox>)> first(:xpath, '//div/text()')
Capybara::Poltergeist::BrowserError: There was an error inside the PhantomJS portion of Poltergeist. This is probably a bug, so please report it. 
TypeError: 'null' is not an object (evaluating 'window.getComputedStyle(element).display')

Тем не менее, использование того же XPath с Nokogiri работает:

[3] pry(#<SandBox>)> Nokogiri::HTML(page.html).xpath('//div/text()').text
=> " Test "

Есть ли способ сделать это, используя только капибару, не прибегая к Нокогири?

1 ответ

Вы всегда можете использовать Nokogiri и open-uri.

require 'nokogiri'
require 'open-uri'

2.2.0 :021 > html = Nokogiri::HTML::DocumentFragment.parse('<div> Test <span> someting     </span></div>').child

 => #<Nokogiri::XML::Element:0x44a7082 name="div" children=[#<Nokogiri::XML::Text:0x44a63ee " Test ">, #<Nokogiri::XML::Element:0x44a62e0 name="span" children=[#<Nokogiri::XML::Text:0x44a3f04 " someting ">]>]> 

Затем вы можете выполнять операции с ним в зависимости от того, что вы хотите захватить. Итак, для текста внутри тегов:

2.2.0 :072 > html.children.first

 => #<Nokogiri::XML::Text:0x45ea37c " Test "> 

2.2.0 :073 > html.children.first.text

=> " Test " 

или же

2.2.0 :215 > html.children.first.content

 => " Test "

Удачи!

Другие вопросы по тегам