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 绑定的包装器。