Add default_selector into session as well in case DSL isn't being used. Add some specs.

This commit is contained in:
Rob Holland 2009-11-26 16:43:39 +00:00
parent 7c528f9b52
commit 2c769c57ee
4 changed files with 58 additions and 12 deletions

View File

@ -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

View File

@ -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)

View File

@ -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

View File

@ -542,7 +542,24 @@ shared_examples_for "session" do
@session.body.should include('<h1>Bar</h1>')
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