Selenium-Webdriver / RSpe c закрытие окна после тестов - PullRequest
0 голосов
/ 24 января 2020

Запущена проблема с запущенным RSpe c и 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

Мои настоящие тесты rspe c настроены в формате:

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

Вместо. При этом все тесты выполняются успешно, но я также получаю n ошибок в конце теста (где n = количество тестов) undefined method quit 'для nil: NilClass`. Он также открывает новый экземпляр браузера для каждого теста (что я не хочу делать).

RSpe c, кажется, закрывает драйвер от того, что я могу сказать, даже без @driver.quit. Так что я действительно растерялся, что тут делать. Я не хочу, чтобы новый браузер открывал каждый экземпляр, но я хотел бы, чтобы браузер закрывался после каждого теста и открывал новый (или, может быть, это плохая идея? Я удаляю куки, поэтому, если он просто переключится на новый URL, так как я делаю visit для каждого теста будет работать?)

Какой лучший способ справиться с этим?

1 Ответ

1 голос
/ 25 января 2020

Да, это происходит при использовании драйвера chrome, в конце он автоматически закрывает браузер.

Решение состоит в том, чтобы написать следующий код для объекта драйвера

caps = Selenium::WebDriver::Remote::Capabilities.chrome("goog:chromeOptions" => {detach: true})
driver = Selenium::WebDriver.for :chrome, desired_capabilities: caps

Это остановит закрытие браузера chrome в конце.

И я предлагаю вам использовать WATIR, который является оболочкой для Ruby селенового связывания.

...