From 4e78379160aa5fcb433116a61e56678bc5df0748 Mon Sep 17 00:00:00 2001 From: Dmitry Vorotilin Date: Mon, 5 Oct 2026 11:18:44 +0300 Subject: [PATCH] fix(browser): drop the cached page even when reset raises Browser#reset only cleared @page after super returned, so a reset that raised (e.g. a context whose disposal timed out) left Cuprite holding a page whose session was already gone, and every later example failed. Clear it, the window size and the driver's started flag in an ensure. Refs #274, rubycdp/ferrum#641 --- CHANGELOG.md | 3 +++ lib/capybara/cuprite/browser.rb | 1 + lib/capybara/cuprite/driver.rb | 1 + spec/lib/driver_spec.rb | 16 ++++++++++++++++ 4 files changed, 21 insertions(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0bed814..2d025e2 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,9 @@ ### Changed ### Fixed +- `Driver#reset!` kept the page it had cached when the browser failed to reset, so every later example raised + `Session with given id not found` or `Browser is dead or given window is closed` instead of starting on a fresh + page [#274], [rubycdp/ferrum#641] ### Removed diff --git a/lib/capybara/cuprite/browser.rb b/lib/capybara/cuprite/browser.rb index 5b68448..d127b0c 100644 --- a/lib/capybara/cuprite/browser.rb +++ b/lib/capybara/cuprite/browser.rb @@ -38,6 +38,7 @@ def page def reset super + ensure @options.reset_window_size @page = nil end diff --git a/lib/capybara/cuprite/driver.rb b/lib/capybara/cuprite/driver.rb index 2e31d4c..2214383 100644 --- a/lib/capybara/cuprite/driver.rb +++ b/lib/capybara/cuprite/driver.rb @@ -139,6 +139,7 @@ def reset! browser.url_whitelist = @options[:url_whitelist] browser.raise_on_unhandled_modal = @options.fetch(:raise_on_unhandled_modal, false) browser.reset + ensure @started = false end diff --git a/spec/lib/driver_spec.rb b/spec/lib/driver_spec.rb index fc07e5a..e92ae21 100644 --- a/spec/lib/driver_spec.rb +++ b/spec/lib/driver_spec.rb @@ -20,6 +20,22 @@ end end + describe "#reset!" do + it "drops the cached page even when the browser fails to reset" do + driver = described_class.new(nil) + driver.visit("about:blank") + allow(driver.browser.contexts).to receive(:reset).and_wrap_original do |reset| + reset.call + raise Ferrum::TimeoutError + end + + expect { driver.reset! }.to raise_error(Ferrum::TimeoutError) + expect { driver.visit("about:blank") }.not_to raise_error + ensure + driver&.quit + end + end + describe "save_path configuration" do it "defaults to the Capybara save path" do driver = with_capybara_save_path("/tmp/capybara-save-path") do