From a96c367179f5f49929aceb96b5945b4feb4906e5 Mon Sep 17 00:00:00 2001 From: Thomas von Deyen Date: Fri, 11 Apr 2025 11:55:23 +0200 Subject: [PATCH 1/3] Pin headless chrome to 133 Unless the capybara team figured out how to solve this bug: https://github.com/teamcapybara/capybara/issues/2800 Also setting some flags we need for Chrome 133 support. And completely register a new driver. Do not try to inherit from the selenium web driver. It does not contain all the args we need. --- lib/solidus_dev_support/rspec/capybara.rb | 26 ++++++++++++++--------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/lib/solidus_dev_support/rspec/capybara.rb b/lib/solidus_dev_support/rspec/capybara.rb index 2fea86e..aed6d87 100644 --- a/lib/solidus_dev_support/rspec/capybara.rb +++ b/lib/solidus_dev_support/rspec/capybara.rb @@ -1,22 +1,28 @@ # frozen_string_literal: true +require "selenium-webdriver" + # Allow to override the initial windows size -CAPYBARA_WINDOW_SIZE = ENV.fetch("CAPYBARA_WINDOW_SIZE", "1920x1080").split("x", 2).map(&:to_i) -CAPYBARA_WINDOW_WIDTH = CAPYBARA_WINDOW_SIZE[0] -CAPYBARA_WINDOW_HEIGHT = CAPYBARA_WINDOW_SIZE[1] +CAPYBARA_WINDOW_SIZE = ENV.fetch("CAPYBARA_WINDOW_SIZE", "1920x1080") + +# Set Chrome version you want to use +CAPYBARA_JAVASCRIPT_DRIVER_VERSION = ENV.fetch("CAPYBARA_JAVASCRIPT_DRIVER_VERSION", "133") Capybara.javascript_driver = ENV.fetch("CAPYBARA_JAVASCRIPT_DRIVER", "solidus_chrome_headless").to_sym Capybara.default_max_wait_time = 10 Capybara.server = :puma, {Silent: true} # A fix for rspec/rspec-rails#1897 -Capybara.drivers[:selenium_chrome_headless].tap do |original_driver| - Capybara.register_driver :solidus_chrome_headless do |app| - original_driver.call(app).tap do |driver| - driver.resize_window_to( - driver.current_window_handle, CAPYBARA_WINDOW_WIDTH, CAPYBARA_WINDOW_HEIGHT - ) - end +Capybara.register_driver :solidus_chrome_headless do |app| + browser_options = Selenium::WebDriver::Chrome::Options.new.tap do |opts| + opts.add_argument("--headless=new") + opts.add_argument("--disable-gpu") + opts.add_argument("--no-sandbox") + opts.add_argument("--window-size=#{CAPYBARA_WINDOW_SIZE}") + opts.add_argument("--disable-search-engine-choice-screen") + opts.add_argument("--disable-backgrounding-occluded-windows") + opts.browser_version = CAPYBARA_JAVASCRIPT_DRIVER_VERSION end + Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options) end require "capybara-screenshot/rspec" From 204c40b81e168e8e0727215f03f046f3ea5581bc Mon Sep 17 00:00:00 2001 From: Thomas von Deyen Date: Fri, 11 Apr 2025 12:32:54 +0200 Subject: [PATCH 2/3] Set SE_BROWSER_VERSION We need to tell the Selenium Browser Manager to download that version --- lib/solidus_dev_support/rspec/capybara.rb | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/solidus_dev_support/rspec/capybara.rb b/lib/solidus_dev_support/rspec/capybara.rb index aed6d87..b3ce3d7 100644 --- a/lib/solidus_dev_support/rspec/capybara.rb +++ b/lib/solidus_dev_support/rspec/capybara.rb @@ -7,6 +7,8 @@ # Set Chrome version you want to use CAPYBARA_JAVASCRIPT_DRIVER_VERSION = ENV.fetch("CAPYBARA_JAVASCRIPT_DRIVER_VERSION", "133") +# Make sure Selenium downloads this version of Chrome +ENV["SE_BROWSER_VERSION"] = CAPYBARA_JAVASCRIPT_DRIVER_VERSION Capybara.javascript_driver = ENV.fetch("CAPYBARA_JAVASCRIPT_DRIVER", "solidus_chrome_headless").to_sym Capybara.default_max_wait_time = 10 From 6111bf4b60a528c220b9e17a584c9ef7bade46b9 Mon Sep 17 00:00:00 2001 From: Thomas von Deyen Date: Fri, 11 Apr 2025 18:12:04 +0200 Subject: [PATCH 3/3] Add more chrome flags Found in ref: https://github.com/teamcapybara/capybara/issues/2796 --- lib/solidus_dev_support/rspec/capybara.rb | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/lib/solidus_dev_support/rspec/capybara.rb b/lib/solidus_dev_support/rspec/capybara.rb index b3ce3d7..5d2737e 100644 --- a/lib/solidus_dev_support/rspec/capybara.rb +++ b/lib/solidus_dev_support/rspec/capybara.rb @@ -21,7 +21,20 @@ opts.add_argument("--no-sandbox") opts.add_argument("--window-size=#{CAPYBARA_WINDOW_SIZE}") opts.add_argument("--disable-search-engine-choice-screen") - opts.add_argument("--disable-backgrounding-occluded-windows") + + # From https://github.com/teamcapybara/capybara/issues/2796 + # Chrome flags found from: + # - https://peter.sh/experiments/chromium-command-line-switches/ + # - https://github.com/GoogleChrome/chrome-launcher/blob/main/docs/chrome-flags-for-tools.md + # + # Disable timers being throttled in background pages/tabs. Useful for parallel test runs. + opts.add_argument("disable-background-timer-throttling") + # Normally, Chrome will treat a "foreground" tab instead as backgrounded if the surrounding window is occluded (aka + # visually covered) by another window. This flag disables that. Useful for parallel test runs. + opts.add_argument("disable-backgrounding-occluded-windows") + # This disables non-foreground tabs from getting a lower process priority. Useful for parallel test runs. + opts.add_argument("disable-renderer-backgrounding") + opts.browser_version = CAPYBARA_JAVASCRIPT_DRIVER_VERSION end Capybara::Selenium::Driver.new(app, browser: :chrome, options: browser_options)