1
0
Fork 0
mirror of https://github.com/teamcapybara/capybara.git synced 2022-11-09 12:08:07 -05:00

Branch merge

This commit is contained in:
Andrea Fazzi 2009-11-27 22:11:17 +01:00
commit ea6857b52b
8 changed files with 283 additions and 183 deletions

View file

@ -153,6 +153,20 @@ For ultimate control, you can instantiate and use a session manually.
end end
session.click_link 'Sign in' session.click_link 'Sign in'
== XPath an CSS
Capybara does not try to guess what kind of selector you are going to give it,
if you want to use CSS with your 'within' declarations for example, you'll need
to do:
within(:css, 'ul li') { ... }
Alternatively you can set the default selector to CSS, which may help if you are
moving from Webrat and used CSS a lot, or simply generally prefer CSS:
Capybara.default_selector = :css
within('ul li') { ... }
== Gotchas: == Gotchas:
* Install JRuby and the 'celerity' gem, version 0.7.4 (0.7.5 has a bug with * Install JRuby and the 'celerity' gem, version 0.7.4 (0.7.5 has a bug with
@ -186,6 +200,14 @@ For ultimate control, you can instantiate and use a session manually.
<tt><a href="/same/url#"></tt> instead. You can achieve this in Rails with <tt><a href="/same/url#"></tt> instead. You can achieve this in Rails with
<tt>link_to('foo', :anchor => '')</tt> <tt>link_to('foo', :anchor => '')</tt>
== Contributors:
The following people have dedicated their time and effort to Capybara:
* Jonas Nicklas
* Dennis Rogenius
* Rob Holland
== License: == License:
(The MIT License) (The MIT License)

View file

@ -22,7 +22,6 @@ $hoe = Hoe.spec 'capybara' do
['selenium-webdriver', '>= 0.0.3'], ['selenium-webdriver', '>= 0.0.3'],
['rack', '>= 1.0.0'], ['rack', '>= 1.0.0'],
['rack-test', '>= 0.5.2'], ['rack-test', '>= 0.5.2'],
['database_cleaner', '>= 0.2.3']
] ]
self.extra_dev_deps = [ self.extra_dev_deps = [

View file

@ -7,10 +7,6 @@ After do
Capybara.reset_sessions! Capybara.reset_sessions!
end end
require 'database_cleaner'
require 'database_cleaner/cucumber'
DatabaseCleaner.strategy = :truncation
Before('@javascript') do Before('@javascript') do
Capybara.current_driver = Capybara.javascript_driver Capybara.current_driver = Capybara.javascript_driver
end end

View file

@ -22,7 +22,13 @@ module Capybara
end end
def current_session def current_session
session_pool["#{current_driver}#{app.object_id}"] ||= Capybara::Session.new(current_driver, app) session_pool["#{current_driver}#{app.object_id}"] ||= begin
Capybara::Session.new(current_driver, app)
end
end
def current_session?
session_pool.has_key?("#{current_driver}#{app.object_id}")
end end
def reset_sessions! def reset_sessions!

View file

@ -3,10 +3,14 @@ module Capybara
extend(self) extend(self)
def save_and_open_page(html) def save_and_open_page(html)
require 'tempfile' name="capybara-#{Time.new.strftime("%Y%m%d%H%M%S")}.html"
tempfile = Tempfile.new("capybara#{rand(1000000)}")
FileUtils.touch(name) unless File.exist?(name)
tempfile = File.new(name,'w')
tempfile.write(rewrite_css_and_image_references(html)) tempfile.write(rewrite_css_and_image_references(html))
tempfile.close tempfile.close
open_in_browser(tempfile.path) open_in_browser(tempfile.path)
end end

View file

@ -1,4 +1,14 @@
class Capybara::Session module Capybara
class << self
attr_writer :default_selector
def default_selector
@default_selector ||= :xpath
end
end
class Session
FIELDS_PATHS = { FIELDS_PATHS = {
:text_field => proc { |id| "//input[@type='text'][@id='#{id}']" }, :text_field => proc { |id| "//input[@type='text'][@id='#{id}']" },
@ -92,7 +102,7 @@ class Capybara::Session
end end
def within(kind, scope=nil) def within(kind, scope=nil)
kind, scope = :xpath, kind unless scope kind, scope = Capybara.default_selector, kind unless scope
scope = css_to_xpath(scope) if kind == :css scope = css_to_xpath(scope) if kind == :css
raise Capybara::ElementNotFound, "scope '#{scope}' not found on page" if find(scope).empty? raise Capybara::ElementNotFound, "scope '#{scope}' not found on page" if find(scope).empty?
scopes.push(scope) scopes.push(scope)
@ -137,7 +147,7 @@ class Capybara::Session
button button
end end
private private
def css_to_xpath(css) def css_to_xpath(css)
Nokogiri::CSS.xpath_for(css).first Nokogiri::CSS.xpath_for(css).first
@ -186,5 +196,5 @@ private
locator = current_scope.to_s + locator locator = current_scope.to_s + locator
driver.find(locator) driver.find(locator)
end end
end
end end

View file

@ -0,0 +1,43 @@
require File.expand_path('spec_helper', File.dirname(__FILE__))
require 'capybara/save_and_open_page'
require 'launchy'
describe Capybara::SaveAndOpenPage do
describe "#save_save_and_open_page" do
before do
@time = Time.new.strftime("%Y%m%d%H%M%S")
@name = "capybara-#{@time}.html"
@temp_file = mock("FILE")
@temp_file.stub!(:write)
@temp_file.stub!(:close)
@temp_file.stub!(:path).and_return(@name)
File.should_receive(:exist?).and_return true
File.should_receive(:new).and_return @temp_file
@html = <<-HTML
<html>
<head>
</head>
<body>
<h1>test</h1>
</body>
<html>
HTML
Launchy::Browser.stub(:run)
end
it "should create a new temporary file" do
@temp_file.should_receive(:write).with @html
Capybara::SaveAndOpenPage.save_and_open_page @html
end
it "should open the file in the browser" do
Capybara::SaveAndOpenPage.should_receive(:open_in_browser).with(@name)
Capybara::SaveAndOpenPage.save_and_open_page @html
end
end
end

View file

@ -543,6 +543,26 @@ shared_examples_for "session" do
end end
end end
context "with the default selector" do
it "should use XPath" do
@session.within("//li[contains(., 'With Simple HTML')]") do
@session.click_link('Go')
end
@session.body.should include('<h1>Bar</h1>')
end
end
context "with the default selector set to CSS" do
it "should use CSS" do
Capybara.default_selector = :css
@session.within("ul li[contains('With Simple HTML')]") do
@session.click_link('Go')
end
@session.body.should include('<h1>Bar</h1>')
Capybara.default_selector = :xpath
end
end
context "with click_link" do context "with click_link" do
it "should click links in the given scope" do it "should click links in the given scope" do
@session.within("//li[contains(.,'With Simple HTML')]") do @session.within("//li[contains(.,'With Simple HTML')]") do