From 6a34f8d6dd3e85573b10bf36d39290ffc3fc608e Mon Sep 17 00:00:00 2001 From: Henry Blyth Date: Mon, 6 Jun 2022 13:51:35 +0100 Subject: [PATCH 1/3] Reset @scopes when session is reset Otherwise they persist between RSpec tests. Fix #2562 --- lib/capybara/session.rb | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/capybara/session.rb b/lib/capybara/session.rb index 9918453e..ade17d1e 100644 --- a/lib/capybara/session.rb +++ b/lib/capybara/session.rb @@ -129,6 +129,7 @@ module Capybara if @touched driver.reset! @touched = false + @scopes = [nil] end @server&.wait_for_pending_requests raise_server_error! From d1aad55ff364f3edb9d1c7dff22fd485ed76b3e9 Mon Sep 17 00:00:00 2001 From: Henry Blyth Date: Wed, 8 Jun 2022 12:12:57 +0100 Subject: [PATCH 2/3] Test session resetting scopes --- lib/capybara/spec/session/reset_session_spec.rb | 13 +++++++++++++ lib/capybara/spec/test_app.rb | 16 ++++++++++++++++ 2 files changed, 29 insertions(+) diff --git a/lib/capybara/spec/session/reset_session_spec.rb b/lib/capybara/spec/session/reset_session_spec.rb index 28640e5a..018de555 100644 --- a/lib/capybara/spec/session/reset_session_spec.rb +++ b/lib/capybara/spec/session/reset_session_spec.rb @@ -95,6 +95,19 @@ Capybara::SpecHelper.spec '#reset_session!' do expect(@session.windows.size).to eq 1 end + it 'does not block opening a new window after a frame was switched to and not switched back', requires: [:windows] do + @session.visit('/with_iframe?id=test_iframe&url=/') + @session.switch_to_frame(@session.find(:frame, 'test_iframe')) + within_window_test = lambda do + @session.within_window(@session.open_new_window) do + @session.visit('/') + end + end + expect(&within_window_test).to raise_error(Capybara::ScopeError) + @session.reset_session! + expect(&within_window_test).not_to raise_error + end + context 'When reuse_server == false' do let!(:orig_reuse_server) { Capybara.reuse_server } diff --git a/lib/capybara/spec/test_app.rb b/lib/capybara/spec/test_app.rb index 48811c34..18b97f2a 100644 --- a/lib/capybara/spec/test_app.rb +++ b/lib/capybara/spec/test_app.rb @@ -177,6 +177,22 @@ class TestApp < Sinatra::Base HTML end + get '/with_iframe' do + <<-HTML + + + + + Test with Iframe + + + + + + + HTML + end + get '/base/with_base' do <<-HTML From b8673c6fd9f72e738d8dd764af94a91feb28bbdd Mon Sep 17 00:00:00 2001 From: Henry Blyth Date: Wed, 8 Jun 2022 12:13:09 +0100 Subject: [PATCH 3/3] Ensure ordered specs are always tested in order Otherwise they can be false-positive. --- spec/rspec_spec.rb | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/spec/rspec_spec.rb b/spec/rspec_spec.rb index a95e43f2..b334b828 100644 --- a/spec/rspec_spec.rb +++ b/spec/rspec_spec.rb @@ -15,7 +15,7 @@ RSpec.describe 'capybara/rspec' do expect(self.class.ancestors).to include Capybara::RSpecMatcherProxies end - context 'resetting session' do + context 'resetting session', order: :defined do it 'sets a cookie in one example...' do visit('/set_cookie') expect(page.body).to include('Cookie set to test_cookie') @@ -27,7 +27,7 @@ RSpec.describe 'capybara/rspec' do end end - context 'setting the current driver' do + context 'setting the current driver', order: :defined do it 'sets the current driver in one example...' do Capybara.current_driver = :selenium end