防止 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?
是无关紧要的。
我在使用 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?
是无关紧要的。