capybara 2.4.4 → 2.5.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (76) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +32 -5
  3. data/README.md +69 -8
  4. data/lib/capybara.rb +50 -29
  5. data/lib/capybara/driver/base.rb +4 -0
  6. data/lib/capybara/driver/node.rb +4 -0
  7. data/lib/capybara/helpers.rb +17 -5
  8. data/lib/capybara/node/actions.rb +16 -11
  9. data/lib/capybara/node/base.rb +7 -7
  10. data/lib/capybara/node/document_matchers.rb +1 -1
  11. data/lib/capybara/node/element.rb +82 -7
  12. data/lib/capybara/node/finders.rb +62 -22
  13. data/lib/capybara/node/matchers.rb +3 -3
  14. data/lib/capybara/node/simple.rb +6 -1
  15. data/lib/capybara/queries/base_query.rb +1 -1
  16. data/lib/capybara/queries/current_path_query.rb +58 -0
  17. data/lib/capybara/queries/text_query.rb +2 -11
  18. data/lib/capybara/rack_test/browser.rb +7 -2
  19. data/lib/capybara/rack_test/driver.rb +4 -0
  20. data/lib/capybara/rack_test/form.rb +2 -1
  21. data/lib/capybara/rack_test/node.rb +1 -0
  22. data/lib/capybara/result.rb +2 -2
  23. data/lib/capybara/rspec.rb +1 -0
  24. data/lib/capybara/rspec/features.rb +1 -1
  25. data/lib/capybara/rspec/matchers.rb +42 -3
  26. data/lib/capybara/selector.rb +7 -2
  27. data/lib/capybara/selenium/driver.rb +26 -12
  28. data/lib/capybara/selenium/node.rb +42 -6
  29. data/lib/capybara/server.rb +1 -1
  30. data/lib/capybara/session.rb +78 -50
  31. data/lib/capybara/session/matchers.rb +69 -0
  32. data/lib/capybara/spec/public/test.js +8 -0
  33. data/lib/capybara/spec/session/all_spec.rb +5 -0
  34. data/lib/capybara/spec/session/assert_current_path.rb +59 -0
  35. data/lib/capybara/spec/session/assert_text.rb +1 -1
  36. data/lib/capybara/spec/session/attach_file_spec.rb +2 -2
  37. data/lib/capybara/spec/session/body_spec.rb +2 -0
  38. data/lib/capybara/spec/session/click_button_spec.rb +17 -8
  39. data/lib/capybara/spec/session/click_link_spec.rb +32 -1
  40. data/lib/capybara/spec/session/current_url_spec.rb +5 -0
  41. data/lib/capybara/spec/session/fill_in_spec.rb +1 -1
  42. data/lib/capybara/spec/session/find_field_spec.rb +17 -0
  43. data/lib/capybara/spec/session/find_spec.rb +14 -5
  44. data/lib/capybara/spec/session/first_spec.rb +24 -0
  45. data/lib/capybara/spec/session/has_current_path_spec.rb +68 -0
  46. data/lib/capybara/spec/session/has_link_spec.rb +3 -0
  47. data/lib/capybara/spec/session/has_text_spec.rb +7 -0
  48. data/lib/capybara/spec/session/node_spec.rb +45 -6
  49. data/lib/capybara/spec/session/reset_session_spec.rb +18 -1
  50. data/lib/capybara/spec/session/save_and_open_page_spec.rb +19 -0
  51. data/lib/capybara/spec/session/save_page_spec.rb +12 -3
  52. data/lib/capybara/spec/session/save_screenshot_spec.rb +23 -0
  53. data/lib/capybara/spec/session/select_spec.rb +12 -0
  54. data/lib/capybara/spec/session/title_spec.rb +2 -2
  55. data/lib/capybara/spec/session/window/become_closed_spec.rb +4 -4
  56. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +8 -0
  57. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +14 -8
  58. data/lib/capybara/spec/session/window/window_spec.rb +24 -4
  59. data/lib/capybara/spec/spec_helper.rb +3 -1
  60. data/lib/capybara/spec/test_app.rb +10 -1
  61. data/lib/capybara/spec/views/form.erb +7 -1
  62. data/lib/capybara/spec/views/path.erb +12 -0
  63. data/lib/capybara/spec/views/with_html.erb +2 -0
  64. data/lib/capybara/spec/views/with_js.erb +9 -1
  65. data/lib/capybara/spec/views/with_title.erb +4 -1
  66. data/lib/capybara/spec/views/with_windows.erb +2 -2
  67. data/lib/capybara/version.rb +1 -1
  68. data/spec/basic_node_spec.rb +1 -0
  69. data/spec/capybara_spec.rb +12 -3
  70. data/spec/dsl_spec.rb +18 -6
  71. data/spec/rack_test_spec.rb +6 -5
  72. data/spec/rspec/matchers_spec.rb +62 -16
  73. data/spec/rspec/views_spec.rb +7 -0
  74. data/spec/selenium_spec.rb +38 -3
  75. data/spec/selenium_spec_chrome.rb +3 -7
  76. metadata +13 -4
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 24bfd6f78b94fddf5e448207bc03748a8bb41062
4
- data.tar.gz: f17b2f16859196a37065620554370b2f157b6160
3
+ metadata.gz: 3213dfe8f170fe23b4374001be7b721b00ce9ff7
4
+ data.tar.gz: aaebf44440aff65f3183728e404bb07660e606e5
5
5
  SHA512:
6
- metadata.gz: 78366458c597a3343d6d78a835be3ef1d115463b7a307ac05c81ffa439b20873be5866a6bb275e48cb047f223911f0674899a85818e4143272f165fdb44ee5e5
7
- data.tar.gz: 8e2ffa766a58fc153510c8a6ba1d403092ce7d4b923a1d75ba934936a94d83fac5df6f421b003b0558382d747d5ea0dcb7ccfe0b380370cc531202917cb9181c
6
+ metadata.gz: 1624de546eb1f2f56b5dfc38a8a4f597aa930d1db0101ce6f712deb7d15abc31845385b4b18971cfe0d76328d45c8c478109af1de1584c86c64a4f6c30dc550c
7
+ data.tar.gz: 21b3438ac351b7a70d642001fb15e429fac7ff3df7eb01f56c04141c5e603bf12dfb1368a408924ee9d6ebb0450cc8397bcab92d4eb9b9242eaac63d7390808e
data/History.md CHANGED
@@ -1,14 +1,41 @@
1
+ # Version 2.5.0
2
+ Release date: 2015-08-25
3
+
4
+ ### Fixed
5
+ * Error message now raised correctly when invalid options passed to 'have_text'/'have_content' [Tom Walpole]
6
+ * Rack-test driver correctly gets document title when elements on the page have nested title elements (SVG) [Tom Walpole]
7
+ * 'save_page' no longer errors when using Capybara.asset_host if the page has no \<head> element [Travis Grathwell]
8
+ * rack-test driver will ignore clicks on links with href starting with '#' or 'javascript:'
9
+
10
+ ### Added
11
+ * has_current_path? and associated asserts/matchers added [Tom Walpole]
12
+ * Implement Node#path in selenium driver [Soutaro Matsumoto]
13
+ * 'using_session' is now nestable [Tom Walpole]
14
+ * 'switch_to_window' will now use waiting behavior for a matching window to appear [Tom Walpole]
15
+ * Capybara.default_wait_time deprecated in favor of Capybara.default_max_wait_time to more clearly explain its purpose [Paul Pettengill]
16
+ * Warning when attempting to select a disabled option
17
+ * Capybara matchers are now available in RSpec view specs by default [Joshua Clayton]
18
+ * 'have_link' and 'click_link' now accept Regexp for href matching [Yaniv Savir]
19
+ * 'find_all' as an alias of 'all' due to collision with RSpec
20
+ * Capybara.wait_on_first_by_default setting (default is false)
21
+ If set to true 'first' will use Capybaras waiting behavior to wait for at least one element to appear by default
22
+ * Capybara waiting behavior uses the monotonic clock if supported to ease restrictions on freezing time in tests [Dmitry Maksyoma, Tom Walpole]
23
+ * Capybara.server_errors setting that allows to configure what type of errors will be raised from the server thread [Tom Walpole]
24
+ * Node#send_keys to allow for sending keypresses directly to elements [Tom Walpole]
25
+ * 'formmethod' attribute support in RackTest driver [Emilia Andrzejewska]
26
+ * Clear field using backspaces in Selenium driver by using `:fill_options => { :clear => :backspace }` [Joe Lencioni]
27
+
1
28
  #Version 2.4.4
2
- Release data: 2014-10-13
29
+ Release date: 2014-10-13
3
30
 
4
- ###Fixed
31
+ ### Fixed
5
32
  * Test for visit behavior updated [Phil Baker]
6
33
  * Removed concurrency prevention in favor of a note in the README - due to load order issues
7
34
 
8
35
  # Version 2.4.3
9
36
  Relase date: 2014-09-21
10
37
 
11
- ###Fixed
38
+ ### Fixed
12
39
  * Update concurrency prevention to match Rails 4.2 behavior
13
40
 
14
41
  # Version 2.4.2
@@ -31,7 +58,7 @@ Release date: 2014-07-03
31
58
  * have_title matcher now supports :wait option [Andrey Botalov]
32
59
  * More descriptive have_text error messages [Andrey Botalov]
33
60
  * New modal API ('accept_alert', 'accept_confirm', 'dismiss_confirm', 'accept_prompt', 'dismiss_prompt') - [Mike Pack, Thomas Walpole]
34
- * Warning when attempting to set contents of a readonly element
61
+ * Warning when attempting to set contents of a readonly element
35
62
  * Suport for and/or compounding of Capybara's RSpec matchers for RSpec 3 [Thomas Walpole]
36
63
  * :fill_options option for 'fill_in' method that propagates to 'set' to allow for driver specific modification of how fields are filled in [Gabriel Sobrinho, Thomas Walpole]
37
64
  * Improved selector/filter description in failure messages [Thomas Walpole]
@@ -309,7 +336,7 @@ Release date: 2012-11-05
309
336
  * `Node#synchronize` method to rerun a block of code if certain errors are raised
310
337
  [Jonas Nicklas]
311
338
  * `Capybara.always_include_port` config option always includes the server port in
312
- URLs when using `visit`. Facilitates testing different domain names`. [Douwe Maan]
339
+ URLs when using `visit`. Facilitates testing different domain names. [Douwe Maan]
313
340
  * Redirect limit for RackTest driver is configurable [Josh Lane]
314
341
  * Server port can be manually specified during initialization of server.
315
342
  [Jonas Nicklas, John Wilger]
data/README.md CHANGED
@@ -12,6 +12,45 @@ through an external gem.
12
12
  **Need help?** Ask on the mailing list (please do not open an issue on
13
13
  GitHub): http://groups.google.com/group/ruby-capybara
14
14
 
15
+ ## Table of contents
16
+
17
+ - [Key benefits](#key-benefits)
18
+ - [Setup](#setup)
19
+ - [Using Capybara with Cucumber](#using-capybara-with-cucumber)
20
+ - [Using Capybara with RSpec](#using-capybara-with-rspec)
21
+ - [Using Capybara with Test::Unit](#using-capybara-with-testunit)
22
+ - [Using Capybara with MiniTest::Spec](#using-capybara-with-minitestspec)
23
+ - [Drivers](#drivers)
24
+ - [Selecting the Driver](#selecting-the-driver)
25
+ - [RackTest](#racktest)
26
+ - [Selenium](#selenium)
27
+ - [Capybara-webkit](#capybara-webkit)
28
+ - [Poltergeist](#poltergeist)
29
+ - [The DSL](#the-dsl)
30
+ - [Navigating](#navigating)
31
+ - [Clicking links and buttons](#clicking-links-and-buttons)
32
+ - [Interacting with forms](#interacting-with-forms)
33
+ - [Querying](#querying)
34
+ - [Finding](#finding)
35
+ - [Scoping](#scoping)
36
+ - [Working with windows](#working-with-windows)
37
+ - [Scripting](#scripting)
38
+ - [Modals](#modals)
39
+ - [Debugging](#debugging)
40
+ - [Matching](#matching)
41
+ - [Exactness](#exactness)
42
+ - [Strategy](#strategy)
43
+ - [Transactions and database setup](#transactions-and-database-setup)
44
+ - [Asynchronous JavaScript (Ajax and friends)](#asynchronous-javascript-ajax-and-friends)
45
+ - [Using the DSL elsewhere](#using-the-dsl-elsewhere)
46
+ - [Calling remote servers](#calling-remote-servers)
47
+ - [Using the sessions manually](#using-the-sessions-manually)
48
+ - [XPath, CSS and selectors](#xpath-css-and-selectors)
49
+ - [Beware the XPath // trap](#beware-the-xpath--trap)
50
+ - [Configuring and adding drivers](#configuring-and-adding-drivers)
51
+ - [Gotchas:](#gotchas)
52
+ - [Development](#development)
53
+
15
54
  ## Key benefits
16
55
 
17
56
  - **No setup** necessary for Rails and Rack application. Works out of the box.
@@ -36,8 +75,8 @@ If the application that you are testing is a Rails app, add this line to your te
36
75
  require 'capybara/rails'
37
76
  ```
38
77
 
39
- Note: In rails 4.0/4.1 The default rails test environment ( config/environments/test.rb ) is not threadsafe - see https://github.com/rails/rails/issues/15089
40
- If you experience random errors about missing constants, adding config.allow_concurrency = false to config/environements/test.rb should solve the issue.
78
+ **Note:** In Rails 4.0/4.1 the default test environment (`config/environments/test.rb`) is [not threadsafe](https://github.com/rails/rails/issues/15089).
79
+ If you experience random errors about missing constants, add `config.allow_concurrency = false` to `config/environments/test.rb`.
41
80
 
42
81
  If the application that you are testing is a Rack app, but not Rails, set Capybara.app to your Rack app:
43
82
 
@@ -102,7 +141,7 @@ You can now write your specs like so:
102
141
  ```ruby
103
142
  describe "the signin process", :type => :feature do
104
143
  before :each do
105
- User.make(:email => 'user@example.com', :password => 'caplin')
144
+ User.make(:email => 'user@example.com', :password => 'password')
106
145
  end
107
146
 
108
147
  it "signs me in" do
@@ -128,7 +167,7 @@ describe 'some stuff which requires js', :js => true do
128
167
  end
129
168
  ```
130
169
 
131
- Finally, Capybara also comes with a built in DSL for creating descriptive acceptance tests:
170
+ Capybara also comes with a built in DSL for creating descriptive acceptance tests:
132
171
 
133
172
  ```ruby
134
173
  feature "Signing in" do
@@ -164,6 +203,20 @@ end
164
203
  `background` is an alias for `before`, `scenario` for `it`, and
165
204
  `given`/`given!` aliases for `let`/`let!`, respectively.
166
205
 
206
+ Finally, Capybara matchers are supported in view specs:
207
+
208
+ ```ruby
209
+ RSpec.describe "todos/show.html.erb", type: :view do
210
+ it "displays the todo title" do
211
+ assign :todo, Todo.new(title: "Buy milk")
212
+
213
+ render
214
+
215
+ expect(rendered).to have_css("header h1", text: "Buy milk")
216
+ end
217
+ end
218
+ ```
219
+
167
220
  ## Using Capybara with Test::Unit
168
221
 
169
222
  * If you are using Rails, add the following code in your `test_helper.rb`
@@ -249,7 +302,7 @@ After/teardown blocks):
249
302
 
250
303
  ```ruby
251
304
  Capybara.current_driver = :webkit # temporarily select different driver
252
- ... tests ...
305
+ # tests here
253
306
  Capybara.use_default_driver # switch back to default driver
254
307
  ```
255
308
 
@@ -325,6 +378,9 @@ any Javascript errors that happen within the page.
325
378
  *A complete reference is available at
326
379
  [rubydoc.info](http://rubydoc.info/github/jnicklas/capybara/master)*.
327
380
 
381
+ **Note: By default Capybara will only locate visible elements. This is because
382
+ a real user would not be able to interact with non-visible elements.**
383
+
328
384
  **Note**: All searches in Capybara are *case sensitive*. This is because
329
385
  Capybara heavily uses XPath, which doesn't support case insensitivity.
330
386
 
@@ -419,7 +475,7 @@ You can also find specific elements, in order to manipulate them:
419
475
 
420
476
  ```ruby
421
477
  find_field('First Name').value
422
- find_link('Hello').visible?
478
+ find_link('Hello', :visible => :all).visible?
423
479
  find_button('Send').click
424
480
 
425
481
  find(:xpath, "//table/tr").click
@@ -670,7 +726,7 @@ looking for that content for a brief time. You can adjust how long this period
670
726
  is (the default is 2 seconds):
671
727
 
672
728
  ```ruby
673
- Capybara.default_wait_time = 5
729
+ Capybara.default_max_wait_time = 5
674
730
  ```
675
731
 
676
732
  Be aware that because of this behaviour, the following two statements are **not**
@@ -896,7 +952,8 @@ additional info about how the underlying driver can be configured.
896
952
  since we're not using Rails' integration testing.
897
953
 
898
954
  * Freezing time: It's common practice to mock out the Time so that features
899
- that depend on the current Date work as expected. This can be problematic,
955
+ that depend on the current Date work as expected. This can be problematic on
956
+ ruby/platform combinations that don't support access to a monotonic process clock,
900
957
  since Capybara's Ajax timing uses the system time, resulting in Capybara
901
958
  never timing out and just hanging when a failure occurs. It's still possible to
902
959
  use gems which allow you to travel in time, rather than freeze time.
@@ -908,6 +965,10 @@ additional info about how the underlying driver can be configured.
908
965
  set `default_url_options` to match the Rails default of
909
966
  `www.example.com`.
910
967
 
968
+ * Server errors will only be raised in the session that initiates the server thread. If you
969
+ are testing for specific server errors and using multiple sessions make sure to test for the
970
+ errors using the initial session (usually :default)
971
+
911
972
  ## Development
912
973
 
913
974
  To set up a development environment, simply do:
@@ -21,8 +21,8 @@ module Capybara
21
21
  class << self
22
22
  attr_accessor :asset_host, :app_host, :run_server, :default_host, :always_include_port
23
23
  attr_accessor :server_port, :exact, :match, :exact_options, :visible_text_only
24
- attr_accessor :default_selector, :default_wait_time, :ignore_hidden_elements
25
- attr_accessor :save_and_open_page_path, :automatic_reload, :raise_server_errors
24
+ attr_accessor :default_selector, :default_max_wait_time, :ignore_hidden_elements
25
+ attr_accessor :save_and_open_page_path, :wait_on_first_by_default, :automatic_reload, :raise_server_errors, :server_errors
26
26
  attr_writer :default_driver, :current_driver, :javascript_driver, :session_name, :server_host
27
27
  attr_accessor :app
28
28
 
@@ -37,22 +37,24 @@ module Capybara
37
37
  #
38
38
  # === Configurable options
39
39
  #
40
- # [app_host = String] The default host to use when giving a relative URL to visit
41
- # [always_include_port = Boolean] Whether the Rack server's port should automatically be inserted into every visited URL (Default: false)
42
- # [asset_host = String] Where dynamic assets are hosted - will be prepended to relative asset locations if present (Default: nil)
43
- # [run_server = Boolean] Whether to start a Rack server for the given Rack app (Default: true)
44
- # [default_selector = :css/:xpath] Methods which take a selector use the given type by default (Default: CSS)
45
- # [default_wait_time = Integer] The number of seconds to wait for asynchronous processes to finish (Default: 2)
46
- # [ignore_hidden_elements = Boolean] Whether to ignore hidden elements on the page (Default: true)
47
- # [automatic_reload = Boolean] Whether to automatically reload elements as Capybara is waiting (Default: true)
48
- # [save_and_open_page_path = String] Where to put pages saved through save_and_open_page (Default: Dir.pwd)
49
- #
40
+ # [app_host = String] The default host to use when giving a relative URL to visit
41
+ # [always_include_port = Boolean] Whether the Rack server's port should automatically be inserted into every visited URL (Default: false)
42
+ # [asset_host = String] Where dynamic assets are hosted - will be prepended to relative asset locations if present (Default: nil)
43
+ # [run_server = Boolean] Whether to start a Rack server for the given Rack app (Default: true)
44
+ # [raise_server_errors = Boolean] Should errors raised in the server be raised in the tests? (Default: true)
45
+ # [server_errors = Array\<Class\>] Error classes that should be raised in the tests if they are raised in the server and Capybara.raise_server_errors is true (Default: [StandardError])
46
+ # [default_selector = :css/:xpath] Methods which take a selector use the given type by default (Default: :css)
47
+ # [default_max_wait_time = Numeric] The maximum number of seconds to wait for asynchronous processes to finish (Default: 2)
48
+ # [ignore_hidden_elements = Boolean] Whether to ignore hidden elements on the page (Default: true)
49
+ # [automatic_reload = Boolean] Whether to automatically reload elements as Capybara is waiting (Default: true)
50
+ # [save_and_open_page_path = String] Where to put pages saved through save_and_open_page (Default: Dir.pwd)
51
+ # [wait_on_first_by_default = Boolean] Whether Node#first defaults to Capybara waiting behavior for at least 1 element to match (Default: false)
50
52
  # === DSL Options
51
53
  #
52
54
  # when using capybara/dsl, the following options are also available:
53
55
  #
54
- # [default_driver = Symbol] The name of the driver to use by default. (Default: :rack_test)
55
- # [javascript_driver = Symbol] The name of a driver to use for JavaScript enabled tests. (Default: :selenium)
56
+ # [default_driver = Symbol] The name of the driver to use by default. (Default: :rack_test)
57
+ # [javascript_driver = Symbol] The name of a driver to use for JavaScript enabled tests. (Default: :selenium)
56
58
  #
57
59
  def configure
58
60
  yield self
@@ -63,12 +65,12 @@ module Capybara
63
65
  # Register a new driver for Capybara.
64
66
  #
65
67
  # Capybara.register_driver :rack_test do |app|
66
- # Capybara::Driver::RackTest.new(app)
68
+ # Capybara::RackTest::Driver.new(app)
67
69
  # end
68
70
  #
69
71
  # @param [Symbol] name The name of the new driver
70
72
  # @yield [app] This block takes a rack app and returns a Capybara driver
71
- # @yieldparam [<Rack>] app The rack application that this driver runs agains. May be nil.
73
+ # @yieldparam [<Rack>] app The rack application that this driver runs against. May be nil.
72
74
  # @yieldreturn [Capybara::Driver::Base] A Capybara driver instance
73
75
  #
74
76
  def register_driver(name, &block)
@@ -135,9 +137,9 @@ module Capybara
135
137
  ##
136
138
  #
137
139
  # Wraps the given string, which should contain an HTML document or fragment
138
- # in a {Capybara::Node::Simple} which exposes all {Capybara::Node::Matchers} and
139
- # {Capybara::Node::Finders}. This allows you to query any string containing
140
- # HTML in the exact same way you would query the current document in a Capybara
140
+ # in a {Capybara::Node::Simple} which exposes all {Capybara::Node::Matchers},
141
+ # {Capybara::Node::Finders} and {Capybara::Node::DocumentMatchers}. This allows you to query
142
+ # any string containing HTML in the exact same way you would query the current document in a Capybara
141
143
  # session. For example:
142
144
  #
143
145
  # node = Capybara.string <<-HTML
@@ -149,8 +151,8 @@ module Capybara
149
151
  #
150
152
  # node.find('#projects').text # => 'Projects'
151
153
  # node.has_selector?('li#home', :text => 'Home')
152
- # node.has_selector?(:projects)
153
- # node.find('ul').find('li').text # => 'Home'
154
+ # node.has_selector?('#projects')
155
+ # node.find('ul').find('li:first-child').text # => 'Home'
154
156
  #
155
157
  # @param [String] html An html fragment or document
156
158
  # @return [Capybara::Node::Simple] A node which has Capybara's finders and matchers
@@ -231,11 +233,11 @@ module Capybara
231
233
  # Yield a block using a specific wait time
232
234
  #
233
235
  def using_wait_time(seconds)
234
- previous_wait_time = Capybara.default_wait_time
235
- Capybara.default_wait_time = seconds
236
+ previous_wait_time = Capybara.default_max_wait_time
237
+ Capybara.default_max_wait_time = seconds
236
238
  yield
237
239
  ensure
238
- Capybara.default_wait_time = previous_wait_time
240
+ Capybara.default_max_wait_time = previous_wait_time
239
241
  end
240
242
 
241
243
  ##
@@ -273,10 +275,11 @@ module Capybara
273
275
  # Yield a block using a specific session name.
274
276
  #
275
277
  def using_session(name)
278
+ previous_session_name = self.session_name
276
279
  self.session_name = name
277
280
  yield
278
281
  ensure
279
- self.session_name = :default
282
+ self.session_name = previous_session_name
280
283
  end
281
284
 
282
285
  ##
@@ -293,14 +296,28 @@ module Capybara
293
296
  end
294
297
  end
295
298
  end
299
+
300
+ # @deprecated Use default_max_wait_time instead
301
+ def default_wait_time
302
+ deprecate('default_wait_time', 'default_max_wait_time', true)
303
+ default_max_wait_time
304
+ end
305
+
306
+ # @deprecated Use default_max_wait_time= instead
307
+ def default_wait_time=(t)
308
+ deprecate('default_wait_time=', 'default_max_wait_time=')
309
+ self.default_max_wait_time = t
310
+ end
296
311
 
297
312
  def included(base)
298
313
  base.send(:include, Capybara::DSL)
299
314
  warn "`include Capybara` is deprecated. Please use `include Capybara::DSL` instead."
300
315
  end
301
316
 
302
- def deprecate(method, alternate_method)
303
- warn "DEPRECATED: ##{method} is deprecated, please use ##{alternate_method} instead"
317
+ def deprecate(method, alternate_method, once=false)
318
+ @deprecation_notified ||= {}
319
+ warn "DEPRECATED: ##{method} is deprecated, please use ##{alternate_method} instead" unless once and @deprecation_notified[method]
320
+ @deprecation_notified[method]=true
304
321
  end
305
322
 
306
323
  private
@@ -312,6 +329,7 @@ module Capybara
312
329
 
313
330
  self.default_driver = nil
314
331
  self.current_driver = nil
332
+ self.server_host = nil
315
333
 
316
334
  module Driver; end
317
335
  module RackTest; end
@@ -330,7 +348,8 @@ module Capybara
330
348
  require 'capybara/query'
331
349
  require 'capybara/queries/text_query'
332
350
  require 'capybara/queries/title_query'
333
-
351
+ require 'capybara/queries/current_path_query'
352
+
334
353
  require 'capybara/node/finders'
335
354
  require 'capybara/node/matchers'
336
355
  require 'capybara/node/actions'
@@ -358,14 +377,16 @@ Capybara.configure do |config|
358
377
  config.run_server = true
359
378
  config.server {|app, port| Capybara.run_default_server(app, port)}
360
379
  config.default_selector = :css
361
- config.default_wait_time = 2
380
+ config.default_max_wait_time = 2
362
381
  config.ignore_hidden_elements = true
363
382
  config.default_host = "http://www.example.com"
364
383
  config.automatic_reload = true
365
384
  config.match = :smart
366
385
  config.exact = false
367
386
  config.raise_server_errors = true
387
+ config.server_errors = [StandardError]
368
388
  config.visible_text_only = false
389
+ config.wait_on_first_by_default = false
369
390
  end
370
391
 
371
392
  Capybara.register_driver :rack_test do |app|
@@ -133,4 +133,8 @@ class Capybara::Driver::Base
133
133
  def needs_server?
134
134
  false
135
135
  end
136
+
137
+ def browser_initialized?
138
+ true
139
+ end
136
140
  end
@@ -50,6 +50,10 @@ module Capybara
50
50
  raise NotImplementedError
51
51
  end
52
52
 
53
+ def send_keys(*args)
54
+ raise NotImplementedError
55
+ end
56
+
53
57
  def hover
54
58
  raise NotImplementedError
55
59
  end
@@ -40,12 +40,14 @@ module Capybara
40
40
  # @return [String] The modified HTML code
41
41
  #
42
42
  def inject_asset_host(html)
43
- if Capybara.asset_host && Nokogiri::HTML(html).css("base").empty?
44
- match = html.match(/<head[^<]*?>/)
45
- html.clone.insert match.end(0), "<base href='#{Capybara.asset_host}' />"
46
- else
47
- html
43
+ if Capybara.asset_host && Nokogiri::HTML(html).css("base").empty?
44
+ match = html.match(/<head[^<]*?>/)
45
+ if match
46
+ return html.clone.insert match.end(0), "<base href='#{Capybara.asset_host}' />"
47
+ end
48
48
  end
49
+
50
+ html
49
51
  end
50
52
 
51
53
  ##
@@ -124,5 +126,15 @@ module Capybara
124
126
  plural
125
127
  end
126
128
  end
129
+
130
+ if defined?(Process::CLOCK_MONOTONIC)
131
+ def monotonic_time
132
+ Process.clock_gettime Process::CLOCK_MONOTONIC
133
+ end
134
+ else
135
+ def monotonic_time
136
+ Time.now.to_f
137
+ end
138
+ end
127
139
  end
128
140
  end