如何使用 Capybara/Poltergeist 正确调试?

How to properly debug with Capybara/Poltergeist?

我正在玩 capybara/poltergeist 完美二重奏,但我无法正确调试。 我正在测试一个简单的脚本:

logger = Logger.new "./log/who-scored-com.log"
Capybara.register_driver :poltergeist do |app|
  Capybara::Poltergeist::Driver.new(app, js_errors: false,
                                         debug: true,
                                         logger: logger)
end
browser = Capybara.current_session
browser.visit 'https://www.whoscored.com/LiveScores'
browser.save_page 'page.html'

我希望脚本能正常抓取页面并保存,但页面是空的,返回的是:

`Capybara::Poltergeist::StatusFailError: Capybara::Poltergeist::StatusFailError
    from /home/vagrant/local/ruby-2.3.0/lib/ruby/gems/2.3.0/gems/poltergeist-1.9.0/lib/capybara/poltergeist/browser.rb:351:in `command'
    from /home/vagrant/local/ruby-2.3.0/lib/ruby/gems/2.3.0/gems/poltergeist-1.9.0/lib/capybara/poltergeist/browser.rb:34:in `visit'`

现在,这并没有告诉我关于这个错误的任何信息。我捕获异常并打印它,它给了我:

"Request to 'https://www.whoscored.com/LiveScores' failed to reach server, check DNS and/or server status"

即使我不知道为什么地址不响应水豚(任何提示将不胜感激:))我不明白为什么配置中使用的 :debug 选项似乎没有不给我任何信息

你试过了吗

Capybara.register_driver :poltergeist_debug do |app|
 Capybara::Poltergeist::Driver.new(app, :inspector => true)
end

Capybara.javascript_driver = :poltergeist_debug

如图here?

您有几个问题

  1. poltergeist logger 选项定义为'(对象响应 puts)- ruby 2.3.0 标准库 Logger 对象不响应 puts 所以它无效。

  2. 你的例子没有 Capybara.current_driver = :poltergeist 所以我不确定它是否真的使用你在那里配置的驱动程序或以前定义的驱动程序(我会如果是,预计 Logger 对象会出现错误)

  3. debug: true 会将 poltergeist 的调试添加到日志中,但也有来自 phantomjs 的调试信息。这是通过将 phantomjs_options: ['--debug=true'], phantomjs_logger: <an IO object - again not a Logger object> 传递给驱动程序

  4. 生成的
  5. 您实际遇到的错误是由于无法协商 ssl 协议而导致连接被拒绝 - 要修复它,请添加所需的 ssl 协议作为 phantomjs 选项 - `phantomjs_options: ['--ssl-protocol=TLSv1.2']

我会在独立 ruby 脚本中使用类似以下内容,调整 driver_options 以适合您的口味。

require 'capybara'
require 'capybara/poltergeist'

class NilLogger
  def puts * ; end
end

def setup_session
  driver_options = { js_errors: false,
                     logger: NilLogger.new,
                     phantomjs_logger: STDOUT,
                     phantomjs_options: ['--debug=true'],
                     debug: false  }
  Capybara.configure do |conf|
    conf.run_server = false
    conf.register_driver :poltergeist do |app|
      Capybara::Poltergeist::Driver.new app, driver_options
    end
    conf.current_driver = :poltergeist
  end
  Capybara.current_session
end

browser = setup_session()
browser.visit 'https://www.whoscored.com/LiveScores'
browser.save_page 'page.html'