Capybara / Selenium - 强制在每次通话时重新加载Selenium Driver

时间:2017-01-10 15:28:27

标签: ruby selenium webdriver capybara

我有一个解决方案,使用Firefox(46)+ Capybara + Selenium从远程网站解析一些数据。我在初始化时传递path_to_firefox_profile参数,这是一些真正的Firefox配置文件夹。

问题在于,如果我执行此代码:

a = MyParser.new(profile_a)
a.parse_something
b = MyParser.new(profile_b)
b.parse_something

...虽然我指定了另一个配置文件,但实例b将加载配置文件A.

但是,如果我在一个单独的过程中运行这两行,我会得到我想要的。因此,我假设其中一个 - Capybara或Selenium - 按照ruby流程存储配置文件设置一次,并且不会按需更改它。

是否有想法如何在同一过程中更改个人资料?

我尝试.quit Firefox,但在访问新网址时没有帮助.Selenium打开另一个Firefox窗口,其中包含完全相同的配置文件而非新版本。

class MyParser
  def initialize(path_to_firefox_profile)
    Capybara.register_driver(:selenium) do |app|
      client = Selenium::WebDriver::Remote::Http::Default.new
      client.timeout = 150
      Capybara::Selenium::Driver.new(app,
        profile: path_to_firefox_profile,
        http_client: client)
    end
  end

  def parse_something
    # perform some parsings & return result
  end
end

1 个答案:

答案 0 :(得分:0)

Capybara的register_driver按照您全局指定的名称注册驱动程序,并在其会话中使用这些驱动程序(按名称)。它还将以便于测试Web应用程序的人员使用的方式自动管理会话。这里的问题是没有创建与新注册的驱动程序的新会话。这是因为你并没有真正将Capybara用于它的设计,因此需要更多地考虑会话管理的重量。如果你有超过2个MyParser对象,你可能应该为你创建的每个MyParser实例创建一个新会话,然后在所有MyParser方法中使用该会话。由于您每个MyParser实例使用不同的驱动程序设置,因此您可能也应该命名每个注册的驱动程序不同。

class MyParser
  def initialize(path_to_firefox_profile)
    Capybara.register_driver(self.object_id.to_s) do |app|
      client = Selenium::WebDriver::Remote::Http::Default.new
      client.timeout = 150
      Capybara::Selenium::Driver.new(app,
        profile: path_to_firefox_profile,
        http_client: client)
    end
    @session = Capybara::Session.new(self.object_id.to_s)
  end

  def parse_something
    @session.visit("some url")
    @session.find(...)  # perform some parsings & return result
  end
end

当您完成每个MyParser实例时,您还需要处理清理会话。