Capybara Poltergeist IOError:封闭的流

时间:2015-10-01 14:56:28

标签: ruby-on-rails capybara poltergeist

我正在使用Capybara进行网页抓取。我注意到一个问题,后来Poltergeist在记忆中吃掉了系统资源。 Poltergeist Github页面指出Capybara(https://github.com/teampoltergeist/poltergeist)存在内存泄漏问题,他们建议调用

session.driver.quit

这为我修复了内存问题,但是当我想稍后再次使用Capybara时,我会收到错误消息:

IOError: closed stream

我相信只是刷新Capybara会话就可以解决这个问题,但无法找到一个允许我重新开始全新会话的公共方法。

1)有没有一种方法可以解决我的问题?

2)重置会话是重新打开流的最佳方式吗?

2 个答案:

答案 0 :(得分:4)

最有效的解决方案是启动这样一个新的Capybara会议:

session = Capybara::Session.new(:poltergeist, Rails.application)
session.visit(...)
session.driver.quit

对于我的程序,我将它封装在WebScraper模块中,如下所示:

module WebScraper
  attr_accessor :session

  delegate :visit, :save_screenshot, to: :session

  def start_session
    @session ||= Capybara::Session.new(:poltergeist, Rails.application)
  end

  def end_session
    @session.driver.quit
    @session = nil
  end
end

答案 1 :(得分:1)

我认为您的客户端内存因内存泄漏而过载,因此重新启动浏览器可以解决问题。您可以按session.driver.browser.client查看客户信息。您可以通过session.driver.browser.restart重新启动浏览器,然后打开一个没有网址的浏览器。如果您检查session.driver.browser.client,则可以看到客户端信息已重置。