diff --git a/lib/capybara.rb b/lib/capybara.rb index 74979464..f1229587 100644 --- a/lib/capybara.rb +++ b/lib/capybara.rb @@ -299,7 +299,7 @@ module Capybara # @return [Capybara::Session] The currently used session # def current_session - session_pool["#{current_driver}:#{session_name}:#{app.object_id}"] ||= Capybara::Session.new(current_driver, app) + specified_session || session_pool["#{current_driver}:#{session_name}:#{app.object_id}"] end ## @@ -337,22 +337,25 @@ module Capybara ## # - # Yield a block using a specific session name. + # Yield a block using a specific session name or Capybara::Session instance. # - def using_session(name) + def using_session(name_or_session) previous_session_info = { + specified_session: specified_session, session_name: session_name, current_driver: current_driver, app: app } - self.session_name = name + self.specified_session = self.session_name = nil + if name_or_session.is_a? Capybara::Session + self.specified_session = name_or_session + else + self.session_name = name_or_session + end yield ensure - self.session_name = previous_session_info[:session_name] - if threadsafe - self.current_driver = previous_session_info[:current_driver] - self.app = previous_session_info[:app] - end + self.session_name, self.specified_session = previous_session_info.values_at(:session_name, :specified_session) + self.current_driver, self.app = previous_session_info.values_at(:current_driver, :app) if threadsafe end ## @@ -381,7 +384,25 @@ module Capybara end def session_pool - @session_pool ||= {} + @session_pool ||= Hash.new do |hash, name| + hash[name] = Capybara::Session.new(current_driver, app) + end + end + + def specified_session + if threadsafe + Thread.current['capybara_specified_session'] + else + @specified_session + end + end + + def specified_session=(session) + if threadsafe + Thread.current['capybara_specified_session'] = session + else + @specified_session = session + end end end diff --git a/lib/capybara/dsl.rb b/lib/capybara/dsl.rb index 4fcbe6ed..8a2ce5ec 100644 --- a/lib/capybara/dsl.rb +++ b/lib/capybara/dsl.rb @@ -18,8 +18,8 @@ module Capybara # # Shortcut to working in a different session. # - def using_session(name, &block) - Capybara.using_session(name, &block) + def using_session(name_or_session, &block) + Capybara.using_session(name_or_session, &block) end # Shortcut to using a different wait time. diff --git a/spec/dsl_spec.rb b/spec/dsl_spec.rb index ceead381..5674d3ab 100644 --- a/spec/dsl_spec.rb +++ b/spec/dsl_spec.rb @@ -224,6 +224,15 @@ RSpec.describe Capybara::DSL do end expect(Capybara.session_name).to eq(:default) end + + it 'should allow a session object' do + original_session = Capybara.current_session + new_session = Capybara::Session.new(:rack_test, proc {}) + Capybara.using_session(new_session) do + expect(Capybara.current_session).to eq(new_session) + end + expect(Capybara.current_session).to eq(original_session) + end end describe '#session_name' do