Selenium-Webdriver/RSpec 测试后关闭 window
Selenium-Webdriver/RSpec closing window after tests
运行 问题 运行ning RSpec 和 Selenium-Webdriver。我正在构建自己的框架,并且在每次测试获得 运行 后 运行 陷入了一个问题。我的 spec_helper.rb
设置如下所示:
require 'selenium-webdriver'
Dir['./spec/support/**/*.rb'].each { |file| require file }
RSpec.configure do |config|
config.before(:each) do
# Default browser is chrome, otherwise look for ENV variables
case ENV['browser'] ||= 'chrome'
when 'chrome'
@driver = Selenium::WebDriver.for :chrome
when 'firefox'
@driver = Selenium::WebDriver.for :firefox
end
# Clear cookies between each example
@driver.manage.delete_all_cookies
# Set up implicit waits
@driver.manage.timeouts.implicit_wait = 5
# Default base_url is set to website, otherwise look for ENV variables
case ENV['base_url'] ||= 'https:www.website.com' #redacted real website
when 'local'
ENV['base_url'] = 'local_url_here'
when 'development'
ENV['base_url'] = 'https:www.website.com' #redacted real website
when 'production'
ENV['base_url'] = 'prod_url_here'
end
# Close browser window after each test
config.after(:each) do
@driver.close
end
end
end
我的实际 rspec 测试设置格式为:
Rspec.describe 'something' do
context 'some context' do
#multiple it 'stuff' do's
end
end
end
这很典型。然而,第一个测试将 运行 正常,在第一次测试后每个测试 运行 都很好但是浏览器(在这种情况下为 Chromedriver)在每次测试后关闭并给出错误:Selenium::WebDriver::Error::WebDriverError: no such session
.
所以我尝试了:
config.after(:all) do
@driver.quit
end
相反。这 运行s 测试全部成功,但我在测试结束时也遇到了 n 个错误(其中 n = 总测试数)undefined method
退出' for nil:NilClass`。它还为每个测试打开一个新的浏览器实例(我不想这样做)。
RSpec 似乎关闭了驱动程序,即使没有 @driver.quit
我也能知道。所以我真的很困惑在这里做什么。我不希望新浏览器打开每个实例,但我希望浏览器在每次测试后关闭并打开一个新浏览器(或者这可能是个坏主意?,我正在删除 cookie,所以如果它只是切换到一个新的 URL 因为我正在为每个测试做一个 visit
可以吗?)
处理此问题的最佳方法是什么?
是的,当您使用 chrome 驱动程序时,它会在结束时自动关闭浏览器。
解决方法是,为驱动对象写如下代码
caps = Selenium::WebDriver::Remote::Capabilities.chrome("goog:chromeOptions" => {detach: true})
driver = Selenium::WebDriver.for :chrome, desired_capabilities: caps
这将阻止 chrome 浏览器在最后关闭。
我建议您使用 WATIR,它是 Ruby selenium 绑定的包装器。
运行 问题 运行ning RSpec 和 Selenium-Webdriver。我正在构建自己的框架,并且在每次测试获得 运行 后 运行 陷入了一个问题。我的 spec_helper.rb
设置如下所示:
require 'selenium-webdriver'
Dir['./spec/support/**/*.rb'].each { |file| require file }
RSpec.configure do |config|
config.before(:each) do
# Default browser is chrome, otherwise look for ENV variables
case ENV['browser'] ||= 'chrome'
when 'chrome'
@driver = Selenium::WebDriver.for :chrome
when 'firefox'
@driver = Selenium::WebDriver.for :firefox
end
# Clear cookies between each example
@driver.manage.delete_all_cookies
# Set up implicit waits
@driver.manage.timeouts.implicit_wait = 5
# Default base_url is set to website, otherwise look for ENV variables
case ENV['base_url'] ||= 'https:www.website.com' #redacted real website
when 'local'
ENV['base_url'] = 'local_url_here'
when 'development'
ENV['base_url'] = 'https:www.website.com' #redacted real website
when 'production'
ENV['base_url'] = 'prod_url_here'
end
# Close browser window after each test
config.after(:each) do
@driver.close
end
end
end
我的实际 rspec 测试设置格式为:
Rspec.describe 'something' do
context 'some context' do
#multiple it 'stuff' do's
end
end
end
这很典型。然而,第一个测试将 运行 正常,在第一次测试后每个测试 运行 都很好但是浏览器(在这种情况下为 Chromedriver)在每次测试后关闭并给出错误:Selenium::WebDriver::Error::WebDriverError: no such session
.
所以我尝试了:
config.after(:all) do
@driver.quit
end
相反。这 运行s 测试全部成功,但我在测试结束时也遇到了 n 个错误(其中 n = 总测试数)undefined method
退出' for nil:NilClass`。它还为每个测试打开一个新的浏览器实例(我不想这样做)。
RSpec 似乎关闭了驱动程序,即使没有 @driver.quit
我也能知道。所以我真的很困惑在这里做什么。我不希望新浏览器打开每个实例,但我希望浏览器在每次测试后关闭并打开一个新浏览器(或者这可能是个坏主意?,我正在删除 cookie,所以如果它只是切换到一个新的 URL 因为我正在为每个测试做一个 visit
可以吗?)
处理此问题的最佳方法是什么?
是的,当您使用 chrome 驱动程序时,它会在结束时自动关闭浏览器。
解决方法是,为驱动对象写如下代码
caps = Selenium::WebDriver::Remote::Capabilities.chrome("goog:chromeOptions" => {detach: true})
driver = Selenium::WebDriver.for :chrome, desired_capabilities: caps
这将阻止 chrome 浏览器在最后关闭。
我建议您使用 WATIR,它是 Ruby selenium 绑定的包装器。