capybara 0.4.1.2 → 1.0.0.beta1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/History.txt +46 -0
- data/README.rdoc +211 -64
- data/lib/capybara.rb +31 -15
- data/lib/capybara/cucumber.rb +12 -16
- data/lib/capybara/dsl.rb +65 -28
- data/lib/capybara/node/actions.rb +7 -5
- data/lib/capybara/node/document.rb +8 -0
- data/lib/capybara/node/finders.rb +11 -7
- data/lib/capybara/node/matchers.rb +32 -6
- data/lib/capybara/node/simple.rb +20 -0
- data/lib/capybara/rack_test/browser.rb +115 -0
- data/lib/capybara/rack_test/driver.rb +77 -0
- data/lib/capybara/rack_test/form.rb +80 -0
- data/lib/capybara/rack_test/node.rb +101 -0
- data/lib/capybara/rspec.rb +11 -3
- data/lib/capybara/rspec/features.rb +22 -0
- data/lib/capybara/rspec/matchers.rb +146 -0
- data/lib/capybara/selector.rb +27 -8
- data/lib/capybara/selenium/driver.rb +148 -0
- data/lib/capybara/selenium/node.rb +91 -0
- data/lib/capybara/session.rb +42 -15
- data/lib/capybara/spec/driver.rb +55 -1
- data/lib/capybara/spec/fixtures/capybara.jpg +0 -0
- data/lib/capybara/spec/public/test.js +7 -2
- data/lib/capybara/spec/session.rb +51 -7
- data/lib/capybara/spec/session/attach_file_spec.rb +9 -6
- data/lib/capybara/spec/session/click_button_spec.rb +35 -0
- data/lib/capybara/spec/session/current_host_spec.rb +62 -0
- data/lib/capybara/spec/session/fill_in_spec.rb +6 -0
- data/lib/capybara/spec/session/find_spec.rb +23 -1
- data/lib/capybara/spec/session/first_spec.rb +39 -6
- data/lib/capybara/spec/session/has_css_spec.rb +30 -0
- data/lib/capybara/spec/session/has_field_spec.rb +47 -11
- data/lib/capybara/spec/session/javascript.rb +0 -1
- data/lib/capybara/spec/session/text_spec.rb +19 -0
- data/lib/capybara/spec/test_app.rb +9 -0
- data/lib/capybara/spec/views/form.erb +8 -3
- data/lib/capybara/spec/views/header_links.erb +7 -0
- data/lib/capybara/spec/views/host_links.erb +12 -0
- data/lib/capybara/spec/views/with_html.erb +6 -2
- data/lib/capybara/spec/views/with_html_entities.erb +1 -0
- data/lib/capybara/spec/views/with_js.erb +4 -0
- data/lib/capybara/util/save_and_open_page.rb +7 -3
- data/lib/capybara/util/timeout.rb +2 -2
- data/lib/capybara/version.rb +1 -1
- data/spec/capybara_spec.rb +1 -1
- data/spec/driver/rack_test_driver_spec.rb +24 -2
- data/spec/driver/selenium_driver_spec.rb +2 -1
- data/spec/dsl_spec.rb +56 -4
- data/spec/rspec/features_spec.rb +45 -0
- data/spec/rspec/matchers_spec.rb +451 -0
- data/spec/rspec_spec.rb +9 -2
- data/spec/save_and_open_page_spec.rb +9 -13
- data/spec/server_spec.rb +4 -0
- data/spec/session/rack_test_session_spec.rb +2 -2
- data/spec/session/selenium_session_spec.rb +1 -1
- data/spec/spec_helper.rb +0 -14
- data/spec/string_spec.rb +1 -1
- metadata +60 -69
- data/lib/capybara/driver/celerity_driver.rb +0 -164
- data/lib/capybara/driver/culerity_driver.rb +0 -26
- data/lib/capybara/driver/rack_test_driver.rb +0 -303
- data/lib/capybara/driver/selenium_driver.rb +0 -161
- data/spec/driver/celerity_driver_spec.rb +0 -13
- data/spec/driver/culerity_driver_spec.rb +0 -14
- data/spec/driver/remote_culerity_driver_spec.rb +0 -22
- data/spec/driver/remote_selenium_driver_spec.rb +0 -16
- data/spec/session/celerity_session_spec.rb +0 -24
- data/spec/session/culerity_session_spec.rb +0 -26
data/History.txt
CHANGED
@@ -1,3 +1,49 @@
|
|
1
|
+
# Version 1.0.0
|
2
|
+
|
3
|
+
Release date:
|
4
|
+
|
5
|
+
### Added
|
6
|
+
|
7
|
+
* Added DSL for acceptance tests, inspired by Luismi Cavallé's Steak [Luismi Cavalle and Jonas Nicklas]
|
8
|
+
* Selenium driver automatically waits for AJAX requests to finish [mgiambalvo, Nicklas Ramhöj and Jonas Nicklas]
|
9
|
+
* Support for switching between multiple named sessions [Tristan Dunn]
|
10
|
+
* failure_message can be specified for Selectors [Jonas Nicklas]
|
11
|
+
* RSpec matchers [David Chelimsky and Jonas Nicklas]
|
12
|
+
* Added save_page to save tempfile without opening in browser [Jeff Kreeftmeijer]
|
13
|
+
* Cucumber now switches automatically to a registered driver if the tag matches the name [Jonas Nicklas]
|
14
|
+
* Added Session#text [Jonas Nicklas and Scott Cytacki]
|
15
|
+
* Added Session#html as an alias for Session#body [Jo Liss]
|
16
|
+
* Added Session#current_host method [Jonas Nicklas]
|
17
|
+
* Buttons can now be clicked by title [Javier Martin]
|
18
|
+
* :headers option for RackTest driver to set custom HTTP headers [Jonas Nicklas]
|
19
|
+
|
20
|
+
### Removed
|
21
|
+
|
22
|
+
* Culerity and Celerity drivers have been removed and split into separate gems [Gabriel Sobrinho]
|
23
|
+
|
24
|
+
### Deprecated
|
25
|
+
|
26
|
+
* `include Capybara` has been deprecated in favour of `include Capybara::DSL` [Jonas Nicklas]
|
27
|
+
|
28
|
+
### Changed
|
29
|
+
|
30
|
+
* Rack test driver class has been renamed from Capybara::Driver::RackTest to Capybara::RackTest::Driver [Jonas Nicklas]
|
31
|
+
* Selenium driver class has been renamed from Capybara::Driver::Selenium to Capybara::Selenium::Driver [Jonas Nicklas]
|
32
|
+
* Capybara now prefers visible elements over hidden elements, disable by setting Capybara.prefer_visible_elements = false [Jonas Nicklas and Nicklas Ramhöj]
|
33
|
+
* For RSpec, :type => :request is now supported (and preferred over :acceptance) [Jo Liss]
|
34
|
+
* Selenium driver tried to wait for AJAX requests to finish before proceeding [Jonas Nicklas and Nicklas Ramhöj]
|
35
|
+
* Session no longer uses method missing, uses explicit delegates instead [Jonas Nicklas]
|
36
|
+
|
37
|
+
### Fixed
|
38
|
+
|
39
|
+
* The Rack::Test driver now respects maxlength on text fields [Guilherme Carvalho]
|
40
|
+
* Allow for more than one save_and_open_page call per second [Jo Liss]
|
41
|
+
* Automatically convert options to :count, :minimum, :maximum, etc. to integers [Keith Marcum]
|
42
|
+
* Rack::Test driver honours maxlength on input fields [Guilherme Carvalho]
|
43
|
+
* Rack::Test now works as expected with domains and subdomains [Jonas Nicklas]
|
44
|
+
* Session is reset more thoroughly between tests. [Jonas Nicklas]
|
45
|
+
* Raise error when uploading non-existant file [Jonas Nicklas]
|
46
|
+
|
1
47
|
# Version 0.4.1
|
2
48
|
|
3
49
|
Release date: 2011-01-21
|
data/README.rdoc
CHANGED
@@ -7,12 +7,11 @@
|
|
7
7
|
Capybara aims to simplify the process of integration testing Rack applications,
|
8
8
|
such as Rails, Sinatra or Merb. Capybara simulates how a real user would
|
9
9
|
interact with a web application. It is agnostic about the driver running your
|
10
|
-
tests and currently comes
|
11
|
-
|
12
|
-
{capybara-envjs gem}[http://github.com/smparkes/capybara-envjs].
|
10
|
+
tests and currently comes with Rack::Test and Selenium support built in.
|
11
|
+
HtmlUnit and env.js are supported through external gems.
|
13
12
|
|
14
|
-
|
15
|
-
{at
|
13
|
+
A complete reference is available at
|
14
|
+
{at rubydoc.info}[http://rubydoc.info/github/jnicklas/capybara/master].
|
16
15
|
|
17
16
|
== Install:
|
18
17
|
|
@@ -36,6 +35,7 @@ you make.
|
|
36
35
|
|
37
36
|
Capybara uses bundler in development. To set up a development environment, simply do:
|
38
37
|
|
38
|
+
git submodule update --init
|
39
39
|
gem install bundler --pre
|
40
40
|
bundle install
|
41
41
|
|
@@ -70,8 +70,8 @@ driver that supports JavaScript, Capybara makes this easy: simply tag the
|
|
70
70
|
scenario (or feature) with <tt>@javascript</tt>:
|
71
71
|
|
72
72
|
@javascript
|
73
|
-
Scenario: do something
|
74
|
-
When I click the
|
73
|
+
Scenario: do something Ajaxy
|
74
|
+
When I click the Ajax link
|
75
75
|
...
|
76
76
|
|
77
77
|
You can change which driver Capybara uses for JavaScript:
|
@@ -83,14 +83,18 @@ There are also explicit <tt>@selenium</tt>, <tt>@culerity</tt> and
|
|
83
83
|
|
84
84
|
== Using Capybara with RSpec
|
85
85
|
|
86
|
-
If you prefer RSpec to using Cucumber, you can use the built in RSpec support
|
86
|
+
If you prefer RSpec to using Cucumber, you can use the built in RSpec support
|
87
|
+
by adding the following line (typically to your <tt>spec_helper.rb</tt> file):
|
87
88
|
|
88
89
|
require 'capybara/rspec'
|
89
|
-
Capybara.app = MyRackApp
|
90
90
|
|
91
91
|
You can now use it in your examples:
|
92
92
|
|
93
|
-
describe "the signup process", :type => :
|
93
|
+
describe "the signup process", :type => :request do
|
94
|
+
before :each do
|
95
|
+
User.make(:email => 'user@example.com', :password => 'caplin')
|
96
|
+
end
|
97
|
+
|
94
98
|
it "signs me in" do
|
95
99
|
within("#session") do
|
96
100
|
fill_in 'Login', :with => 'user@example.com'
|
@@ -100,8 +104,16 @@ You can now use it in your examples:
|
|
100
104
|
end
|
101
105
|
end
|
102
106
|
|
103
|
-
Capybara is only included for examples
|
104
|
-
<tt>:acceptance</tt
|
107
|
+
Capybara is only included for examples with <tt>:type => :request</tt> (or
|
108
|
+
<tt>:acceptance</tt> for compatibility).
|
109
|
+
|
110
|
+
If you use the <tt>rspec-rails</tt> gem, <tt>:type => :request</tt> is
|
111
|
+
automatically set on all files under <tt>spec/requests</tt>. Essentially, these
|
112
|
+
are Capybara-enhanced Rails request specs, so it's a good idea to place your
|
113
|
+
Capybara specs here because within request specs you gain a few additional
|
114
|
+
features, such as the ability to refer to named route helpers. If you do not
|
115
|
+
need these, then you may simply use <tt>spec/acceptance</tt> and you will still
|
116
|
+
get access to Capybara methods.
|
105
117
|
|
106
118
|
RSpec's metadata feature can be used to switch to a different driver. Use
|
107
119
|
<tt>:js => true</tt> to switch to the javascript driver, or provide a
|
@@ -112,46 +124,146 @@ RSpec's metadata feature can be used to switch to a different driver. Use
|
|
112
124
|
it 'will switch to one specific driver', :driver => :celerity
|
113
125
|
end
|
114
126
|
|
127
|
+
Capybara also comes with a built in DSL for creating descriptive acceptance tests:
|
128
|
+
|
129
|
+
feature "Signing up" do
|
130
|
+
background do
|
131
|
+
User.make(:email => 'user@example.com', :password => 'caplin')
|
132
|
+
end
|
133
|
+
|
134
|
+
scenario "Signing in with correct credentials" do
|
135
|
+
within("#session") do
|
136
|
+
fill_in 'Login', :with => 'user@example.com'
|
137
|
+
fill_in 'Password', :with => 'caplin'
|
138
|
+
end
|
139
|
+
click_link 'Sign in'
|
140
|
+
end
|
141
|
+
end
|
142
|
+
|
143
|
+
Essentially, this is just a shortcut for making a request spec, where
|
144
|
+
<tt>feature</tt> is a shortcut for <tt>describe ..., :type => :request</tt>,
|
145
|
+
<tt>background</tt> is an alias for <tt>before :each</tt>, and <tt>scenario</tt>
|
146
|
+
is an alias for <tt>it</tt>/<tt>example</tt>. Again, you are encouraged to place
|
147
|
+
these within <tt>spec/requests</tt> rather than <tt>spec/acceptance</tt>.
|
148
|
+
|
115
149
|
Note that Capybara's built in RSpec support only works with RSpec 2.0 or later.
|
116
150
|
You'll need to roll your own for earlier versions of RSpec.
|
117
151
|
|
118
|
-
==
|
152
|
+
== Using Capybara with Test::Unit
|
153
|
+
|
154
|
+
To use Capybara with Test::Unit, include the DSL (<tt>include Capybara</tt> up
|
155
|
+
until version 0.4.x, <tt>include Capybara::DSL</tt> for newer versions) in
|
156
|
+
whatever test class you are using. For example, if your classes derive from
|
157
|
+
<tt>ActionDispatch::IntegrationTest</tt>, use
|
158
|
+
|
159
|
+
class ActionDispatch::IntegrationTest
|
160
|
+
include Capybara::DSL
|
161
|
+
end
|
162
|
+
|
163
|
+
Test::Unit does not support selecting the driver through test metadata, but you
|
164
|
+
can switch the driver for specific classes using the <tt>setup</tt> and
|
165
|
+
<tt>teardown</tt> methods. See the section "Selecting the Driver".
|
166
|
+
|
167
|
+
== Using Capybara with Ruby on Rails
|
119
168
|
|
120
|
-
|
121
|
-
to
|
169
|
+
If you are using the Rails framework, add this line to automatically configure
|
170
|
+
Capybara to test against your Rails application:
|
122
171
|
|
123
172
|
require 'capybara/rails'
|
124
|
-
|
173
|
+
|
174
|
+
== Using Capybara with Rack
|
175
|
+
|
176
|
+
If you're using Capybara with a non-Rails Rack application, set
|
177
|
+
<tt>Capybara.app</tt> to your application class:
|
178
|
+
|
179
|
+
Capybara.app = MyRackApp
|
180
|
+
|
181
|
+
== Drivers
|
182
|
+
|
183
|
+
Capybara uses the same DSL to drive a variety of browser and headless drivers.
|
184
|
+
|
185
|
+
=== Selecting the Driver
|
186
|
+
|
187
|
+
By default, Capybara uses the <tt>:rack_test</tt> driver, which is fast but does not
|
188
|
+
support JavaScript. You can set up a different default driver for your
|
189
|
+
features. For example if you'd prefer to run everything in Selenium, you could
|
190
|
+
do:
|
191
|
+
|
125
192
|
Capybara.default_driver = :selenium
|
126
193
|
|
127
|
-
|
194
|
+
However, if you are using RSpec or Cucumber, you may instead want to consider
|
195
|
+
leaving the faster <tt>:rack_test</tt> as the +default_driver+, and marking only those
|
196
|
+
tests that require a JavaScript-capable driver using <tt>:js => true</tt> or
|
197
|
+
<tt>@javascript</tt>, respectively. By default, JavaScript tests are run using the
|
198
|
+
<tt>:selenium</tt> driver. You can change this by setting
|
199
|
+
<tt>Capybara.javascript_driver</tt>.
|
200
|
+
|
201
|
+
You can also change the driver temporarily (typically in the Before/setup and
|
202
|
+
After/teardown blocks):
|
203
|
+
|
204
|
+
Capybara.current_driver = :culerity # temporarily select different driver
|
205
|
+
... tests ...
|
206
|
+
Capybara.use_default_driver # switch back to default driver
|
207
|
+
|
208
|
+
Note that switching the driver creates a new session, so you may not be able to
|
209
|
+
switch in the middle of a test.
|
210
|
+
|
211
|
+
=== RackTest
|
212
|
+
|
213
|
+
RackTest is Capybara's default driver. It is written in pure Ruby and does not
|
214
|
+
have any support for executing JavaScript. Since the RackTest driver works
|
215
|
+
directly agains the Rack interface, it does not need any server to be started,
|
216
|
+
it can work directly work against any Rack app. This means that if your
|
217
|
+
application is not a Rack application (Rails, Sinatra and most other Ruby
|
218
|
+
frameworks are Rack applications) then you cannot use this driver. You cannot
|
219
|
+
use the RackTest driver to test a remote application.
|
220
|
+
{capybara-mechanize}[https://github.com/jeroenvandijk/capybara-mechanize]
|
221
|
+
intends to provide a similar driver which works against remote servers, it is a
|
222
|
+
separate project.
|
223
|
+
|
224
|
+
RackTest can be configured with a set of headers like this:
|
225
|
+
|
226
|
+
Capybara.register_driver :rack_test do |app|
|
227
|
+
Capybara::RackTest::Driver.new(app, :browser => :chrome)
|
228
|
+
end
|
229
|
+
|
230
|
+
See the section on adding and configuring drivers.
|
128
231
|
|
129
|
-
|
130
|
-
Capybara.use_default_driver
|
232
|
+
=== Selenium
|
131
233
|
|
132
|
-
|
133
|
-
|
134
|
-
|
234
|
+
At the moment, Capybara supports {Selenium 2.0
|
235
|
+
(Webdriver)}[http://seleniumhq.org/docs/01_introducing_selenium.html#selenium-2-aka-selenium-webdriver],
|
236
|
+
*not* Selenium RC. Provided Firefox is installed, everything is set up for you,
|
237
|
+
and you should be able to start using Selenium right away.
|
135
238
|
|
136
|
-
|
239
|
+
By default Capybara tries to synchronize Ajax requests, so it will wait for
|
240
|
+
Ajax requests to finish after you've interacted with the page. You can switch
|
241
|
+
off this behaviour by setting the driver option <tt>:resynchronize</tt> to
|
242
|
+
<tt>false</tt>. See the section on configuring drivers.
|
137
243
|
|
138
|
-
|
139
|
-
|
140
|
-
you should be able to start using Selenium right away.
|
244
|
+
Note: Selenium does not support transactional fixtures; see the section
|
245
|
+
"Transactional Fixtures" below.
|
141
246
|
|
142
|
-
|
247
|
+
=== HtmlUnit
|
143
248
|
|
144
|
-
|
145
|
-
|
249
|
+
There are three different drivers, maintained as external gems, that you can
|
250
|
+
use to drive {HtmlUnit}[http://htmlunit.sourceforge.net/]:
|
146
251
|
|
147
|
-
|
252
|
+
* {Akephalos}[https://github.com/bernerdschaefer/akephalos] might be the best
|
253
|
+
HtmlUnit driver right now.
|
148
254
|
|
149
|
-
|
255
|
+
* {Celerity}[https://github.com/sobrinho/capybara-celerity] only runs on JRuby,
|
256
|
+
so you'll need to install the celerity gem under JRuby: <tt>jruby -S gem
|
257
|
+
install celerity</tt>
|
150
258
|
|
151
|
-
|
152
|
-
|
259
|
+
* {Culerity}[https://github.com/sobrinho/capybara-culerity]: Install celerity
|
260
|
+
as noted above, and make sure that JRuby is in your path. Note that Culerity
|
261
|
+
does not seem to be working under Ruby 1.9 at the moment.
|
153
262
|
|
154
|
-
|
263
|
+
Note: HtmlUnit does not support transactional fixtures; see the section
|
264
|
+
"Transactional Fixtures" below.
|
265
|
+
|
266
|
+
=== env.js
|
155
267
|
|
156
268
|
The {capybara-envjs driver}[http://github.com/smparkes/capybara-envjs]
|
157
269
|
uses the envjs gem ({GitHub}[http://github.com/smparkes/env-js],
|
@@ -163,17 +275,22 @@ JavaScript outside the browser. The driver is installed by installing the capyba
|
|
163
275
|
More info about the driver and env.js are available through the links above. The envjs gem only supports
|
164
276
|
Ruby 1.8.7 at this time.
|
165
277
|
|
166
|
-
|
278
|
+
Note: Envjs does not support transactional fixtures; see the section
|
279
|
+
"Transactional Fixtures" below.
|
167
280
|
|
168
|
-
|
169
|
-
in a lot of cases, there are certain important differences.
|
281
|
+
== The DSL
|
170
282
|
|
171
|
-
|
172
|
-
|
283
|
+
Capybara's DSL (domain-specific language) is inspired by Webrat. While
|
284
|
+
backwards compatibility is retained in a lot of cases, there are certain
|
285
|
+
important differences. Unlike in Webrat, all searches in Capybara are *case
|
286
|
+
sensitive*. This is because Capybara heavily uses XPath, which doesn't support
|
287
|
+
case insensitivity.
|
173
288
|
|
174
289
|
=== Navigating
|
175
290
|
|
176
|
-
You can use the
|
291
|
+
You can use the
|
292
|
+
<tt>{visit}[http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Session#visit-instance_method]</tt>
|
293
|
+
method to navigate to other pages:
|
177
294
|
|
178
295
|
visit('/projects')
|
179
296
|
visit(post_comments_path(post))
|
@@ -181,29 +298,34 @@ You can use the <tt>visit</tt> method to navigate to other pages:
|
|
181
298
|
The visit method only takes a single parameter, the request method is *always*
|
182
299
|
GET.
|
183
300
|
|
184
|
-
You can get the current
|
301
|
+
You can get the {current
|
302
|
+
path}[http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Session#current_path-instance_method]
|
303
|
+
of the browsing session for test assertions:
|
185
304
|
|
186
305
|
current_path.should == post_comments_path(post)
|
187
306
|
|
188
307
|
=== Clicking links and buttons
|
189
308
|
|
309
|
+
<em>Full reference: {Capybara::Node::Actions}[http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Actions]</em>
|
310
|
+
|
190
311
|
You can interact with the webapp by following links and buttons. Capybara
|
191
312
|
automatically follows any redirects, and submits forms associated with buttons.
|
192
313
|
|
193
314
|
click_link('id-of-link')
|
194
315
|
click_link('Link Text')
|
195
316
|
click_button('Save')
|
196
|
-
|
197
|
-
|
317
|
+
click_on('Link Text') # clicks on either links or buttons
|
318
|
+
click_on('Button Value')
|
198
319
|
|
199
320
|
=== Interacting with forms
|
200
321
|
|
201
|
-
|
202
|
-
|
322
|
+
<em>Full reference: {Capybara::Node::Actions}[http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Actions]</em>
|
323
|
+
|
324
|
+
There are a number of tools for interacting with form elements:
|
203
325
|
|
204
326
|
fill_in('First Name', :with => 'John')
|
205
327
|
fill_in('Password', :with => 'Seekrit')
|
206
|
-
fill_in('Description', :with => 'Really Long Text
|
328
|
+
fill_in('Description', :with => 'Really Long Text...')
|
207
329
|
choose('A Radio Button')
|
208
330
|
check('A Checkbox')
|
209
331
|
uncheck('A Checkbox')
|
@@ -212,6 +334,8 @@ with the various form elements:
|
|
212
334
|
|
213
335
|
=== Querying
|
214
336
|
|
337
|
+
<em>Full reference: {Capybara::Node::Matchers}[http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Matchers]</em>
|
338
|
+
|
215
339
|
Capybara has a rich set of options for querying the page for the existence of
|
216
340
|
certain elements, and working with and manipulating those elements.
|
217
341
|
|
@@ -223,7 +347,7 @@ certain elements, and working with and manipulating those elements.
|
|
223
347
|
page.has_css?('table tr.foo')
|
224
348
|
page.has_content?('foo')
|
225
349
|
|
226
|
-
You can these
|
350
|
+
You can use these with RSpec's magic matchers:
|
227
351
|
|
228
352
|
page.should have_selector('table tr')
|
229
353
|
page.should have_selector(:xpath, '//table/tr')
|
@@ -238,8 +362,16 @@ Note that <tt>page.should have_no_xpath</tt> is preferred over
|
|
238
362
|
<tt>page.should_not have_xpath</tt>. Read the section on asynchronous JavaScript
|
239
363
|
for an explanation.
|
240
364
|
|
365
|
+
If all else fails, you can also use the
|
366
|
+
<tt>{page.html}[http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Session#html-instance_method]</tt>
|
367
|
+
method to test against the raw HTML:
|
368
|
+
|
369
|
+
page.html.should match /<span>.../i
|
370
|
+
|
241
371
|
=== Finding
|
242
372
|
|
373
|
+
<em>Full reference: {Capybara::Node::Finders}[http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Node/Finders]</em>
|
374
|
+
|
243
375
|
You can also find specific elements, in order to manipulate them:
|
244
376
|
|
245
377
|
find_field('First Name').value
|
@@ -251,7 +383,7 @@ You can also find specific elements, in order to manipulate them:
|
|
251
383
|
all('a').each { |a| a[:href] }
|
252
384
|
|
253
385
|
Note that <tt>find</tt> will wait for an element to appear on the page, as explained in the
|
254
|
-
|
386
|
+
Ajax section. If the element does not appear it will raise an error.
|
255
387
|
|
256
388
|
These elements all have all the Capybara DSL methods available, so you can restrict them
|
257
389
|
to specific parts of the page:
|
@@ -263,8 +395,9 @@ to specific parts of the page:
|
|
263
395
|
|
264
396
|
Capybara makes it possible to restrict certain actions, such as interacting with
|
265
397
|
forms or clicking links and buttons, to within a specific area of the page. For
|
266
|
-
this purpose you can use the generic
|
267
|
-
|
398
|
+
this purpose you can use the generic
|
399
|
+
<tt>{within}[http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Session#within-instance_method]</tt>
|
400
|
+
method. Optionally you can specify which kind of selector to use.
|
268
401
|
|
269
402
|
within("li#employee") do
|
270
403
|
fill_in 'Name', :with => 'Jimmy'
|
@@ -304,7 +437,18 @@ look at it:
|
|
304
437
|
|
305
438
|
save_and_open_page
|
306
439
|
|
307
|
-
==
|
440
|
+
== Transactional fixtures
|
441
|
+
|
442
|
+
Transactional fixtures only work in the default Rack::Test driver, but not for
|
443
|
+
other drivers like Selenium. Cucumber takes care of this automatically, but
|
444
|
+
with Test::Unit or RSpec, you may have to use the
|
445
|
+
{database_cleaner}[https://github.com/bmabey/database_cleaner] gem. See {this
|
446
|
+
explanation}[https://groups.google.com/d/msg/ruby-capybara/JI6JrirL9gM/R6YiXj4gi_UJ]
|
447
|
+
(and code for {solution
|
448
|
+
2}[http://opinionated-programmer.com/2011/02/capybara-and-selenium-with-rspec-and-rails-3/#comment-220]
|
449
|
+
and {solution 3}[http://pastie.org/1745020]) for details.
|
450
|
+
|
451
|
+
== Asynchronous JavaScript (Ajax and friends)
|
308
452
|
|
309
453
|
When working with asynchronous JavaScript, you might come across situations
|
310
454
|
where you are attempting to interact with an element which is not yet present
|
@@ -318,7 +462,7 @@ When issuing instructions to the DSL such as:
|
|
318
462
|
page.should have_content('baz')
|
319
463
|
|
320
464
|
If clicking on the *foo* link causes triggers an asynchronous process, such as
|
321
|
-
an
|
465
|
+
an Ajax request, which, when complete will add the *bar* link to the page,
|
322
466
|
clicking on the *bar* link would be expeced to fail, since that link doesn't
|
323
467
|
exist yet. However Capybara is smart enought to retry finding the link for a
|
324
468
|
brief period of time before giving up and throwing an error. The same is true of
|
@@ -339,10 +483,10 @@ asynchronous process has not yet removed the element from the page, it would
|
|
339
483
|
therefore fail, even though the code might be working correctly. The latter
|
340
484
|
correctly waits for the element to disappear from the page.
|
341
485
|
|
342
|
-
== Using the DSL
|
486
|
+
== Using the DSL in unsupported testing frameworks
|
487
|
+
|
488
|
+
You can mix the DSL into any context by including +Capybara::DSL+:
|
343
489
|
|
344
|
-
You can mix the DSL into any context, for example you could use it in RSpec
|
345
|
-
examples. Just load the DSL and include it anywhere:
|
346
490
|
|
347
491
|
require 'capybara'
|
348
492
|
require 'capybara/dsl'
|
@@ -350,7 +494,7 @@ examples. Just load the DSL and include it anywhere:
|
|
350
494
|
Capybara.default_driver = :culerity
|
351
495
|
|
352
496
|
module MyModule
|
353
|
-
include Capybara
|
497
|
+
include Capybara::DSL
|
354
498
|
|
355
499
|
def login!
|
356
500
|
within("//form[@id='session']") do
|
@@ -372,8 +516,9 @@ setting app_host:
|
|
372
516
|
...
|
373
517
|
visit('/')
|
374
518
|
|
375
|
-
Note that
|
376
|
-
drivers that support it, you can also visit any
|
519
|
+
Note that the default driver (<tt>:rack_test</tt>) does not support running
|
520
|
+
against a remote server. With drivers that support it, you can also visit any
|
521
|
+
URL directly:
|
377
522
|
|
378
523
|
visit('http://www.google.com')
|
379
524
|
|
@@ -385,7 +530,9 @@ remote application:
|
|
385
530
|
|
386
531
|
== Using the sessions manually
|
387
532
|
|
388
|
-
For ultimate control, you can instantiate and use a
|
533
|
+
For ultimate control, you can instantiate and use a
|
534
|
+
{Session}[http://rubydoc.info/github/jnicklas/capybara/master/Capybara/Session]
|
535
|
+
manually.
|
389
536
|
|
390
537
|
require 'capybara'
|
391
538
|
|
@@ -399,8 +546,8 @@ For ultimate control, you can instantiate and use a session manually.
|
|
399
546
|
== XPath, CSS and selectors
|
400
547
|
|
401
548
|
Capybara does not try to guess what kind of selector you are going to give it,
|
402
|
-
|
403
|
-
|
549
|
+
and will always use CSS by default. If you want to use XPath, you'll need to
|
550
|
+
do:
|
404
551
|
|
405
552
|
within(:xpath, '//ul/li') { ... }
|
406
553
|
find(:xpath, '//ul/li').text
|
@@ -474,14 +621,14 @@ an API to tweak those drivers with whatever settings you want, or to add your ow
|
|
474
621
|
drivers. This is how to switch the selenium driver to use chrome:
|
475
622
|
|
476
623
|
Capybara.register_driver :selenium do |app|
|
477
|
-
Capybara::Driver
|
624
|
+
Capybara::Selenium::Driver.new(app, :browser => :chrome)
|
478
625
|
end
|
479
626
|
|
480
627
|
However, it's also possible to give this a different name, so tests can switch
|
481
628
|
between using different browsers effortlessly:
|
482
629
|
|
483
630
|
Capybara.register_driver :selenium_chrome do |app|
|
484
|
-
Capybara::Driver
|
631
|
+
Capybara::Selenium::Driver.new(app, :browser => :chrome)
|
485
632
|
end
|
486
633
|
|
487
634
|
Whatever is returned from the block should conform to the API described by
|
@@ -503,7 +650,7 @@ additional info about how the underlying driver can be configured.
|
|
503
650
|
|
504
651
|
* Freezing time: It's common practice to mock out the Time so that features
|
505
652
|
that depend on the current Date work as expected. This can be problematic,
|
506
|
-
since Capybara's
|
653
|
+
since Capybara's Ajax timing uses the system time, resulting in Capybara
|
507
654
|
never timing out and just hanging when a failure occurs. It's still possible to
|
508
655
|
use plugins which allow you to travel in time, rather than freeze time.
|
509
656
|
One such plugin is {Timecop}[http://github.com/jtrupiano/timecop].
|