Ruby 的 Watir:main:Object 的未定义局部变量或方法“doc”

Watir with Ruby: undefined local variable or method `doc' for main:Object

我正在关注 this tutorial 使用 Ruby 和 Watir 进行屏幕抓取。

我尝试为 return 维基百科的文本编写一个简单的脚本:

require "selenium-webdriver"
browser = Selenium::WebDriver.for :chrome
browser.get "https://wikipedia.org"
require "nokogiri"
puts doc.xpath(".//*[@id='langsearch-input']/p").inner_text

但是当我 运行 脚本时,我在终端中收到此错误:

$ ruby app/views/layouts/scraper.rb
app/views/layouts/scraper.rb:7:in `<main>': undefined local variable or method `doc' for main:Object (NameError)

我安装了 nokogiri 1.6.7.2、watir-webdriver 0.9.1 和 watir 4.0.2。

我做错了什么?

您缺少将浏览器 HTML 转换为 Nokogiri 文档的行。换句话说,你还没有定义 doc 是什么。

require "selenium-webdriver"
browser = Selenium::WebDriver.for :chrome
browser.get "https://wikipedia.org"
require "nokogiri"
doc = Nokogiri::HTML.parse(browser.page_source)
puts doc.xpath(".//*[@id='langsearch-input']/p").inner_text
#=> ""

请注意,虽然这将解决异常,但 inner_text 将 return 为空字符串 - 即 ""。 ID 为 "langsearch-input" 的元素是一个输入字段,它没有子 p 元素或文本节点。

另请注意,您实际上根本没有使用 Watir。要使用 Watir,它看起来像:

require 'watir-webdriver'
browser = Watir::Browser.new :chrome
browser.goto "https://wikipedia.org"
require 'nokogiri'
doc = Nokogiri::HTML.parse(browser.html)
puts doc.xpath(".//*[@id='langsearch-input']/p").inner_text
#=> ""

但是,除非您对单个大 HTML 块进行大量解析,否则使用没有 Nokogiri 的 Watir 可能会更容易:

require 'watir-webdriver'
browser = Watir::Browser.new :chrome
browser.goto "https://wikipedia.org"
puts browser.text_field(id: 'langsearch-input').value