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

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

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

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

Использование 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 "

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


person egwspiti    schedule 26.03.2014    source источник
comment
как сообщает сообщение об ошибке, это, скорее всего, ошибка. Вы должны сообщить об этом разработчикам. На самом деле нет никакого способа использовать text(), и если это не сработает, я буду считать это серьезной ошибкой. Таким образом, вы либо ждете исправления, либо используете другое решение, такое как Nokogiri.   -  person dirkk    schedule 03.04.2014
comment
Я тоже искал, и кажется, что в настоящее время нет возможности получить внутренний HTML. Думаю, нам придется дождаться обновления или сделать запрос на включение. Я думаю, что по крайней мере еще один драйвер Capybara поддерживает метод innerHTML.   -  person B Seven    schedule 30.09.2014


Ответы (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 " 

or

2.2.0 :215 > html.children.first.content

 => " Test "

Удачи!

person Drew B    schedule 12.01.2015
comment
Я должен упомянуть, что причина, по которой вы используете #child на :021, заключается в том, что вы работаете с Nokogiri::XML::Element. Класс Element наследуется от класса Node. - person Drew B; 12.01.2015