在Capybara中选择混合模式内容

我正在尝试使用Capybara提取混合模式内容。 我是用Nokogiri做的 ,但是想知道为什么与Capybara不可能相似。

require 'nokogiri' doc = Nokogiri::HTML("

NameA Johnson

") 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. 

如何提取此文本?

Capybara需要一个驱动程序,XPath将由驱动程序执行。 从您的错误消息中可以清楚地看到,您正在使用selenium-webdriver,它将使用浏览器的本机XPath实现。 对于IE,它使用自己的。

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

 doc = Nokogiri::HTML(page.html) puts doc.at_xpath("//h1/text()").content 

我不相信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