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 实例后清理会话。
我有一个使用 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 实例后清理会话。