Как получить внутренний текст с помощью капибары и полтергейста?
У меня есть этот простой 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 "
Удачи!