Ruby on rails 选择水豚中的混合模式内容

Ruby on rails 选择水豚中的混合模式内容,ruby-on-rails,ruby,xpath,capybara,Ruby On Rails,Ruby,Xpath,Capybara,我试图提取混合模式的内容使用水豚。我想知道,为什么水豚不可能有类似的效果 require 'nokogiri' doc = Nokogiri::HTML("<h1><em>Name</em>A Johnson </h1>") puts doc.at_xpath("//h1/text()").content 这会引起错误: [remote server] file:///tmp/webdriver-profile20120915-8089-kxr

我试图提取混合模式的内容使用水豚。我想知道,为什么水豚不可能有类似的效果

require 'nokogiri'

doc = Nokogiri::HTML("<h1><em>Name</em>A Johnson </h1>")
puts doc.at_xpath("//h1/text()").content
这会引起错误:

[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.

如何提取此文本?

水豚需要一个驱动程序,XPath将由驱动程序执行。从错误消息中可以看出,您使用的是SeleniumWebDriver,它将在可用的情况下使用浏览器的原生XPath实现。对于IE,它使用自己的

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

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

我认为Capybara或Selenium Webdriver不支持直接访问文本节点。但是,如果您不想使用nokogiri,可以使用SeleniumWebDriver来执行javascript

您可以使用Selenium Webdriver在Capybara中执行此操作:

element = page.find('h1').native
puts page.driver.browser.execute_script("return arguments[0].childNodes[1].textContent", element)
#=> A Johnson 

错误消息说的是.text属性仅为元素对象定义,而不是为文本对象定义。我会尝试这样的方法:find:xpath,//h1.text我知道它不会返回元素。但是您的解决方案发现:xpath,//h1.text对NameA Johnson不起作用,它将提取NameA Jonson,但我只需要一个Jonson。在上面的例子中使用nokogiri,doc.at_xpath//h1/text.content`works。也许我应该首先用水豚的发现来提取元素,然后把它传递给nokogiri元素,这样我就可以写这样的东西:hr=find/hr;nokogiri::Elementhr.at_xpath./text.content,但我不确定如何实现。如果您有正确的xpath实现,您需要的是://h1/text。所以,尝试使用兼容的实现Nokogiri来计算这个XPath表达式是合乎逻辑的。我不知道如何做到这一点。你能告诉我怎么做吗?不,我对Ruby和这些工具一无所知。
element = page.find('h1').native
puts page.driver.browser.execute_script("return arguments[0].childNodes[1].textContent", element)
#=> A Johnson