From 3403d6325944bbbc1f62f339ae63cbacb58fd6c8 Mon Sep 17 00:00:00 2001 From: Andrew Fader Date: Fri, 30 Oct 2026 20:21:19 -0400 Subject: [PATCH] fix(driver): don't launch a browser to reset or quit when none has started --- CHANGELOG.md | 2 ++ lib/capybara/cuprite/driver.rb | 8 +++++++- spec/lib/driver_spec.rb | 19 +++++++++++++++++++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 36a939c8..a34294c5 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,6 +12,8 @@ [rubycdp/ferrum#689] ### Fixed +- `Driver#reset!` and `Driver#quit` don't launch Chrome when no browser has started, so a failed launch doesn't + launch again during teardown ### Removed - Methods deprecated in 0.20, see its Deprecated section for replacements diff --git a/lib/capybara/cuprite/driver.rb b/lib/capybara/cuprite/driver.rb index a927b48e..279d1518 100644 --- a/lib/capybara/cuprite/driver.rb +++ b/lib/capybara/cuprite/driver.rb @@ -26,7 +26,7 @@ class Driver < Capybara::Driver::Base extend Forwardable include Extensions - delegate %i[quit title window_handles current_window_handle close_window switch_to_window refresh] => :browser + delegate %i[title window_handles current_window_handle close_window switch_to_window refresh] => :browser delegate %i[send_keys] => :active_element def_delegator :browser, :url, :current_url def_delegator :browser, :body, :html @@ -133,7 +133,13 @@ def no_such_window_error Ferrum::NoSuchPageError end + def quit + @browser&.quit + end + def reset! + return unless @browser + browser.url_blacklist = @options[:url_blacklist] browser.url_whitelist = @options[:url_whitelist] browser.raise_on_unhandled_modal = @options.fetch(:raise_on_unhandled_modal, false) diff --git a/spec/lib/driver_spec.rb b/spec/lib/driver_spec.rb index a825c4f6..2369232e 100644 --- a/spec/lib/driver_spec.rb +++ b/spec/lib/driver_spec.rb @@ -40,6 +40,25 @@ ensure driver&.quit end + + it "doesn't launch a browser when none has started" do + driver = described_class.new(nil) + allow(Capybara::Cuprite::Browser).to receive(:new).and_raise(Ferrum::ProcessTimeoutError.new(10, "")) + + expect { driver.visit("about:blank") }.to raise_error(Ferrum::ProcessTimeoutError) + expect { driver.reset! }.not_to raise_error + expect(Capybara::Cuprite::Browser).to have_received(:new).once + end + end + + describe "#quit" do + it "doesn't launch a browser when none has started" do + driver = described_class.new(nil) + allow(Capybara::Cuprite::Browser).to receive(:new).and_raise(Ferrum::ProcessTimeoutError.new(10, "")) + + expect { driver.quit }.not_to raise_error + expect(Capybara::Cuprite::Browser).not_to have_received(:new) + end end describe "save_path configuration" do