capybara 2.18.0 → 3.0.0.rc1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (168) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +26 -1
  3. data/README.md +12 -12
  4. data/lib/capybara.rb +13 -25
  5. data/lib/capybara/config.rb +11 -57
  6. data/lib/capybara/cucumber.rb +2 -3
  7. data/lib/capybara/driver/base.rb +5 -16
  8. data/lib/capybara/driver/node.rb +5 -4
  9. data/lib/capybara/dsl.rb +1 -0
  10. data/lib/capybara/helpers.rb +16 -28
  11. data/lib/capybara/minitest.rb +139 -138
  12. data/lib/capybara/minitest/spec.rb +15 -14
  13. data/lib/capybara/node/actions.rb +59 -81
  14. data/lib/capybara/node/base.rb +11 -18
  15. data/lib/capybara/node/document.rb +2 -2
  16. data/lib/capybara/node/document_matchers.rb +8 -8
  17. data/lib/capybara/node/element.rb +30 -40
  18. data/lib/capybara/node/finders.rb +62 -70
  19. data/lib/capybara/node/matchers.rb +48 -71
  20. data/lib/capybara/node/simple.rb +11 -17
  21. data/lib/capybara/queries/ancestor_query.rb +4 -6
  22. data/lib/capybara/queries/base_query.rb +18 -17
  23. data/lib/capybara/queries/current_path_query.rb +8 -24
  24. data/lib/capybara/queries/match_query.rb +3 -7
  25. data/lib/capybara/queries/selector_query.rb +92 -95
  26. data/lib/capybara/queries/sibling_query.rb +4 -4
  27. data/lib/capybara/queries/text_query.rb +37 -34
  28. data/lib/capybara/queries/title_query.rb +8 -11
  29. data/lib/capybara/rack_test/browser.rb +15 -18
  30. data/lib/capybara/rack_test/css_handlers.rb +6 -4
  31. data/lib/capybara/rack_test/driver.rb +6 -10
  32. data/lib/capybara/rack_test/form.rb +50 -40
  33. data/lib/capybara/rack_test/node.rb +70 -56
  34. data/lib/capybara/rails.rb +2 -6
  35. data/lib/capybara/result.rb +22 -22
  36. data/lib/capybara/rspec.rb +5 -10
  37. data/lib/capybara/rspec/compound.rb +5 -10
  38. data/lib/capybara/rspec/features.rb +17 -48
  39. data/lib/capybara/rspec/matcher_proxies.rb +31 -15
  40. data/lib/capybara/rspec/matchers.rb +70 -60
  41. data/lib/capybara/selector.rb +129 -117
  42. data/lib/capybara/selector/css.rb +6 -11
  43. data/lib/capybara/selector/filter.rb +1 -17
  44. data/lib/capybara/selector/filter_set.rb +17 -14
  45. data/lib/capybara/selector/filters/base.rb +7 -6
  46. data/lib/capybara/selector/filters/expression_filter.rb +6 -23
  47. data/lib/capybara/selector/filters/node_filter.rb +2 -12
  48. data/lib/capybara/selector/selector.rb +27 -33
  49. data/lib/capybara/selenium/driver.rb +113 -127
  50. data/lib/capybara/selenium/node.rb +148 -113
  51. data/lib/capybara/server.rb +3 -2
  52. data/lib/capybara/session.rb +137 -223
  53. data/lib/capybara/session/config.rb +47 -67
  54. data/lib/capybara/session/matchers.rb +8 -7
  55. data/lib/capybara/spec/public/test.js +26 -4
  56. data/lib/capybara/spec/session/accept_alert_spec.rb +1 -0
  57. data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -2
  58. data/lib/capybara/spec/session/accept_prompt_spec.rb +1 -0
  59. data/lib/capybara/spec/session/all_spec.rb +31 -18
  60. data/lib/capybara/spec/session/ancestor_spec.rb +2 -4
  61. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +6 -5
  62. data/lib/capybara/spec/session/assert_current_path.rb +12 -11
  63. data/lib/capybara/spec/session/assert_selector.rb +1 -0
  64. data/lib/capybara/spec/session/assert_text.rb +18 -17
  65. data/lib/capybara/spec/session/assert_title.rb +1 -0
  66. data/lib/capybara/spec/session/attach_file_spec.rb +14 -13
  67. data/lib/capybara/spec/session/body_spec.rb +1 -0
  68. data/lib/capybara/spec/session/check_spec.rb +7 -6
  69. data/lib/capybara/spec/session/choose_spec.rb +5 -4
  70. data/lib/capybara/spec/session/click_button_spec.rb +20 -28
  71. data/lib/capybara/spec/session/click_link_or_button_spec.rb +8 -7
  72. data/lib/capybara/spec/session/click_link_spec.rb +8 -7
  73. data/lib/capybara/spec/session/current_scope_spec.rb +4 -3
  74. data/lib/capybara/spec/session/current_url_spec.rb +7 -6
  75. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +1 -1
  76. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +1 -0
  77. data/lib/capybara/spec/session/element/assert_match_selector.rb +1 -1
  78. data/lib/capybara/spec/session/element/match_xpath_spec.rb +1 -1
  79. data/lib/capybara/spec/session/element/matches_selector_spec.rb +5 -5
  80. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +3 -2
  81. data/lib/capybara/spec/session/evaluate_script_spec.rb +4 -3
  82. data/lib/capybara/spec/session/execute_script_spec.rb +4 -3
  83. data/lib/capybara/spec/session/fill_in_spec.rb +6 -5
  84. data/lib/capybara/spec/session/find_button_spec.rb +4 -3
  85. data/lib/capybara/spec/session/find_by_id_spec.rb +2 -1
  86. data/lib/capybara/spec/session/find_field_spec.rb +8 -14
  87. data/lib/capybara/spec/session/find_link_spec.rb +6 -5
  88. data/lib/capybara/spec/session/find_spec.rb +37 -31
  89. data/lib/capybara/spec/session/first_spec.rb +60 -33
  90. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +2 -1
  91. data/lib/capybara/spec/session/frame/within_frame_spec.rb +9 -16
  92. data/lib/capybara/spec/session/go_back_spec.rb +1 -0
  93. data/lib/capybara/spec/session/go_forward_spec.rb +1 -0
  94. data/lib/capybara/spec/session/has_all_selectors_spec.rb +15 -15
  95. data/lib/capybara/spec/session/has_button_spec.rb +2 -1
  96. data/lib/capybara/spec/session/has_css_spec.rb +3 -2
  97. data/lib/capybara/spec/session/has_current_path_spec.rb +12 -28
  98. data/lib/capybara/spec/session/has_field_spec.rb +4 -3
  99. data/lib/capybara/spec/session/has_link_spec.rb +1 -0
  100. data/lib/capybara/spec/session/has_none_selectors_spec.rb +17 -17
  101. data/lib/capybara/spec/session/has_select_spec.rb +30 -29
  102. data/lib/capybara/spec/session/has_selector_spec.rb +5 -4
  103. data/lib/capybara/spec/session/has_table_spec.rb +2 -1
  104. data/lib/capybara/spec/session/has_text_spec.rb +6 -5
  105. data/lib/capybara/spec/session/has_title_spec.rb +1 -0
  106. data/lib/capybara/spec/session/has_xpath_spec.rb +1 -0
  107. data/lib/capybara/spec/session/headers.rb +2 -1
  108. data/lib/capybara/spec/session/html_spec.rb +1 -0
  109. data/lib/capybara/spec/session/node_spec.rb +91 -56
  110. data/lib/capybara/spec/session/node_wrapper_spec.rb +36 -0
  111. data/lib/capybara/spec/session/refresh_spec.rb +4 -2
  112. data/lib/capybara/spec/session/reset_session_spec.rb +1 -0
  113. data/lib/capybara/spec/session/response_code.rb +1 -0
  114. data/lib/capybara/spec/session/save_and_open_page_spec.rb +1 -0
  115. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +6 -11
  116. data/lib/capybara/spec/session/save_page_spec.rb +1 -17
  117. data/lib/capybara/spec/session/save_screenshot_spec.rb +1 -1
  118. data/lib/capybara/spec/session/select_spec.rb +20 -20
  119. data/lib/capybara/spec/session/selectors_spec.rb +2 -2
  120. data/lib/capybara/spec/session/sibling_spec.rb +1 -1
  121. data/lib/capybara/spec/session/text_spec.rb +1 -0
  122. data/lib/capybara/spec/session/title_spec.rb +1 -1
  123. data/lib/capybara/spec/session/uncheck_spec.rb +4 -3
  124. data/lib/capybara/spec/session/unselect_spec.rb +6 -5
  125. data/lib/capybara/spec/session/visit_spec.rb +9 -3
  126. data/lib/capybara/spec/session/window/become_closed_spec.rb +2 -1
  127. data/lib/capybara/spec/session/window/current_window_spec.rb +1 -0
  128. data/lib/capybara/spec/session/window/open_new_window_spec.rb +1 -0
  129. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +2 -1
  130. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +2 -1
  131. data/lib/capybara/spec/session/window/window_spec.rb +12 -12
  132. data/lib/capybara/spec/session/window/windows_spec.rb +2 -3
  133. data/lib/capybara/spec/session/window/within_window_spec.rb +13 -68
  134. data/lib/capybara/spec/session/within_spec.rb +1 -0
  135. data/lib/capybara/spec/spec_helper.rb +26 -18
  136. data/lib/capybara/spec/test_app.rb +8 -9
  137. data/lib/capybara/spec/views/form.erb +1 -0
  138. data/lib/capybara/spec/views/with_html.erb +3 -1
  139. data/lib/capybara/spec/views/within_frames.erb +4 -1
  140. data/lib/capybara/version.rb +2 -1
  141. data/lib/capybara/window.rb +6 -10
  142. data/spec/basic_node_spec.rb +1 -0
  143. data/spec/capybara_spec.rb +9 -32
  144. data/spec/dsl_spec.rb +5 -13
  145. data/spec/filter_set_spec.rb +5 -4
  146. data/spec/fixtures/selenium_driver_rspec_failure.rb +2 -1
  147. data/spec/fixtures/selenium_driver_rspec_success.rb +3 -2
  148. data/spec/minitest_spec.rb +4 -3
  149. data/spec/minitest_spec_spec.rb +3 -2
  150. data/spec/per_session_config_spec.rb +9 -8
  151. data/spec/rack_test_spec.rb +21 -20
  152. data/spec/result_spec.rb +17 -16
  153. data/spec/rspec/features_spec.rb +17 -14
  154. data/spec/rspec/scenarios_spec.rb +5 -7
  155. data/spec/rspec/shared_spec_matchers.rb +96 -99
  156. data/spec/rspec/views_spec.rb +2 -1
  157. data/spec/rspec_matchers_spec.rb +19 -2
  158. data/spec/rspec_spec.rb +11 -15
  159. data/spec/selector_spec.rb +5 -6
  160. data/spec/selenium_spec_chrome.rb +7 -4
  161. data/spec/selenium_spec_marionette.rb +26 -12
  162. data/spec/server_spec.rb +33 -33
  163. data/spec/session_spec.rb +2 -1
  164. data/spec/shared_selenium_session.rb +27 -21
  165. data/spec/spec_helper.rb +2 -5
  166. metadata +66 -87
  167. data/lib/capybara/query.rb +0 -7
  168. data/spec/selenium_spec_firefox.rb +0 -68
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Capybara
3
4
  module Node
4
5
  module Finders
5
-
6
6
  ##
7
7
  #
8
8
  # Find an {Capybara::Node::Element} based on the given arguments. +find+ will raise an error if the element
@@ -28,13 +28,9 @@ module Capybara
28
28
  # @return [Capybara::Node::Element] The found element
29
29
  # @raise [Capybara::ElementNotFound] If the element can't be found before time expires
30
30
  #
31
- def find(*args, &optional_filter_block)
32
- if args.last.is_a? Hash
33
- args.last[:session_options] = session_options
34
- else
35
- args.push(session_options: session_options)
36
- end
37
- synced_resolve Capybara::Queries::SelectorQuery.new(*args, &optional_filter_block)
31
+ def find(*args, **options, &optional_filter_block)
32
+ options[:session_options] = session_options
33
+ synced_resolve Capybara::Queries::SelectorQuery.new(*args, options, &optional_filter_block)
38
34
  end
39
35
 
40
36
  ##
@@ -57,13 +53,9 @@ module Capybara
57
53
  # @return [Capybara::Node::Element] The found element
58
54
  # @raise [Capybara::ElementNotFound] If the element can't be found before time expires
59
55
  #
60
- def ancestor(*args, &optional_filter_block)
61
- if args.last.is_a? Hash
62
- args.last[:session_options] = session_options
63
- else
64
- args.push(session_options: session_options)
65
- end
66
- synced_resolve Capybara::Queries::AncestorQuery.new(*args, &optional_filter_block)
56
+ def ancestor(*args, **options, &optional_filter_block)
57
+ options[:session_options] = session_options
58
+ synced_resolve Capybara::Queries::AncestorQuery.new(*args, **options, &optional_filter_block)
67
59
  end
68
60
 
69
61
  ##
@@ -87,13 +79,9 @@ module Capybara
87
79
  # @return [Capybara::Node::Element] The found element
88
80
  # @raise [Capybara::ElementNotFound] If the element can't be found before time expires
89
81
  #
90
- def sibling(*args, &optional_filter_block)
91
- if args.last.is_a? Hash
92
- args.last[:session_options] = session_options
93
- else
94
- args.push(session_options: session_options)
95
- end
96
- synced_resolve Capybara::Queries::SiblingQuery.new(*args, &optional_filter_block)
82
+ def sibling(*args, **options, &optional_filter_block)
83
+ options[:session_options] = session_options
84
+ synced_resolve Capybara::Queries::SiblingQuery.new(*args, **options, &optional_filter_block)
97
85
  end
98
86
 
99
87
  ##
@@ -123,11 +111,9 @@ module Capybara
123
111
  # @return [Capybara::Node::Element] The found element
124
112
  #
125
113
 
126
- def find_field(locator=nil, options={}, &optional_filter_block)
127
- locator, options = nil, locator if locator.is_a? Hash
114
+ def find_field(locator = nil, **options, &optional_filter_block)
128
115
  find(:field, locator, options, &optional_filter_block)
129
116
  end
130
- alias_method :field_labeled, :find_field
131
117
 
132
118
  ##
133
119
  #
@@ -145,8 +131,7 @@ module Capybara
145
131
  # @option options [String, Array<String>] class Match links that match the class(es) provided
146
132
  # @return [Capybara::Node::Element] The found element
147
133
  #
148
- def find_link(locator=nil, options={}, &optional_filter_block)
149
- locator, options = nil, locator if locator.is_a? Hash
134
+ def find_link(locator = nil, **options, &optional_filter_block)
150
135
  find(:link, locator, options, &optional_filter_block)
151
136
  end
152
137
 
@@ -174,8 +159,7 @@ module Capybara
174
159
  # @option options [String, Array<String>] class Match buttons that match the class(es) provided
175
160
  # @return [Capybara::Node::Element] The found element
176
161
  #
177
- def find_button(locator=nil, options={}, &optional_filter_block)
178
- locator, options = nil, locator if locator.is_a? Hash
162
+ def find_button(locator = nil, **options, &optional_filter_block)
179
163
  find(:button, locator, options, &optional_filter_block)
180
164
  end
181
165
 
@@ -189,7 +173,7 @@ module Capybara
189
173
  #
190
174
  # @return [Capybara::Node::Element] The found element
191
175
  #
192
- def find_by_id(id, options={}, &optional_filter_block)
176
+ def find_by_id(id, **options, &optional_filter_block)
193
177
  find(:id, id, options, &optional_filter_block)
194
178
  end
195
179
 
@@ -221,10 +205,11 @@ module Capybara
221
205
  # page.all('a', text: 'Home')
222
206
  # page.all('#menu li', visible: true)
223
207
  #
224
- # By default if no elements are found, an empty array is returned;
225
- # however, expectations can be set on the number of elements to be found which
226
- # will trigger Capybara's waiting behavior for the expectations to match.The
227
- # expectations can be set using
208
+ # By default Capybara's waiting behavior will wait up to `Capybara.default_max_wait_time`
209
+ # seconds for matching elements to be available and then return an empty result if none
210
+ # are available. It is possible to set expectations on the number of results located and
211
+ # Capybara will raise an exception if the number of elements located don't satisfy the
212
+ # specified conditions. The expectations can be set using
228
213
  #
229
214
  # page.assert_selector('p#foo', count: 4)
230
215
  # page.assert_selector('p#foo', maximum: 10)
@@ -235,9 +220,9 @@ module Capybara
235
220
  # count matching.
236
221
  #
237
222
  # @param [Symbol] kind Optional selector type (:css, :xpath, :field, etc.) - Defaults to Capybara.default_selector
238
- # @param [String] locator The selector
223
+ # @param [String] locator The locator for the specified selector
239
224
  # @option options [String, Regexp] text Only find elements which contain this text or match this regexp
240
- # @option options [String, Boolean] exact_text (Capybara.exact_text) When String the string the elements contained text must match exactly, when Boolean controls whether the :text option must match exactly
225
+ # @option options [String, Boolean] exact_text (Capybara.exact_text) When String the elements contained text must match exactly, when Boolean controls whether the :text option must match exactly
241
226
  # @option options [Boolean, Symbol] visible Only find elements with the specified visibility:
242
227
  # * true - only finds visible elements.
243
228
  # * false - finds invisible _and_ visible elements.
@@ -249,24 +234,28 @@ module Capybara
249
234
  # @option options [Integer] minimum Minimum number of matches that are expected to be found
250
235
  # @option options [Range] between Number of matches found must be within the given range
251
236
  # @option options [Boolean] exact Control whether `is` expressions in the given XPath match exactly or partially
252
- # @option options [Integer] wait (Capybara.default_max_wait_time) The time to wait for element count expectations to become true
237
+ # @option options [Integer, false] wait (Capybara.default_max_wait_time) The time to wait for matching elements to become available
253
238
  # @overload all([kind = Capybara.default_selector], locator = nil, options = {})
254
239
  # @overload all([kind = Capybara.default_selector], locator = nil, options = {}, &filter_block)
255
240
  # @yieldparam element [Capybara::Node::Element] The element being considered for inclusion in the results
256
241
  # @yieldreturn [Boolean] Should the element be considered in the results?
257
242
  # @return [Capybara::Result] A collection of found elements
258
- #
259
- def all(*args, &optional_filter_block)
260
- if args.last.is_a? Hash
261
- args.last[:session_options] = session_options
262
- else
263
- args.push(session_options: session_options)
264
- end
265
- query = Capybara::Queries::SelectorQuery.new(*args, &optional_filter_block)
266
- synchronize(query.wait) do
267
- result = query.resolve_for(self)
268
- raise Capybara::ExpectationNotMet, result.failure_message unless result.matches_count?
269
- result
243
+ # @raise [Capybara::ExpectationNotMet] The number of elements found doesn't match the specified conditions
244
+ def all(*args, **options, &optional_filter_block)
245
+ minimum_specified = options_include_minimum?(options)
246
+ options = { minimum: 1 }.merge(options) unless minimum_specified
247
+ options[:session_options] = session_options
248
+ query = Capybara::Queries::SelectorQuery.new(*args.push(options), &optional_filter_block)
249
+ result = nil
250
+ begin
251
+ synchronize(query.wait) do
252
+ result = query.resolve_for(self)
253
+ raise Capybara::ExpectationNotMet, result.failure_message unless result.matches_count?
254
+ result
255
+ end
256
+ rescue Capybara::ExpectationNotMet
257
+ raise if minimum_specified || (result.compare_count == 1)
258
+ Result.new([], nil)
270
259
  end
271
260
  end
272
261
  alias_method :find_all, :all
@@ -274,48 +263,51 @@ module Capybara
274
263
  ##
275
264
  #
276
265
  # Find the first element on the page matching the given selector
277
- # and options, or nil if no element matches. By default no waiting
278
- # behavior occurs, however if {Capybara.wait_on_first_by_default} is set to true
279
- # it will trigger Capybara's waiting behavior for a minimum of 1 matching element to be found and
280
- # return the first. Waiting behavior can also be triggered by passing in any of the count
281
- # expectation options.
266
+ # and options. By default `first` will wait up to `Capybara.default_max_wait_time`
267
+ # seconds for matching elements to appear and then raise an error if no matching
268
+ # element is found, or `nil` if the provided count options allow for empty results.
282
269
  #
283
270
  # @overload first([kind], locator, options)
284
271
  # @param [:css, :xpath] kind The type of selector
285
272
  # @param [String] locator The selector
286
273
  # @param [Hash] options Additional options; see {#all}
287
274
  # @return [Capybara::Node::Element] The found element or nil
275
+ # @raise [Capybara::ElementNotFound] If element(s) matching the provided options can't be found before time expires
288
276
  #
289
- def first(*args, &optional_filter_block)
290
- if session_options.wait_on_first_by_default
291
- options = if args.last.is_a?(Hash) then args.pop.dup else {} end
292
- args.push({minimum: 1}.merge(options))
293
- end
294
- all(*args, &optional_filter_block).first
295
- rescue Capybara::ExpectationNotMet
296
- nil
277
+ def first(*args, **options, &optional_filter_block)
278
+ options = { minimum: 1 }.merge(options) unless options_include_minimum?(options)
279
+ all(*args, **options, &optional_filter_block).first
297
280
  end
298
281
 
299
- private
282
+ private
300
283
 
301
284
  def synced_resolve(query)
302
285
  synchronize(query.wait) do
303
- if (query.match == :smart or query.match == :prefer_exact)
286
+ if prefer_exact?(query)
304
287
  result = query.resolve_for(self, true)
305
288
  result = query.resolve_for(self, false) if result.empty? && query.supports_exact? && !query.exact?
306
289
  else
307
290
  result = query.resolve_for(self)
308
291
  end
309
292
 
310
- if query.match == :one or query.match == :smart and result.size > 1
311
- raise Capybara::Ambiguous.new("Ambiguous match, found #{result.size} elements matching #{query.description}")
312
- end
313
- if result.empty?
314
- raise Capybara::ElementNotFound.new("Unable to find #{query.description}")
315
- end
293
+ raise Capybara::Ambiguous, "Ambiguous match, found #{result.size} elements matching #{query.description}" if ambiguous?(query, result)
294
+ raise Capybara::ElementNotFound, "Unable to find #{query.description}" if result.empty?
295
+
316
296
  result.first
317
297
  end.tap(&:allow_reload!)
318
298
  end
299
+
300
+ def ambiguous?(query, result)
301
+ query.match == :one or query.match == :smart and result.size > 1
302
+ end
303
+
304
+ def prefer_exact?(query)
305
+ query.match == :smart or query.match == :prefer_exact
306
+ end
307
+
308
+ def options_include_minimum?(opts)
309
+ %i[count minimum between].any? { |k| opts.key?(k) }
310
+ end
319
311
  end
320
312
  end
321
313
  end
@@ -1,8 +1,8 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  module Capybara
3
4
  module Node
4
5
  module Matchers
5
-
6
6
  ##
7
7
  #
8
8
  # Checks if a given selector is on the page or a descendant of the current node.
@@ -39,7 +39,7 @@ module Capybara
39
39
  def has_selector?(*args, &optional_filter_block)
40
40
  assert_selector(*args, &optional_filter_block)
41
41
  rescue Capybara::ExpectationNotMet
42
- return false
42
+ false
43
43
  end
44
44
 
45
45
  ##
@@ -53,7 +53,7 @@ module Capybara
53
53
  def has_no_selector?(*args, &optional_filter_block)
54
54
  assert_no_selector(*args, &optional_filter_block)
55
55
  rescue Capybara::ExpectationNotMet
56
- return false
56
+ false
57
57
  end
58
58
 
59
59
  ##
@@ -91,7 +91,7 @@ module Capybara
91
91
  #
92
92
  def assert_selector(*args, &optional_filter_block)
93
93
  _verify_selector_result(args, optional_filter_block) do |result, query|
94
- unless result.matches_count? && ((!result.empty?) || query.expects_none?)
94
+ unless result.matches_count? && (!result.empty? || query.expects_none?)
95
95
  raise Capybara::ExpectationNotMet, result.failure_message
96
96
  end
97
97
  end
@@ -112,10 +112,8 @@ module Capybara
112
112
  #
113
113
  # @overload assert_all_of_selectors([kind = Capybara.default_selector], *locators, options = {})
114
114
  #
115
- def assert_all_of_selectors(*args, &optional_filter_block)
116
- options = if args.last.is_a?(Hash) then args.pop.dup else {} end
117
- selector = if args.first.is_a?(Symbol) then args.shift else session_options.default_selector end
118
- wait = options.fetch(:wait, session_options.default_max_wait_time)
115
+ def assert_all_of_selectors(*args, wait: session_options.default_max_wait_time, **options, &optional_filter_block)
116
+ selector = args.first.is_a?(Symbol) ? args.shift : session_options.default_selector
119
117
  synchronize(wait) do
120
118
  args.each do |locator|
121
119
  assert_selector(selector, locator, options, &optional_filter_block)
@@ -138,10 +136,8 @@ module Capybara
138
136
  #
139
137
  # @overload assert_none_of_selectors([kind = Capybara.default_selector], *locators, options = {})
140
138
  #
141
- def assert_none_of_selectors(*args, &optional_filter_block)
142
- options = if args.last.is_a?(Hash) then args.pop.dup else {} end
143
- selector = if args.first.is_a?(Symbol) then args.shift else session_options.default_selector end
144
- wait = options.fetch(:wait, session_options.default_max_wait_time)
139
+ def assert_none_of_selectors(*args, wait: session_options.default_max_wait_time, **options, &optional_filter_block)
140
+ selector = args.first.is_a?(Symbol) ? args.shift : session_options.default_selector
145
141
  synchronize(wait) do
146
142
  args.each do |locator|
147
143
  assert_no_selector(selector, locator, options, &optional_filter_block)
@@ -167,7 +163,7 @@ module Capybara
167
163
  #
168
164
  def assert_no_selector(*args, &optional_filter_block)
169
165
  _verify_selector_result(args, optional_filter_block) do |result, query|
170
- if result.matches_count? && ((!result.empty?) || query.expects_none?)
166
+ if result.matches_count? && (!result.empty? || query.expects_none?)
171
167
  raise Capybara::ExpectationNotMet, result.negative_failure_message
172
168
  end
173
169
  end
@@ -203,7 +199,7 @@ module Capybara
203
199
  # @option options [Integer] :count (nil) Number of times the expression should occur
204
200
  # @return [Boolean] If the expression exists
205
201
  #
206
- def has_xpath?(path, options={}, &optional_filter_block)
202
+ def has_xpath?(path, **options, &optional_filter_block)
207
203
  has_selector?(:xpath, path, options, &optional_filter_block)
208
204
  end
209
205
 
@@ -215,7 +211,7 @@ module Capybara
215
211
  # @param (see Capybara::Node::Finders#has_xpath?)
216
212
  # @return [Boolean]
217
213
  #
218
- def has_no_xpath?(path, options={}, &optional_filter_block)
214
+ def has_no_xpath?(path, **options, &optional_filter_block)
219
215
  has_no_selector?(:xpath, path, options, &optional_filter_block)
220
216
  end
221
217
 
@@ -242,7 +238,7 @@ module Capybara
242
238
  # @option options [Integer] :count (nil) Number of times the selector should occur
243
239
  # @return [Boolean] If the selector exists
244
240
  #
245
- def has_css?(path, options={}, &optional_filter_block)
241
+ def has_css?(path, **options, &optional_filter_block)
246
242
  has_selector?(:css, path, options, &optional_filter_block)
247
243
  end
248
244
 
@@ -254,7 +250,7 @@ module Capybara
254
250
  # @param (see Capybara::Node::Finders#has_css?)
255
251
  # @return [Boolean]
256
252
  #
257
- def has_no_css?(path, options={}, &optional_filter_block)
253
+ def has_no_css?(path, **options, &optional_filter_block)
258
254
  has_no_selector?(:css, path, options, &optional_filter_block)
259
255
  end
260
256
 
@@ -268,8 +264,7 @@ module Capybara
268
264
  # @option options [String, Regexp] :href The value the href attribute must be
269
265
  # @return [Boolean] Whether it exists
270
266
  #
271
- def has_link?(locator=nil, options={}, &optional_filter_block)
272
- locator, options = nil, locator if locator.is_a? Hash
267
+ def has_link?(locator = nil, **options, &optional_filter_block)
273
268
  has_selector?(:link, locator, options, &optional_filter_block)
274
269
  end
275
270
 
@@ -281,8 +276,7 @@ module Capybara
281
276
  # @param (see Capybara::Node::Finders#has_link?)
282
277
  # @return [Boolean] Whether it doesn't exist
283
278
  #
284
- def has_no_link?(locator=nil, options={}, &optional_filter_block)
285
- locator, options = nil, locator if locator.is_a? Hash
279
+ def has_no_link?(locator = nil, **options, &optional_filter_block)
286
280
  has_no_selector?(:link, locator, options, &optional_filter_block)
287
281
  end
288
282
 
@@ -294,8 +288,7 @@ module Capybara
294
288
  # @param [String] locator The text, value or id of a button to check for
295
289
  # @return [Boolean] Whether it exists
296
290
  #
297
- def has_button?(locator=nil, options={}, &optional_filter_block)
298
- locator, options = nil, locator if locator.is_a? Hash
291
+ def has_button?(locator = nil, **options, &optional_filter_block)
299
292
  has_selector?(:button, locator, options, &optional_filter_block)
300
293
  end
301
294
 
@@ -307,8 +300,7 @@ module Capybara
307
300
  # @param [String] locator The text, value or id of a button to check for
308
301
  # @return [Boolean] Whether it doesn't exist
309
302
  #
310
- def has_no_button?(locator=nil, options={}, &optional_filter_block)
311
- locator, options = nil, locator if locator.is_a? Hash
303
+ def has_no_button?(locator = nil, **options, &optional_filter_block)
312
304
  has_no_selector?(:button, locator, options, &optional_filter_block)
313
305
  end
314
306
 
@@ -334,8 +326,7 @@ module Capybara
334
326
  # @option options [String] :type The type attribute of the field
335
327
  # @return [Boolean] Whether it exists
336
328
  #
337
- def has_field?(locator=nil, options={}, &optional_filter_block)
338
- locator, options = nil, locator if locator.is_a? Hash
329
+ def has_field?(locator = nil, **options, &optional_filter_block)
339
330
  has_selector?(:field, locator, options, &optional_filter_block)
340
331
  end
341
332
 
@@ -349,8 +340,7 @@ module Capybara
349
340
  # @option options [String] :type The type attribute of the field
350
341
  # @return [Boolean] Whether it doesn't exist
351
342
  #
352
- def has_no_field?(locator=nil, options={}, &optional_filter_block)
353
- locator, options = nil, locator if locator.is_a? Hash
343
+ def has_no_field?(locator = nil, **options, &optional_filter_block)
354
344
  has_no_selector?(:field, locator, options, &optional_filter_block)
355
345
  end
356
346
 
@@ -363,8 +353,7 @@ module Capybara
363
353
  # @param [String] locator The label, name or id of a checked field
364
354
  # @return [Boolean] Whether it exists
365
355
  #
366
- def has_checked_field?(locator=nil, options={}, &optional_filter_block)
367
- locator, options = nil, locator if locator.is_a? Hash
356
+ def has_checked_field?(locator = nil, **options, &optional_filter_block)
368
357
  has_selector?(:field, locator, options.merge(checked: true), &optional_filter_block)
369
358
  end
370
359
 
@@ -377,8 +366,7 @@ module Capybara
377
366
  # @param [String] locator The label, name or id of a checked field
378
367
  # @return [Boolean] Whether it doesn't exist
379
368
  #
380
- def has_no_checked_field?(locator=nil, options={}, &optional_filter_block)
381
- locator, options = nil, locator if locator.is_a? Hash
369
+ def has_no_checked_field?(locator = nil, **options, &optional_filter_block)
382
370
  has_no_selector?(:field, locator, options.merge(checked: true), &optional_filter_block)
383
371
  end
384
372
 
@@ -391,8 +379,7 @@ module Capybara
391
379
  # @param [String] locator The label, name or id of an unchecked field
392
380
  # @return [Boolean] Whether it exists
393
381
  #
394
- def has_unchecked_field?(locator=nil, options={}, &optional_filter_block)
395
- locator, options = nil, locator if locator.is_a? Hash
382
+ def has_unchecked_field?(locator = nil, **options, &optional_filter_block)
396
383
  has_selector?(:field, locator, options.merge(unchecked: true), &optional_filter_block)
397
384
  end
398
385
 
@@ -405,8 +392,7 @@ module Capybara
405
392
  # @param [String] locator The label, name or id of an unchecked field
406
393
  # @return [Boolean] Whether it doesn't exist
407
394
  #
408
- def has_no_unchecked_field?(locator=nil, options={}, &optional_filter_block)
409
- locator, options = nil, locator if locator.is_a? Hash
395
+ def has_no_unchecked_field?(locator = nil, **options, &optional_filter_block)
410
396
  has_no_selector?(:field, locator, options.merge(unchecked: true), &optional_filter_block)
411
397
  end
412
398
 
@@ -439,8 +425,7 @@ module Capybara
439
425
  # @option options [String, Array] :with_selected Partial set of options which should minimally be selected
440
426
  # @return [Boolean] Whether it exists
441
427
  #
442
- def has_select?(locator=nil, options={}, &optional_filter_block)
443
- locator, options = nil, locator if locator.is_a? Hash
428
+ def has_select?(locator = nil, **options, &optional_filter_block)
444
429
  has_selector?(:select, locator, options, &optional_filter_block)
445
430
  end
446
431
 
@@ -452,8 +437,7 @@ module Capybara
452
437
  # @param (see Capybara::Node::Matchers#has_select?)
453
438
  # @return [Boolean] Whether it doesn't exist
454
439
  #
455
- def has_no_select?(locator=nil, options={}, &optional_filter_block)
456
- locator, options = nil, locator if locator.is_a? Hash
440
+ def has_no_select?(locator = nil, **options, &optional_filter_block)
457
441
  has_no_selector?(:select, locator, options, &optional_filter_block)
458
442
  end
459
443
 
@@ -467,8 +451,7 @@ module Capybara
467
451
  # @param [String] locator The id or caption of a table
468
452
  # @return [Boolean] Whether it exist
469
453
  #
470
- def has_table?(locator=nil, options={}, &optional_filter_block)
471
- locator, options = nil, locator if locator.is_a? Hash
454
+ def has_table?(locator = nil, **options, &optional_filter_block)
472
455
  has_selector?(:table, locator, options, &optional_filter_block)
473
456
  end
474
457
 
@@ -480,8 +463,7 @@ module Capybara
480
463
  # @param (see Capybara::Node::Matchers#has_table?)
481
464
  # @return [Boolean] Whether it doesn't exist
482
465
  #
483
- def has_no_table?(locator=nil, options={}, &optional_filter_block)
484
- locator, options = nil, locator if locator.is_a? Hash
466
+ def has_no_table?(locator = nil, **options, &optional_filter_block)
485
467
  has_no_selector?(:table, locator, options, &optional_filter_block)
486
468
  end
487
469
 
@@ -534,7 +516,7 @@ module Capybara
534
516
  # @param [String, XPath::Expression] xpath The XPath expression to match against the current code
535
517
  # @return [Boolean]
536
518
  #
537
- def matches_xpath?(xpath, options={}, &optional_filter_block)
519
+ def matches_xpath?(xpath, **options, &optional_filter_block)
538
520
  matches_selector?(:xpath, xpath, options, &optional_filter_block)
539
521
  end
540
522
 
@@ -545,7 +527,7 @@ module Capybara
545
527
  # @param [String] css The CSS selector to match against the current code
546
528
  # @return [Boolean]
547
529
  #
548
- def matches_css?(css, options={}, &optional_filter_block)
530
+ def matches_css?(css, **options, &optional_filter_block)
549
531
  matches_selector?(:css, css, options, &optional_filter_block)
550
532
  end
551
533
 
@@ -570,7 +552,7 @@ module Capybara
570
552
  # @param [String, XPath::Expression] xpath The XPath expression to match against the current code
571
553
  # @return [Boolean]
572
554
  #
573
- def not_matches_xpath?(xpath, options={}, &optional_filter_block)
555
+ def not_matches_xpath?(xpath, **options, &optional_filter_block)
574
556
  not_matches_selector?(:xpath, xpath, options, &optional_filter_block)
575
557
  end
576
558
 
@@ -581,11 +563,10 @@ module Capybara
581
563
  # @param [String] css The CSS selector to match against the current code
582
564
  # @return [Boolean]
583
565
  #
584
- def not_matches_css?(css, options={}, &optional_filter_block)
566
+ def not_matches_css?(css, **options, &optional_filter_block)
585
567
  not_matches_selector?(:css, css, options, &optional_filter_block)
586
568
  end
587
569
 
588
-
589
570
  ##
590
571
  # Asserts that the page or current node has the given text content,
591
572
  # ignoring any HTML tags.
@@ -656,7 +637,7 @@ module Capybara
656
637
  def has_text?(*args)
657
638
  assert_text(*args)
658
639
  rescue Capybara::ExpectationNotMet
659
- return false
640
+ false
660
641
  end
661
642
  alias_method :has_content?, :has_text?
662
643
 
@@ -670,53 +651,49 @@ module Capybara
670
651
  def has_no_text?(*args)
671
652
  assert_no_text(*args)
672
653
  rescue Capybara::ExpectationNotMet
673
- return false
654
+ false
674
655
  end
675
656
  alias_method :has_no_content?, :has_no_text?
676
657
 
677
658
  def ==(other)
678
- self.eql?(other) || (other.respond_to?(:base) && base == other.base)
659
+ eql?(other) || (other.respond_to?(:base) && base == other.base)
679
660
  end
680
661
 
681
662
  private
682
663
 
683
- def _verify_selector_result(query_args, optional_filter_block, &result_block)
684
- _set_query_session_options(query_args)
664
+ def _verify_selector_result(query_args, optional_filter_block)
665
+ query_args = _set_query_session_options(*query_args)
685
666
  query = Capybara::Queries::SelectorQuery.new(*query_args, &optional_filter_block)
686
667
  synchronize(query.wait) do
687
668
  result = query.resolve_for(self)
688
- result_block.call(result, query)
669
+ yield result, query
689
670
  end
690
- return true
671
+ true
691
672
  end
692
673
 
693
- def _verify_match_result(query_args, optional_filter_block, &result_block)
694
- _set_query_session_options(query_args)
674
+ def _verify_match_result(query_args, optional_filter_block)
675
+ query_args = _set_query_session_options(*query_args)
695
676
  query = Capybara::Queries::MatchQuery.new(*query_args, &optional_filter_block)
696
677
  synchronize(query.wait) do
697
- result = query.resolve_for(self.query_scope)
698
- result_block.call(result)
678
+ result = query.resolve_for(query_scope)
679
+ yield result
699
680
  end
700
- return true
681
+ true
701
682
  end
702
683
 
703
684
  def _verify_text(query_args)
704
- _set_query_session_options(query_args)
685
+ query_args = _set_query_session_options(*query_args)
705
686
  query = Capybara::Queries::TextQuery.new(*query_args)
706
687
  synchronize(query.wait) do
707
688
  count = query.resolve_for(self)
708
689
  yield(count, query)
709
690
  end
710
- return true
691
+ true
711
692
  end
712
693
 
713
- def _set_query_session_options(query_args)
714
- if query_args.last.is_a? Hash
715
- query_args.last[:session_options] = session_options
716
- else
717
- query_args.push(session_options: session_options)
718
- end
719
- query_args
694
+ def _set_query_session_options(*query_args, **query_options)
695
+ query_options[:session_options] = session_options
696
+ query_args.push(query_options)
720
697
  end
721
698
  end
722
699
  end