# frozen_string_literal: true require 'capybara/rspec' require 'selenium/webdriver' # Check if Capybara should be running against a remote Selenium instance def remote_selenium? (ENV['SELENIUM_FIREFOX_HOST'] || ENV['SELENIUM_CHROME_HOST']) && ENV['SELENIUM_PORT'] end if !remote_selenium? require 'webdrivers' # Only check Webdrivers updates onces per day Webdrivers.cache_time = 86_400 end Capybara.default_max_wait_time = 10 Capybara.server = :puma, {Silent: true} # Condtionally swap driver setup, defaults to `:headless_firefox` def selenium_driver return @selenium_driver if @selenium_driver selenium_driver = [] if remote_selenium? selenium_driver.push('remote') elsif ENV['CAPYBARA_GUI_DRIVER'] != 'true' selenium_driver.push('headless') end case ENV['CAPYBARA_JS_DRIVER'] when 'chrome' selenium_driver.push('chrome') when 'firefox' selenium_driver.push('firefox') else selenium_driver.push('firefox') end @selenium_driver = selenium_driver.join('_').to_sym end # Setting app_host and default_host here have no bearing on test runners. # These must be set in a `before` block for each test, i.e. in rails_helper.rb # Capybara.app_host = "http://#{ip}:#{app_host_port}" # Capybara.default_host = "http://#{ip}:#{app_host_port}" Capybara.server_port = ENV['APP_HOST_PORT'] if ENV['APP_HOST_PORT'] Capybara.server_host = '0.0.0.0' if remote_selenium? # Headless firefox and chrome configuration. Useful for CI matrices. # See https://gist.github.com/bbonamin/4b01be9ed5dd1bdaf909462ff4fdca95 Capybara.register_driver :firefox do |app| Capybara::Selenium::Driver.new(app, browser: :firefox) end Capybara.register_driver :headless_firefox do |app| options = Selenium::WebDriver::Firefox::Options.new options.headless! # added on https://github.com/SeleniumHQ/selenium/pull/4762 Capybara::Selenium::Driver.new(app, browser: :firefox, options: options) end options = Selenium::WebDriver::Chrome::Options.new options.add_preference(:download, prompt_for_download: false, default_directory: '/tmp/downloads') options.add_preference(:browser, set_download_behavior: {behavior: 'allow'}) Capybara.register_driver :chrome do |app| Capybara::Selenium::Driver.new(app, browser: :chrome, options: options) end Capybara.register_driver :headless_chrome do |app| options.add_argument('--headless') options.add_argument('--disable-gpu') options.add_argument('--window-size=1280,800') driver = Capybara::Selenium::Driver.new(app, browser: :chrome, options: options) driver end Capybara.register_driver :remote_firefox do |app| Capybara::Selenium::Driver.new( app, browser: :remote, url: "http://#{ENV['SELENIUM_FIREFOX_HOST']}:#{ENV['SELENIUM_PORT']}/wd/hub", desired_capabilities: Selenium::WebDriver::Remote::Capabilities.firefox, ) end Capybara.register_driver :remote_chrome do |app| args = ['--no-default-browser-check', '--start-maximized'] caps = Selenium::WebDriver::Remote::Capabilities.chrome('chromeOptions' => {'args' => args}) Capybara::Selenium::Driver.new( app, browser: :remote, url: "http://#{ENV['SELENIUM_CHROME_HOST']}:#{ENV['SELENIUM_PORT']}/wd/hub", desired_capabilities: caps, ) end