selenium_driver.rb 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. # Copyright (C) 2012-2025 Zammad Foundation, https://zammad-foundation.org/
  2. # This file registers the custom Zammad chrome and firefox drivers.
  3. # The options check if a REMOTE_URL ENV is given and change the
  4. # configurations accordingly.
  5. Capybara.register_driver(:zammad_chrome) do |app|
  6. build_chrome_driver(app)
  7. end
  8. Capybara.register_driver(:zammad_chrome_mobile) do |app|
  9. # User agent for Chrome Beta on Pixel 7 (Android 13).
  10. build_chrome_driver(app, user_agent: 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36')
  11. end
  12. Capybara.register_driver(:zammad_firefox) do |app|
  13. build_firefox_driver(app)
  14. end
  15. Capybara.register_driver(:zammad_firefox_mobile) do |app|
  16. # User agent for Firefox on Pixel 7 (Android 13).
  17. build_firefox_driver(app, user_agent: 'Mozilla/5.0 (Android 13; Mobile; rv:109.0) Gecko/112.0 Firefox/112.0')
  18. end
  19. # `clear_local_storage` and `clear_session_storage` are deprecated in Selenium, but Capybara still uses them.
  20. # For now, we can ignore these warnings.
  21. # https://github.com/teamcapybara/capybara/issues/2779
  22. Selenium::WebDriver.logger.ignore(:clear_local_storage, :clear_session_storage)
  23. private
  24. def build_chrome_driver(app, user_agent: nil)
  25. # Turn on browser logs
  26. chrome_options = Selenium::WebDriver::Chrome::Options.new(
  27. logging_prefs: {
  28. browser: 'ALL'
  29. },
  30. prefs: {
  31. 'intl.accept_languages' => 'en-US',
  32. 'profile.default_content_setting_values.notifications' => 1, # ALLOW notifications
  33. },
  34. # Disable shared memory usage as it does not really provide a performance gain but cause resource limit issues in CI.
  35. # https://peter.sh/experiments/chromium-command-line-switches/
  36. args: %w[
  37. --enable-logging
  38. --v=1
  39. --disable-component-update
  40. --disable-dev-shm-usage
  41. --disable-features=OptimizationGuideModelDownloading,OptimizationHintsFetching,OptimizationTargetPrediction,OptimizationHints
  42. --disable-search-engine-choice-screen
  43. --no-first-run
  44. ],
  45. # Disable the "Chrome is being controlled by automated test software." info bar.
  46. exclude_switches: ['enable-automation'],
  47. )
  48. driver_args = {
  49. browser: :chrome,
  50. options: chrome_options
  51. }
  52. if ENV['REMOTE_URL'].present?
  53. driver_args[:browser] = :remote
  54. driver_args[:url] = ENV['REMOTE_URL']
  55. driver_args[:http_client] = Selenium::WebDriver::Remote::Http::Default.new(
  56. open_timeout: 120,
  57. read_timeout: 120
  58. )
  59. end
  60. if ENV['BROWSER_HEADLESS'].present?
  61. driver_args[:options].add_argument '--headless=new' # native headless for v109+
  62. end
  63. if user_agent.present?
  64. driver_args[:options].add_argument "--user-agent=\"#{user_agent}\""
  65. end
  66. driver_args[:options].add_argument '--allow-insecure-localhost'
  67. driver_args[:options].add_argument '--ignore-certificate-errors'
  68. ENV['FAKE_SELENIUM_LOGIN_USER_ID'] = nil
  69. ENV['FAKE_SELENIUM_LOGIN_PENDING'] = nil
  70. Capybara::Selenium::Driver.new(app, **driver_args).tap do |driver|
  71. # Selenium 4 installs a default file_detector which finds wrong files/directories such as zammad/test.
  72. driver.browser.file_detector = nil if ENV['REMOTE_URL'].present?
  73. end
  74. end
  75. def build_firefox_driver(app, user_agent: nil)
  76. profile = Selenium::WebDriver::Firefox::Profile.new
  77. profile['intl.locale.matchOS'] = false
  78. profile['intl.accept_languages'] = 'en-US'
  79. profile['general.useragent.locale'] = 'en-US'
  80. profile['permissions.default.desktop-notification'] = 1 # ALLOW notifications
  81. driver_args = {
  82. browser: :firefox,
  83. options: Selenium::WebDriver::Firefox::Options.new(profile: profile),
  84. }
  85. if ENV['REMOTE_URL'].present?
  86. driver_args[:browser] = :remote
  87. driver_args[:url] = ENV['REMOTE_URL']
  88. driver_args[:http_client] = Selenium::WebDriver::Remote::Http::Default.new(
  89. open_timeout: 120,
  90. read_timeout: 120
  91. )
  92. end
  93. if ENV['BROWSER_HEADLESS'].present?
  94. driver_args[:options].add_argument '-headless'
  95. end
  96. if user_agent.present?
  97. driver_args[:options].add_preference 'general.useragent.override', user_agent
  98. end
  99. ENV['FAKE_SELENIUM_LOGIN_USER_ID'] = nil
  100. ENV['FAKE_SELENIUM_LOGIN_PENDING'] = nil
  101. Capybara::Selenium::Driver.new(app, **driver_args).tap do |driver|
  102. # Selenium 4 installs a default file_detector which finds wrong files/directories such as zammad/test.
  103. driver.browser.file_detector = nil if ENV['REMOTE_URL'].present?
  104. end
  105. end