capybara_helper.rb 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. # frozen_string_literal: true
  2. require 'capybara/rspec'
  3. require 'selenium/webdriver'
  4. # Check if Capybara should be running against a remote Selenium instance
  5. def remote_selenium?
  6. (ENV['SELENIUM_FIREFOX_HOST'] || ENV['SELENIUM_CHROME_HOST']) \
  7. && ENV['SELENIUM_PORT']
  8. end
  9. unless remote_selenium?
  10. require 'webdrivers'
  11. # Only check Webdrivers updates onces per day
  12. Webdrivers.cache_time = 86_400
  13. end
  14. Capybara.default_max_wait_time = 10
  15. Capybara.server = :puma, {Silent: true}
  16. # Condtionally swap driver setup, defaults to `:headless_firefox`
  17. def selenium_driver
  18. return @selenium_driver if @selenium_driver
  19. selenium_driver = []
  20. if remote_selenium?
  21. selenium_driver.push('remote')
  22. elsif ENV['CAPYBARA_GUI_DRIVER'] != 'true'
  23. selenium_driver.push('headless')
  24. end
  25. case ENV['CAPYBARA_JS_DRIVER']
  26. when 'chrome'
  27. selenium_driver.push('chrome')
  28. when 'firefox'
  29. selenium_driver.push('firefox')
  30. else
  31. selenium_driver.push('firefox')
  32. end
  33. @selenium_driver = selenium_driver.join('_').to_sym
  34. end
  35. # Setting app_host and default_host here have no bearing on test runners.
  36. # These must be set in a `before` block for each test, i.e. in rails_helper.rb
  37. # Capybara.app_host = "http://#{ip}:#{app_host_port}"
  38. # Capybara.default_host = "http://#{ip}:#{app_host_port}"
  39. Capybara.server_port = ENV['APP_HOST_PORT'] if ENV['APP_HOST_PORT']
  40. Capybara.server_host = '0.0.0.0' if remote_selenium?
  41. # Headless firefox and chrome configuration. Useful for CI matrices.
  42. # See https://gist.github.com/bbonamin/4b01be9ed5dd1bdaf909462ff4fdca95
  43. Capybara.register_driver :firefox do |app|
  44. Capybara::Selenium::Driver.new(app, browser: :firefox)
  45. end
  46. Capybara.register_driver :headless_firefox do |app|
  47. options = Selenium::WebDriver::Firefox::Options.new
  48. options.headless! # added on https://github.com/SeleniumHQ/selenium/pull/4762
  49. Capybara::Selenium::Driver.new(app, browser: :firefox, options: options)
  50. end
  51. options = Selenium::WebDriver::Chrome::Options.new
  52. options.add_preference(:download, prompt_for_download: false,
  53. default_directory: '/tmp/downloads')
  54. options.add_preference(:browser, set_download_behavior: {behavior: 'allow'})
  55. Capybara.register_driver :chrome do |app|
  56. Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
  57. end
  58. Capybara.register_driver :headless_chrome do |app|
  59. options.add_argument('--headless')
  60. options.add_argument('--disable-gpu')
  61. options.add_argument('--window-size=1280,800')
  62. Capybara::Selenium::Driver.new(app, browser: :chrome, options: options)
  63. end
  64. Capybara.register_driver :remote_firefox do |app|
  65. url = "http://#{ENV['SELENIUM_FIREFOX_HOST']}:#{ENV['SELENIUM_PORT']}/wd/hub"
  66. Capybara::Selenium::Driver.new(
  67. app,
  68. browser: :remote,
  69. url: url,
  70. desired_capabilities: Selenium::WebDriver::Remote::Capabilities.firefox,
  71. )
  72. end
  73. Capybara.register_driver :remote_chrome do |app|
  74. args = ['--no-default-browser-check', '--start-maximized']
  75. caps = Selenium::WebDriver::Remote::Capabilities
  76. .chrome('chromeOptions' => {'args' => args})
  77. Capybara::Selenium::Driver.new(
  78. app,
  79. browser: :remote,
  80. url: "http://#{ENV['SELENIUM_CHROME_HOST']}:#{ENV['SELENIUM_PORT']}/wd/hub",
  81. desired_capabilities: caps,
  82. )
  83. end