Capybara/Selenium - 强制在每次调用时重新加载 Selenium 驱动程序

Capybara/Selenium - force to reload Selenium Driver on each call

我有一个使用 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,但它没有帮助,在访问新 URL Selenium 打开另一个 Firefox window 使用完全相同的配置文件而不是新的。

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

Capybara 的 register_driver 通过您在全局分配的名称注册驱动程序,并将在其会话中使用这些驱动程序(通过名称)。它还将以一种易于测试网络应用程序的人使用的方式自动管理会话。这里的问题是没有创建与新注册的驱动程序的新会话。这是因为您并没有真正按照 Capybara 的设计目的使用 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 实例后清理会话。