capybara_helper.rb 3.6 KB

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