1

Capybara を使用して混合モードのコンテンツを抽出しようとしています。私はノコギリでやったのですが、なぜカピバラで同じようなことができないのか不思議です。

require 'nokogiri'

doc = Nokogiri::HTML("<h1><em>Name</em>A Johnson </h1>")
puts doc.at_xpath("//h1/text()").content

動作しますが、Capybara で同じ XPath セレクターを試しても動作しません。

visit('http://stackoverflow.com')
puts find(:xpath, "//h1/text()").text

エラーが発生します:

[remote server] file:///tmp/webdriver-profile20120915-8089-kxrvho/extensions/fxdriver@googlecode.com/components/driver_component.js:6582:in `unknown': The given selector //h1/text() is either invalid or does not result in a WebElement. The following error occurred: (Selenium::WebDriver::Error::InvalidSelectorError)
[InvalidSelectorError] The result of the xpath expression "//h1/text()" is: [object Text]. It should be an element.

このテキストを抽出するには?

4

2 に答える 2

2

Capybara にはドライバーが必要で、XPath はドライバーによって実行されます。エラー メッセージから、使用可能な場合はブラウザーのネイティブ XPath 実装を使用する selenium-webdriver を使用していることは明らかです。IE の場合は、独自のものを使用します。

XPath 実装が完全に準拠していない組み合わせを使用しているようです。ドライバーまたはブラウザーを変更してみることができますが、本当に Nokogiri を使用してコンテンツを抽出したい場合は、次のことができるはずです。

doc = Nokogiri::HTML(page.html)
puts doc.at_xpath("//h1/text()").content
于 2012-09-15T18:45:50.973 に答える
1

Capybar や Selenium-Webdriver がテキスト ノードへの直接アクセスをサポートしているとは思えません。ただし、nokogiri を使用したくない場合は、selenium-webdriver を使用して javascript を実行できます。

これを行うことができます(Selenium-Webdriverを使用してカピバラで):

element = page.find('h1').native
puts page.driver.browser.execute_script("return arguments[0].childNodes[1].textContent", element)
#=> A Johnson 
于 2012-09-15T19:13:37.200 に答える