防止 phantomjs 在请求永无止境的资产时引发 Capybara::Poltergeist::StatusFailError

Prevent phantomjs from raising Capybara::Poltergeist::StatusFailError when requesting never ending assets

我在使用 Capybara::Poltergeist::Driver

时遇到一些问题

当我使用 poltergeist 访问以下 url 时,我遇到了一个问题,即看似不存在的资产需要永远加载并最终引发错误:https://www.feinstein.senate.gov/public/index.cfm/e-mail-me

$ brew install phantomjs
$ gem install capybara -v 2.17.0
$ gem install poltergeist -v 1.7.0
$ gem install selenium-webdriver -v 2.53.4

然后在 irb:

require 'capybara/poltergeist'

module Drivers
  class Poltergeist < Capybara::Poltergeist::Driver
    def needs_server?
      false
    end
  end
end

Capybara.register_driver :poltergeist_errorless do |app|
  options = ['--load-images=no', '--ignore-ssl-errors=yes', '--ssl-protocol=any', '--disk-cache=true', '--max-disk-cache-size=500000']
  Drivers::Poltergeist.new(app, js_errors: false, phantomjs_options: options)
end

session = Capybara::Session.new(:poltergeist_errorless)
session.visit('https://www.feinstein.senate.gov/public/index.cfm/e-mail-me')

10-20 秒后,请求失败,我收到一条 Capybara::Poltergeist::StatusFailError 异常消息:

Request to 'https://www.feinstein.senate.gov/public/index.cfm/e-mail-me' failed to reach server, check DNS and/or server status - Timed out with the following resources still waiting https://sdc1.senate.gov/NEED_VALUE/wtid.js

但是如果我再调用:

session.save_screenshot('/tmp/sc.png', full: true)

输出的屏幕截图显示页面的其余部分加载正常。如果这是任何其他浏览器,它会继续愉快地运行,而不必担心永远加载的资产。

有没有办法配置 phantomjs 不等待这个资产并且不引发这个异常?

我将尝试使用会话超时参数:

session = Capybara::Session.new(:poltergeist_errorless, :timeout=>ASSET_LOAD_TIME)

最简单的处理方法是使用 Poltergeists 黑名单来阻止 url - https://github.com/teampoltergeist/poltergeist#customization - and/or - https://github.com/teampoltergeist/poltergeist#url-blacklisting--whitelisting

如果您的情况更加动态,您可以挽救异常,解析出 URL,将其添加到黑名单,然后重试访问。

此外,无需覆盖 needs_server?。如果您不将第二个参数(运行 的应用程序)传递给 Session#new(您没有这样做),那么 needs_server? 是无关紧要的。