2014-03-26 11 views
5

Ich habe diese einfache HTML:Wie kann man Innentext mit Capybara und Poltergeist abrufen?

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

Wie kann ich nur die innertext des div abrufen?

text Mit holt den gesamten Text aus dem div:

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

text() in meine XPath Abfrage-Ergebnisse in der folgenden Fehler Verwendung:

[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') 

jedoch die gleiche XPath mit Nokogiri funktioniert:

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

Gibt es eine Möglichkeit, es zu verwenden nur Capybara, ohne auf Nokogiri zurückzugreifen?

+0

wie die Fehlermeldung meldet, ist dies sehr wahrscheinlich ein Fehler. Sie sollten dies den Entwicklern melden. Es gibt wirklich keinen Weg um 'text()' zu benutzen und wenn das nicht funktioniert würde ich es als einen großen Fehler betrachten. Also wartest du entweder auf den Fix oder du verwendest eine andere Lösung wie Nokogiri – dirkk

+0

Ich habe auch gesucht und es scheint, dass es zu diesem Zeitpunkt keine Möglichkeit gibt, das innere HTML zu bekommen. Ich denke, wir müssen auf ein Update warten oder eine Pull-Anfrage machen. Ich denke, mindestens ein anderer Capybara-Treiber unterstützt die innerHTML-Methode. –

Antwort

0

Sie können immer Nokogiri und Open-Uri verwenden.

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 ">]>]> 

Dann können Sie Operationen darauf ausführen, je nachdem, was Sie ergreifen möchten. Also für den Text innerhalb der Tags:

2.2.0 :072 > html.children.first 

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

2.2.0 :073 > html.children.first.text 

=> " Test " 

oder

2.2.0 :215 > html.children.first.content 

=> " Test " 

Viel Glück!

+0

Ich sollte erwähnen, der Grund, warum Sie #child on: 021 verwenden, ist, dass Sie mit einem Nokogiri :: XML :: Element arbeiten. Die Element-Klasse erbt von der Node-Klasse. –