在Capybara中选择混合模式内容

时间:2012-09-15 13:00:26

标签: ruby-on-rails ruby xpath capybara

我正在尝试使用Capybara提取混合模式内容。我did it using 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.

如何提取此文本?

2 个答案:

答案 0 :(得分:2)

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

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

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

答案 1 :(得分: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