From c8745d3e72094a79a6c70e740420e43a11624de8 Mon Sep 17 00:00:00 2001 From: Thomas von Deyen Date: Fri, 11 Apr 2025 11:55:23 +0200 Subject: [PATCH 1/5] 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 3f548655..1641c47c 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 7e2b7fdb0b8a419bcea249983f6dae19e04458a9 Mon Sep 17 00:00:00 2001 From: Thomas von Deyen Date: Fri, 11 Apr 2025 12:32:54 +0200 Subject: [PATCH 2/5] 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 1641c47c..ab024574 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 5884cdec73d32a969c31ae7f414442df8ac927f8 Mon Sep 17 00:00:00 2001 From: Thomas von Deyen Date: Fri, 11 Apr 2025 18:12:04 +0200 Subject: [PATCH 3/5] 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 ab024574..2748edf7 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) From f36140552afdf843c2e5c1e50cdeaeea72e761d4 Mon Sep 17 00:00:00 2001 From: Thomas von Deyen Date: Fri, 11 Apr 2025 18:44:05 +0200 Subject: [PATCH 4/5] Use Chrome 135 Hopefully it will be less flaky --- lib/solidus_dev_support/rspec/capybara.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/solidus_dev_support/rspec/capybara.rb b/lib/solidus_dev_support/rspec/capybara.rb index 2748edf7..dea11bcf 100644 --- a/lib/solidus_dev_support/rspec/capybara.rb +++ b/lib/solidus_dev_support/rspec/capybara.rb @@ -6,7 +6,7 @@ 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_VERSION = ENV.fetch('CAPYBARA_JAVASCRIPT_DRIVER_VERSION', "135") # Make sure Selenium downloads this version of Chrome ENV['SE_BROWSER_VERSION'] = CAPYBARA_JAVASCRIPT_DRIVER_VERSION From 4739a70940097fff3c5c56e659bbdb0514eacc12 Mon Sep 17 00:00:00 2001 From: Thomas von Deyen Date: Fri, 11 Apr 2025 19:02:05 +0200 Subject: [PATCH 5/5] Use Chrome 132 --- lib/solidus_dev_support/rspec/capybara.rb | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/solidus_dev_support/rspec/capybara.rb b/lib/solidus_dev_support/rspec/capybara.rb index dea11bcf..eb81e840 100644 --- a/lib/solidus_dev_support/rspec/capybara.rb +++ b/lib/solidus_dev_support/rspec/capybara.rb @@ -6,7 +6,7 @@ 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', "135") +CAPYBARA_JAVASCRIPT_DRIVER_VERSION = ENV.fetch('CAPYBARA_JAVASCRIPT_DRIVER_VERSION', "132") # Make sure Selenium downloads this version of Chrome ENV['SE_BROWSER_VERSION'] = CAPYBARA_JAVASCRIPT_DRIVER_VERSION