1

我正在尝试使用 Capybara 提取混合模式内容。我是用 Nokogiri 做的,但想知道为什么 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 将由驱动程序执行。从您的错误消息中,很明显您正在使用 selenium-webdriver,它将在可用的情况下使用浏览器的本机 XPath 实现。对于 IE,它使用自己的。

您似乎正在使用 XPath 实现不完全兼容的组合。您可以尝试更换驱动程序或浏览器,但如果您真的想使用 Nokogiri 提取内容,您应该可以执行以下操作:

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

我不相信 Capybara 或 Selenium-Webdriver 支持直接访问文本节点。但是,如果你不想使用 nokogiri,你可以使用 selenium-webdriver 来执行 javascript。

您可以这样做(在 Capybara 中使用 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 回答