我正在尝试使用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.
如何提取此文本?
答案 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