mirror of
https://github.com/teamcapybara/capybara.git
synced 2022-11-09 12:08:07 -05:00
eb1522ec40
Feeling confident that this is kind of stable
212 lines
No EOL
6.7 KiB
Text
212 lines
No EOL
6.7 KiB
Text
= capybara
|
||
|
||
* http://github.com/jnicklas/capybara
|
||
|
||
== Description:
|
||
|
||
Capybara aims to simplify the process of integration testing Rack applications,
|
||
such as Rails, Sinatra or Merb. It is inspired by and aims to replace Webrat as
|
||
a DSL for interacting with a webapplication. It is agnostic about the driver
|
||
running your tests and currently comes bundled with rack-test, Culerity and
|
||
Selenium support built in.
|
||
|
||
== Install:
|
||
|
||
Capybara is hosted on Gemcutter, install it with:
|
||
|
||
sudo gem install capybara
|
||
|
||
== Development:
|
||
|
||
* Source hosted at {GitHub}[http://github.com/jnicklas/capybara].
|
||
* Please direct questions, discussions at the {mailing list}[http://groups.google.com/group/ruby-capybara].
|
||
* Report issues on {GitHub Issues}[http://github.com/jnicklas/capybara/issues]
|
||
* Pull requests are very welcome!
|
||
|
||
== Using Capybara with Cucumber
|
||
|
||
Capybara is built to work nicely with Cucumber. The API is very similar to
|
||
Webrat, so if you know Webrat you should feel right at home. Remove any
|
||
references to Webrat from your <tt>env.rb</tt>, if you're using Rails, make sure to set
|
||
|
||
Cucumber::Rails::World.use_transactional_fixtures = false
|
||
|
||
Capybara uses DatabaseCleaner to truncate the database. Require Capybara in your
|
||
env.rb. For Rails do this:
|
||
|
||
require 'capybara/rails'
|
||
require 'capybara/cucumber'
|
||
|
||
For other frameworks, you'll need to set the Rack app manually:
|
||
|
||
require 'capybara/cucumber'
|
||
Capybara.app = MyRackApp
|
||
|
||
Now you can use it in your steps:
|
||
|
||
When /I sign in/ do
|
||
within("//form[@id='session']") do
|
||
fill_in 'Login', :with => 'user@example.com'
|
||
fill_in 'Password', :with => 'password'
|
||
end
|
||
click_link 'Sign in'
|
||
end
|
||
|
||
== Default and current driver
|
||
|
||
You can set up a default driver for your features. For example if you'd prefer
|
||
to run Selenium, you could do:
|
||
|
||
require 'capybara/rails'
|
||
require 'capybara/cucumber'
|
||
Capybara.default_driver = :selenium
|
||
|
||
You can change the driver temporarily:
|
||
|
||
Capybara.current_driver = :culerity
|
||
Capybara.use_default_driver
|
||
|
||
== Cucumber and Tags
|
||
|
||
Capybara sets up some {tags}[http://wiki.github.com/aslakhellesoy/cucumber/tags]
|
||
for you to use in Cucumber. Often you'll want to use run only some scenarios
|
||
with a driver that supports JavaScript, Capybara makes this easy: simply tag the
|
||
scenario (or feature) with <tt>@javascript</tt>:
|
||
|
||
@javascript
|
||
Scenario: do something AJAXy
|
||
When I click the AJAX link
|
||
...
|
||
|
||
You can change which driver Capybara uses for JavaScript:
|
||
|
||
Capybara.javascript_driver = :culerity
|
||
|
||
There are also explicit <tt>@selenium</tt>, <tt>@culerity</tt> and <tt>@rack_test</tt> tags set up
|
||
for you.
|
||
|
||
== The API
|
||
|
||
Navigation:
|
||
|
||
visit – The only way to get to anywhere.
|
||
|
||
Scoping:
|
||
|
||
within – Takes a block which executes in the given scope
|
||
within_fieldset – Execute the block in the fieldset given by id or legend
|
||
within_table – Execute the block in the table given by id or caption
|
||
|
||
Interaction:
|
||
|
||
click_link
|
||
click_button
|
||
fill_in
|
||
choose
|
||
check
|
||
uncheck
|
||
attach_file
|
||
select
|
||
|
||
Querying:
|
||
|
||
body
|
||
has_xpath? – Checks if given XPath exists, takes text and count options
|
||
has_css? – Checks if given CSS exists, takes text and count options
|
||
has_content? – Checks if the given content is on the page
|
||
find_field
|
||
find_link
|
||
find_button
|
||
field_labeled
|
||
|
||
Debugging:
|
||
|
||
save_and_open_page
|
||
|
||
== Using the DSL outside cucumber
|
||
|
||
You can mix the DSL into any context, for example you could use it in RSpec
|
||
examples. Just load the dsl and include it anywhere:
|
||
|
||
require 'capybara'
|
||
require 'capybara/dsl'
|
||
|
||
include Capybara
|
||
Capybara.default_driver = :culerity
|
||
|
||
within("//form[@id='session']") do
|
||
fill_in 'Login', :with => 'user@example.com'
|
||
fill_in 'Password', :with => 'password'
|
||
end
|
||
click_link 'Sign in'
|
||
|
||
== Using the sessions manually
|
||
|
||
For ultimate control, you can instantiate and use a session manually.
|
||
|
||
require 'capybara'
|
||
|
||
session = Capybara::Session.new(:culerity, my_rack_app)
|
||
session.within("//form[@id='session']") do
|
||
session.fill_in 'Login', :with => 'user@example.com'
|
||
session.fill_in 'Password', :with => 'password'
|
||
end
|
||
session.click_link 'Sign in'
|
||
|
||
== Gotchas:
|
||
|
||
* Install JRuby and the 'celerity' gem, version 0.7.4 (0.7.5 has a bug with
|
||
password fields) under JRuby for Culerity support.
|
||
|
||
* Everything is *case sensitive*. Capybara heavily relies on XPath, which
|
||
doesn't support case insensitive searches.
|
||
|
||
* The <tt>have_tag</tt> and <tt>have_text</tt> matchers in RSpec-Rails are not
|
||
supported. You should use <tt>page.should have_css('#header p')</tt>,
|
||
<tt>page.should have_xpath('//ul/li')</tt> and <tt>page.should
|
||
have_content('Monkey')</tt> instead.
|
||
|
||
* Domain names (including subdomains) don't work under rack-test. Since it's a
|
||
pain to set up subdomains for the other drivers anyway, you should consider an
|
||
alternate solution. You might use
|
||
{default_url_options}[https://gist.github.com/643a758320a2926bd2ed] in Rails
|
||
for example.
|
||
|
||
* The <tt>set_hidden_field</tt> method from Webrat is not implemented, since it doesn't
|
||
work in any of the browser based drivers (Culerity, Selenium)
|
||
|
||
* Access to session, request and response from the test is not possible. Maybe
|
||
we'll do response headers at some point in the future, but the others really
|
||
shouldn't be touched in an integration test anyway.
|
||
|
||
* Access to Rails specific stuff (such as <tt>controller</tt>) is unavailable,
|
||
since we're not using Rails' integration testing.
|
||
|
||
* <tt><a href="#"></tt> Will cause problems under rack-test, please do
|
||
<tt><a href="/same/url#"></tt> instead. You can achieve this in Rails with
|
||
<tt>link_to('foo', :anchor => '')</tt>
|
||
|
||
== License:
|
||
|
||
(The MIT License)
|
||
|
||
Copyright (c) 2009 Jonas Nicklas
|
||
|
||
Permission is hereby granted, free of charge, to any person obtaining
|
||
a copy of this software and associated documentation files (the
|
||
'Software'), to deal in the Software without restriction, including
|
||
without limitation the rights to use, copy, modify, merge, publish,
|
||
distribute, sublicense, and/or sell copies of the Software, and to
|
||
permit persons to whom the Software is furnished to do so, subject to
|
||
the following conditions:
|
||
|
||
The above copyright notice and this permission notice shall be
|
||
included in all copies or substantial portions of the Software.
|
||
|
||
THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
|
||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
||
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
|
||
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
|
||
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. |