From 2c769c57ee5a95a12b1e575c726cca0415393511 Mon Sep 17 00:00:00 2001 From: Rob Holland Date: Thu, 26 Nov 2009 16:43:39 +0000 Subject: [PATCH] Add default_selector into session as well in case DSL isn't being used. Add some specs. --- lib/capybara/dsl.rb | 23 ++++++++++++++++------- lib/capybara/session.rb | 13 +++++++++---- spec/dsl_spec.rb | 15 +++++++++++++++ spec/session_spec.rb | 19 ++++++++++++++++++- 4 files changed, 58 insertions(+), 12 deletions(-) diff --git a/lib/capybara/dsl.rb b/lib/capybara/dsl.rb index c2af02f2..62aa52ac 100644 --- a/lib/capybara/dsl.rb +++ b/lib/capybara/dsl.rb @@ -1,7 +1,7 @@ module Capybara class << self attr_writer :default_driver, :current_driver, :javascript_driver - attr_writer :default_selector + attr_reader :default_selector attr_accessor :app @@ -10,7 +10,7 @@ module Capybara end def current_driver - @current_driver || default_driver + @current_driver || default_driver end alias_method :mode, :current_driver @@ -19,19 +19,28 @@ module Capybara end def use_default_driver - @current_driver = nil + @current_driver = nil end def current_session - session_pool["#{current_driver}#{app.object_id}"] ||= Capybara::Session.new(current_driver, app) + session_pool["#{current_driver}#{app.object_id}"] ||= begin + session = Capybara::Session.new(current_driver, app) + session.default_selector = default_selector if default_selector + session + end + end + + def current_session? + session_pool.has_key?("#{current_driver}#{app.object_id}") end def reset_sessions! @session_pool = nil end - - def default_selector - @default_selector ||= :xpath + + def default_selector=(selector) + @default_selector = selector + current_session.default_selector = selector if current_session? end private diff --git a/lib/capybara/session.rb b/lib/capybara/session.rb index 2bac175f..0bc309cf 100644 --- a/lib/capybara/session.rb +++ b/lib/capybara/session.rb @@ -10,14 +10,15 @@ class Capybara::Session :select => proc { |id| "//select[@id='#{id}']" }, :file_field => proc { |id| "//input[@type='file'][@id='#{id}']" } } - + attr_reader :mode, :app + attr_writer :default_selector def initialize(mode, app) @mode = mode @app = app end - + def driver @driver ||= case mode when :rack_test @@ -30,7 +31,11 @@ class Capybara::Session raise Capybara::DriverNotFoundError, "no driver called #{mode} was found" end end - + + def default_selector + @default_selector ||= :xpath + end + def visit(path) driver.visit(path) end @@ -92,7 +97,7 @@ class Capybara::Session end def within(kind, scope=nil) - kind, scope = Capybara.default_selector, kind unless scope + kind, scope = default_selector, kind unless scope scope = css_to_xpath(scope) if kind == :css raise Capybara::ElementNotFound, "scope '#{scope}' not found on page" if find(scope).empty? scopes.push(scope) diff --git a/spec/dsl_spec.rb b/spec/dsl_spec.rb index f23267bc..04f3b146 100644 --- a/spec/dsl_spec.rb +++ b/spec/dsl_spec.rb @@ -11,6 +11,7 @@ describe Capybara do after do Capybara.default_driver = nil Capybara.use_default_driver + Capybara.default_selector = nil end describe '#default_driver' do @@ -108,6 +109,20 @@ describe Capybara do end end + describe '#default_selector' do + after do + Capybara.default_selector = nil + end + + it "should set the selector used in current and future sessions" do + Capybara.default_selector.should_not eql(:css) + Capybara.default_selector = :css + Capybara.current_session.default_selector.should eql(:css) + Capybara.reset_sessions! + Capybara.current_session.default_selector.should eql(:css) + end + end + describe 'the DSL' do before do @session = Capybara diff --git a/spec/session_spec.rb b/spec/session_spec.rb index 5a3f0cd3..8f9f90c4 100644 --- a/spec/session_spec.rb +++ b/spec/session_spec.rb @@ -542,7 +542,24 @@ shared_examples_for "session" do @session.body.should include('

Bar

') end end - + + context "with the default selector" do + it "should use XPath" do + lambda { + @session.within("//li[contains(., 'With Simple HTML')]") { } + }.should_not raise_error + end + end + + context "with the default selector set to CSS" do + it "should use CSS" do + @session.default_selector = :css + lambda { + @session.within("ul li[contains('With Simple HTML')]") { } + }.should_not raise_error + end + end + context "with click_link" do it "should click links in the given scope" do @session.within("//li[contains(.,'With Simple HTML')]") do