capybara 3.30.0 → 3.33.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (96) hide show
  1. checksums.yaml +4 -4
  2. data/History.md +72 -0
  3. data/README.md +10 -3
  4. data/lib/capybara.rb +17 -7
  5. data/lib/capybara/cucumber.rb +1 -1
  6. data/lib/capybara/dsl.rb +10 -2
  7. data/lib/capybara/minitest.rb +232 -144
  8. data/lib/capybara/minitest/spec.rb +153 -97
  9. data/lib/capybara/node/actions.rb +16 -20
  10. data/lib/capybara/node/element.rb +13 -8
  11. data/lib/capybara/node/finders.rb +5 -1
  12. data/lib/capybara/node/matchers.rb +28 -21
  13. data/lib/capybara/node/simple.rb +1 -1
  14. data/lib/capybara/queries/base_query.rb +2 -1
  15. data/lib/capybara/queries/selector_query.rb +8 -1
  16. data/lib/capybara/queries/style_query.rb +1 -1
  17. data/lib/capybara/queries/text_query.rb +6 -0
  18. data/lib/capybara/rack_test/browser.rb +3 -1
  19. data/lib/capybara/rack_test/node.rb +34 -9
  20. data/lib/capybara/registration_container.rb +44 -0
  21. data/lib/capybara/registrations/servers.rb +1 -1
  22. data/lib/capybara/result.rb +29 -5
  23. data/lib/capybara/rspec/matcher_proxies.rb +4 -4
  24. data/lib/capybara/rspec/matchers.rb +27 -27
  25. data/lib/capybara/rspec/matchers/base.rb +12 -6
  26. data/lib/capybara/rspec/matchers/count_sugar.rb +2 -1
  27. data/lib/capybara/rspec/matchers/have_ancestor.rb +4 -3
  28. data/lib/capybara/rspec/matchers/have_current_path.rb +2 -2
  29. data/lib/capybara/rspec/matchers/have_selector.rb +15 -7
  30. data/lib/capybara/rspec/matchers/have_sibling.rb +3 -3
  31. data/lib/capybara/rspec/matchers/have_text.rb +3 -3
  32. data/lib/capybara/rspec/matchers/have_title.rb +2 -2
  33. data/lib/capybara/rspec/matchers/match_selector.rb +3 -3
  34. data/lib/capybara/rspec/matchers/match_style.rb +2 -2
  35. data/lib/capybara/rspec/matchers/spatial_sugar.rb +2 -1
  36. data/lib/capybara/selector.rb +12 -1
  37. data/lib/capybara/selector/definition.rb +5 -4
  38. data/lib/capybara/selector/definition/button.rb +1 -0
  39. data/lib/capybara/selector/definition/fillable_field.rb +1 -1
  40. data/lib/capybara/selector/definition/label.rb +1 -1
  41. data/lib/capybara/selector/definition/link.rb +8 -0
  42. data/lib/capybara/selector/definition/select.rb +31 -12
  43. data/lib/capybara/selector/definition/table.rb +1 -1
  44. data/lib/capybara/selector/selector.rb +4 -0
  45. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -1
  46. data/lib/capybara/selenium/atoms/src/getAttribute.js +1 -1
  47. data/lib/capybara/selenium/driver.rb +7 -4
  48. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +8 -10
  49. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +7 -9
  50. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +2 -2
  51. data/lib/capybara/selenium/extensions/html5_drag.rb +24 -8
  52. data/lib/capybara/selenium/node.rb +92 -15
  53. data/lib/capybara/selenium/nodes/chrome_node.rb +4 -11
  54. data/lib/capybara/selenium/nodes/edge_node.rb +1 -1
  55. data/lib/capybara/selenium/nodes/firefox_node.rb +3 -3
  56. data/lib/capybara/selenium/patches/action_pauser.rb +26 -0
  57. data/lib/capybara/selenium/patches/logs.rb +3 -5
  58. data/lib/capybara/session.rb +33 -18
  59. data/lib/capybara/session/config.rb +3 -1
  60. data/lib/capybara/spec/public/test.js +58 -6
  61. data/lib/capybara/spec/session/all_spec.rb +45 -5
  62. data/lib/capybara/spec/session/assert_text_spec.rb +5 -5
  63. data/lib/capybara/spec/session/click_button_spec.rb +11 -0
  64. data/lib/capybara/spec/session/fill_in_spec.rb +29 -0
  65. data/lib/capybara/spec/session/find_spec.rb +11 -8
  66. data/lib/capybara/spec/session/has_button_spec.rb +16 -0
  67. data/lib/capybara/spec/session/has_css_spec.rb +12 -9
  68. data/lib/capybara/spec/session/has_current_path_spec.rb +2 -2
  69. data/lib/capybara/spec/session/has_field_spec.rb +16 -0
  70. data/lib/capybara/spec/session/has_select_spec.rb +32 -4
  71. data/lib/capybara/spec/session/has_selector_spec.rb +4 -4
  72. data/lib/capybara/spec/session/has_text_spec.rb +5 -1
  73. data/lib/capybara/spec/session/node_spec.rb +146 -30
  74. data/lib/capybara/spec/session/window/window_spec.rb +7 -7
  75. data/lib/capybara/spec/spec_helper.rb +2 -2
  76. data/lib/capybara/spec/test_app.rb +14 -18
  77. data/lib/capybara/spec/views/form.erb +13 -2
  78. data/lib/capybara/spec/views/with_dragula.erb +3 -1
  79. data/lib/capybara/spec/views/with_html.erb +2 -2
  80. data/lib/capybara/spec/views/with_js.erb +1 -0
  81. data/lib/capybara/version.rb +1 -1
  82. data/spec/capybara_spec.rb +1 -1
  83. data/spec/dsl_spec.rb +14 -1
  84. data/spec/minitest_spec.rb +1 -1
  85. data/spec/rack_test_spec.rb +13 -1
  86. data/spec/regexp_dissassembler_spec.rb +0 -4
  87. data/spec/result_spec.rb +40 -29
  88. data/spec/rspec/shared_spec_matchers.rb +65 -53
  89. data/spec/selector_spec.rb +1 -1
  90. data/spec/selenium_spec_chrome.rb +6 -3
  91. data/spec/selenium_spec_chrome_remote.rb +2 -0
  92. data/spec/server_spec.rb +41 -49
  93. data/spec/shared_selenium_node.rb +18 -0
  94. data/spec/shared_selenium_session.rb +25 -7
  95. data/spec/spec_helper.rb +1 -1
  96. metadata +5 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 7a441a0ffad497da4d5342b4a84c165d0922f92a049aa7035db212f210a1175c
4
- data.tar.gz: c24b692401fc4eb28d73bdee5dc8f20b01d6cca582b0d94a4e015ac35485bc63
3
+ metadata.gz: ab64d9d47c6374c4f203945be70b868fb9e4c48d3fdca087ba4e66498e40b91c
4
+ data.tar.gz: 451c97390c148b5b0fad1b06107a4f0de87f17f7b8cef7156fb76ad2ee503f76
5
5
  SHA512:
6
- metadata.gz: 3003c43d66f8cf415de12e9c9db95c5a60022aa10d63c3372074763049c7719041162eee9bb99fec17a7bf4190d252812b5d1513df3f22a586501f9f671dbea1
7
- data.tar.gz: de605e659b3c0e78065acd429e3d40c1e7758840b8cb8dd417229d440581b8363535d00a4193c51a2561a2ccde8b57b832d8176a8fb3b932a46e6682d161ddbd
6
+ metadata.gz: b0ca3fd8a4535e1df696ddc7f547e066b873d3f4be2b54655fdbb0b6588c5086a87b93500e241e0da031b586c0b6a30cdd8522f209309cf6729c683226bfcf7f
7
+ data.tar.gz: d295dcd733856816a1c89810f4d54304a52c251d585afcc62b986a66d63e080e03ddc81bdc46cf51a044e29d2849ccce9bb3cb307a0757746e662394f648a717
data/History.md CHANGED
@@ -1,3 +1,75 @@
1
+ # Version 3.33.0
2
+ Release date: 2020-06-21
3
+
4
+ ### Added
5
+
6
+ * Block passed to `within_session` now receives the new and old session
7
+ * Support for aria-role button when enabled [Seiei Miyagi]
8
+ * Support for aria-role link when enabled
9
+ * Support for `validation_message` filter with :field and :fillable_field selectors
10
+
11
+ ### Changed
12
+
13
+ * Ruby 2.5.0+ is now required
14
+ * Deprecated direct manupulation of the driver and server registries
15
+
16
+ ### Fixed
17
+
18
+ * Ruby 2.7 warning in minitest `assert_text` [Eileen M. Uchitelle]
19
+
20
+
21
+ # Version 3.32.2
22
+ Release date: 2020-05-16
23
+
24
+ ### Fixed
25
+
26
+ * Don't use lazy enumerator with JRuby due to leaking threads
27
+ * Ruby 2.7 deprecation warning when registering Webrick [Jon Zeppieri]
28
+ * `have_text` description [Juan Pablo Rinaldi]
29
+
30
+ # Version 3.32.1
31
+ Release date: 2020-04-05
32
+
33
+ ### Fixed
34
+
35
+ * Rapid set now respects field maxlength (Issue #2332)
36
+ * Only patch pause into legacy actions in Selenium < 4 (Issue #2334)
37
+
38
+ # Version 3.32.0
39
+ Release date: 2020-03-29
40
+
41
+ ### Added
42
+
43
+ * Support `delay` setting on click with Selenium
44
+ * Implement rapid set for values longer thn 30 characters in text fields with Selenium
45
+
46
+ ### Fixed
47
+
48
+ * Result#[] and negative max on ranges (Issue #2302/2303) [Jeremy Evans]
49
+ * RackTest form submission rewrites query string when using GET method
50
+ * Ruby 2.7 deprecation warnings in RSpec matcher proxies
51
+
52
+ # Version 3.31.0
53
+ Release date: 2020-01-26
54
+
55
+ ### Added
56
+
57
+ * Support setting range inputs with the selenium driver [Andrew White]
58
+ * Support setting range inputs with the rack driver
59
+ * Support drop modifier keys in drag & drop [Elliot Crosby-McCullough]
60
+ * `enabled_options` and `disabled options` filters for select selector
61
+ * Support beginless ranges
62
+ * Optionally allow `all` results to be reloaded when stable - Beta feature - may be removed in
63
+ future version if problems occur
64
+
65
+ ### Fixed
66
+
67
+ * Fix Ruby 2.7 deprecation notices around keyword arguments. I have tried to do this without
68
+ any breaking changes, but due to the nature of the 2.7 changes and some selector types accepting
69
+ Hashes as locators there are a lot of edge cases. If you find any broken cases please report
70
+ them and I'll see if they're fixable.
71
+ * Clicking on details/summary element behavior in rack_test driver_
72
+
1
73
  # Version 3.30.0
2
74
  Release date: 2019-12-24
3
75
 
data/README.md CHANGED
@@ -7,7 +7,7 @@
7
7
  [![Gitter](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/jnicklas/capybara?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
8
8
  [![SemVer](https://api.dependabot.com/badges/compatibility_score?dependency-name=capybara&package-manager=bundler&version-scheme=semver)](https://dependabot.com/compatibility-score.html?dependency-name=capybara&package-manager=bundler&version-scheme=semver)
9
9
 
10
- **Note** You are viewing the README for the 3.30.x Capybara release.
10
+ **Note** You are viewing the README for the 3.33.x release of Capybara.
11
11
 
12
12
  Capybara helps you test web applications by simulating how a real user would
13
13
  interact with your app. It is agnostic about the driver running your tests and
@@ -76,7 +76,7 @@ GitHub): http://groups.google.com/group/ruby-capybara
76
76
 
77
77
  ## <a name="setup"></a>Setup
78
78
 
79
- Capybara requires Ruby 2.4.0 or later. To install, add this line to your
79
+ Capybara requires Ruby 2.5.0 or later. To install, add this line to your
80
80
  `Gemfile` and run `bundle install`:
81
81
 
82
82
  ```ruby
@@ -149,7 +149,7 @@ require 'capybara/rspec'
149
149
 
150
150
  If you are using Rails, put your Capybara specs in `spec/features` or `spec/system` (only works
151
151
  if [you have it configured in
152
- RSpec](https://www.relishapp.com/rspec/rspec-rails/docs/upgrade#file-type-inference-disabled))
152
+ RSpec](https://relishapp.com/rspec/rspec-rails/v/4-0/docs/directory-structure))
153
153
  and if you have your Capybara specs in a different directory, then tag the
154
154
  example groups with `type: :feature` or `type: :system` depending on which type of test you're writing.
155
155
 
@@ -1055,6 +1055,13 @@ additional info about how the underlying driver can be configured.
1055
1055
  are testing for specific server errors and using multiple sessions make sure to test for the
1056
1056
  errors using the initial session (usually :default)
1057
1057
 
1058
+ * If WebMock is enabled, you may encounter a "Too many open files"
1059
+ error. A simple `page.find` call may cause thousands of HTTP requests
1060
+ until the timeout occurs. By default, WebMock will cause each of these
1061
+ requests to spawn a new connection. To work around this problem, you
1062
+ may need to [enable WebMock's `net_http_connect_on_start: true`
1063
+ parameter](https://github.com/bblimke/webmock/blob/master/README.md#connecting-on-nethttpstart).
1064
+
1058
1065
  ## <a name="threadsafe"></a>"Threadsafe" mode
1059
1066
 
1060
1067
  In normal mode most of Capybara's configuration options are global settings which can cause issues
@@ -5,6 +5,7 @@ require 'nokogiri'
5
5
  require 'xpath'
6
6
  require 'forwardable'
7
7
  require 'capybara/config'
8
+ require 'capybara/registration_container'
8
9
 
9
10
  module Capybara
10
11
  class CapybaraError < StandardError; end
@@ -81,6 +82,7 @@ module Capybara
81
82
  # - **default_selector** (`:css`, `:xpath` = `:css`) - Methods which take a selector use the given type by default. See also {Capybara::Selector}.
82
83
  # - **default_set_options** (Hash = `{}`) - The default options passed to {Capybara::Node::Element#set Element#set}.
83
84
  # - **enable_aria_label** (Boolean = `false`) - Whether fields, links, and buttons will match against `aria-label` attribute.
85
+ # - **enable_aria_role** (Boolean = `false`) - Selectors will check for relevant aria role (currently only `button`).
84
86
  # - **exact** (Boolean = `false`) - Whether locators are matched exactly or with substrings. Only affects selector conditions
85
87
  # written using the `XPath#is` method.
86
88
  # - **exact_text** (Boolean = `false`) - Whether the text matchers and `:text` filter match exactly or on substrings.
@@ -93,6 +95,7 @@ module Capybara
93
95
  # - **save_path** (String = `Dir.pwd`) - Where to put pages saved through {Capybara::Session#save_page save_page}, {Capybara::Session#save_screenshot save_screenshot},
94
96
  # {Capybara::Session#save_and_open_page save_and_open_page}, or {Capybara::Session#save_and_open_screenshot save_and_open_screenshot}.
95
97
  # - **server** (Symbol = `:default` (which uses puma)) - The name of the registered server to use when running the app under test.
98
+ # - **server_port** (Integer) - The port Capybara will run the application server on, if not specified a random port will be used.
96
99
  # - **server_errors** (Array\<Class> = `[Exception]`) - Error classes that should be raised in the tests if they are raised in the server
97
100
  # and {configure raise_server_errors} is `true`.
98
101
  # - **test_id** (Symbol, String, `nil` = `nil`) - Optional attribute to match locator against with built-in selectors along with id.
@@ -124,7 +127,7 @@ module Capybara
124
127
  # @yieldreturn [Capybara::Driver::Base] A Capybara driver instance
125
128
  #
126
129
  def register_driver(name, &block)
127
- drivers[name] = block
130
+ drivers.send(:register, name, block)
128
131
  end
129
132
 
130
133
  ##
@@ -143,7 +146,7 @@ module Capybara
143
146
  # @yieldparam host The host/ip to bind to
144
147
  #
145
148
  def register_server(name, &block)
146
- servers[name.to_sym] = block
149
+ servers.send(:register, name.to_sym, block)
147
150
  end
148
151
 
149
152
  ##
@@ -197,11 +200,11 @@ module Capybara
197
200
  end
198
201
 
199
202
  def drivers
200
- @drivers ||= {}
203
+ @drivers ||= RegistrationContainer.new
201
204
  end
202
205
 
203
206
  def servers
204
- @servers ||= {}
207
+ @servers ||= RegistrationContainer.new
205
208
  end
206
209
 
207
210
  # Wraps the given string, which should contain an HTML document or fragment
@@ -349,7 +352,8 @@ module Capybara
349
352
  #
350
353
  # Yield a block using a specific session name or {Capybara::Session} instance.
351
354
  #
352
- def using_session(name_or_session)
355
+ def using_session(name_or_session, &block)
356
+ previous_session = current_session
353
357
  previous_session_info = {
354
358
  specified_session: specified_session,
355
359
  session_name: session_name,
@@ -362,7 +366,12 @@ module Capybara
362
366
  else
363
367
  self.session_name = name_or_session
364
368
  end
365
- yield
369
+
370
+ if block.arity.zero?
371
+ yield
372
+ else
373
+ yield current_session, previous_session
374
+ end
366
375
  ensure
367
376
  self.session_name, self.specified_session = previous_session_info.values_at(:session_name, :specified_session)
368
377
  self.current_driver, self.app = previous_session_info.values_at(:current_driver, :app) if threadsafe
@@ -394,7 +403,7 @@ module Capybara
394
403
  template.inner_html = ''
395
404
  end
396
405
  document.xpath('//textarea').each do |textarea|
397
- textarea['_capybara_raw_value'] = textarea.content.sub(/\A\n/, '')
406
+ textarea['_capybara_raw_value'] = textarea.content.delete_prefix("\n")
398
407
  end
399
408
  end
400
409
  end
@@ -501,6 +510,7 @@ Capybara.configure do |config|
501
510
  config.visible_text_only = false
502
511
  config.automatic_label_click = false
503
512
  config.enable_aria_label = false
513
+ config.enable_aria_role = false
504
514
  config.reuse_server = true
505
515
  config.default_set_options = {}
506
516
  config.test_id = nil
@@ -22,6 +22,6 @@ end
22
22
  Before do |scenario|
23
23
  scenario.source_tag_names.each do |tag|
24
24
  driver_name = tag.sub(/^@/, '').to_sym
25
- Capybara.current_driver = driver_name if Capybara.drivers.key?(driver_name)
25
+ Capybara.current_driver = driver_name if Capybara.drivers[driver_name]
26
26
  end
27
27
  end
@@ -47,8 +47,16 @@ module Capybara
47
47
  end
48
48
 
49
49
  Session::DSL_METHODS.each do |method|
50
- define_method method do |*args, &block|
51
- page.send method, *args, &block
50
+ if RUBY_VERSION >= '2.7'
51
+ class_eval <<~METHOD, __FILE__, __LINE__ + 1
52
+ def #{method}(...)
53
+ page.method("#{method}").call(...)
54
+ end
55
+ METHOD
56
+ else
57
+ define_method method do |*args, &block|
58
+ page.send method, *args, &block
59
+ end
52
60
  end
53
61
  end
54
62
  end
@@ -6,48 +6,54 @@ require 'capybara/dsl'
6
6
  module Capybara
7
7
  module Minitest
8
8
  module Assertions
9
- ## Assert text exists
9
+ ##
10
+ # Assert text exists
10
11
  #
12
+ # @!method assert_content
11
13
  # @!method assert_text
12
- # @see Capybara::Node::Matchers#assert_text
14
+ # See {Capybara::Node::Matchers#assert_text}
13
15
 
14
- ## Assert text does not exist
16
+ ##
17
+ # Assert text does not exist
15
18
  #
19
+ # @!method refute_content
20
+ # @!method assert_no_content
21
+ # @!method refute_text
16
22
  # @!method assert_no_text
17
- # @see Capybara::Node::Matchers#assert_no_text
23
+ # See {Capybara::Node::Matchers#assert_no_text}
18
24
 
19
25
  ##
20
26
  # Assertion that page title does match
21
27
  #
22
28
  # @!method assert_title
23
- # @see Capybara::Node::DocumentMatchers#assert_title
29
+ # See {Capybara::Node::DocumentMatchers#assert_title}
24
30
 
25
31
  ##
26
32
  # Assertion that page title does not match
27
33
  #
28
34
  # @!method refute_title
29
35
  # @!method assert_no_title
30
- # @see Capybara::Node::DocumentMatchers#assert_no_title
36
+ # See {Capybara::Node::DocumentMatchers#assert_no_title}
31
37
 
32
38
  ##
33
39
  # Assertion that current path matches
34
40
  #
35
41
  # @!method assert_current_path
36
- # @see Capybara::SessionMatchers#assert_current_path
42
+ # See {Capybara::SessionMatchers#assert_current_path}
37
43
 
38
44
  ##
39
45
  # Assertion that current page does not match
40
46
  #
41
47
  # @!method refute_current_path
42
48
  # @!method assert_no_current_path
43
- # @see Capybara::SessionMatchers#assert_no_current_path
49
+ # See {Capybara::SessionMatchers#assert_no_current_path}
44
50
 
45
51
  %w[text no_text title no_title current_path no_current_path].each do |assertion_name|
46
52
  class_eval <<-ASSERTION, __FILE__, __LINE__ + 1
47
- def assert_#{assertion_name} *args
53
+ def assert_#{assertion_name}(*args, **kwargs)
48
54
  self.assertions +=1
49
55
  subject, args = determine_subject(args)
50
- subject.assert_#{assertion_name}(*args)
56
+ subject.assert_#{assertion_name}(*args, **kwargs)
51
57
  rescue Capybara::ExpectationNotMet => e
52
58
  raise ::Minitest::Assertion, e.message
53
59
  end
@@ -61,40 +67,81 @@ module Capybara
61
67
  alias_method :assert_content, :assert_text
62
68
  alias_method :assert_no_content, :refute_text
63
69
 
64
- ## Assert selector exists on page
70
+ ##
71
+ # Assert selector exists on page
65
72
  #
66
73
  # @!method assert_selector
67
- # @see Capybara::Node::Matchers#assert_selector
74
+ # See {Capybara::Node::Matchers#assert_selector}
68
75
 
69
- ## Assert selector does not exist on page
76
+ ##
77
+ # Assert selector does not exist on page
70
78
  #
79
+ # @!method refute_selector
71
80
  # @!method assert_no_selector
72
- # @see Capybara::Node::Matchers#assert_no_selector
81
+ # See {Capybara::Node::Matchers#assert_no_selector}
73
82
 
74
- ## Assert element matches selector
83
+ ##
84
+ # Assert element matches selector
75
85
  #
76
86
  # @!method assert_matches_selector
77
- # @see Capybara::Node::Matchers#assert_matches_selector
87
+ # See {Capybara::Node::Matchers#assert_matches_selector}
88
+
89
+ ##
90
+ # Assert element does not match selector
91
+ #
92
+ # @!method refute_matches_selector
93
+ # @!method assert_not_matches_selector
94
+ # See {Capybara::Node::Matchers#assert_not_matches_selector}
78
95
 
79
- ## Assert element does not match selector
96
+ ##
97
+ # Assert all of the provided selectors exist on page
80
98
  #
81
- # @!method assert_xpath
82
- # @see Capybara::Node::Matchers#assert_not_matches_selector
99
+ # @!method assert_all_of_selectors
100
+ # See {Capybara::Node::Matchers#assert_all_of_selectors}
101
+
102
+ ##
103
+ # Assert none of the provided selectors exist on page
104
+ #
105
+ # @!method assert_none_of_selectors
106
+ # See {Capybara::Node::Matchers#assert_none_of_selectors}
107
+
108
+ ##
109
+ # Assert any of the provided selectors exist on page
110
+ #
111
+ # @!method assert_any_of_selectors
112
+ # See {Capybara::Node::Matchers#assert_any_of_selectors}
83
113
 
84
- ## Assert element has the provided CSS styles
114
+ ##
115
+ # Assert element has the provided CSS styles
85
116
  #
86
117
  # @!method assert_matches_style
87
- # @see Capybara::Node::Matchers#assert_matches_style
118
+ # See {Capybara::Node::Matchers#assert_matches_style}
88
119
 
89
- ## Assert element has a matching sibling
120
+ ##
121
+ # Assert element has a matching sibling
90
122
  #
91
123
  # @!method assert_sibling
92
- # @see Capybara::Node::Matchers#assert_sibling
124
+ # See {Capybara::Node::Matchers#assert_sibling}
93
125
 
94
- ## Assert element has a matching ancestor
126
+ ##
127
+ # Assert element does not have a matching sibling
128
+ #
129
+ # @!method refute_sibling
130
+ # @!method assert_no_sibling
131
+ # See {Capybara::Node::Matchers#assert_no_sibling}
132
+
133
+ ##
134
+ # Assert element has a matching ancestor
95
135
  #
96
136
  # @!method assert_ancestor
97
- # @see Capybara::Node::Matchers#assert_ancestor
137
+ # See {Capybara::Node::Matchers#assert_ancestor}
138
+
139
+ ##
140
+ # Assert element does not have a matching ancestor
141
+ #
142
+ # @!method refute_ancestor
143
+ # @!method assert_no_ancestor
144
+ # See {Capybara::Node::Matchers#assert_no_ancestor}
98
145
 
99
146
  %w[selector no_selector matches_style
100
147
  all_of_selectors none_of_selectors any_of_selectors
@@ -109,6 +156,7 @@ module Capybara
109
156
  raise ::Minitest::Assertion, e.message
110
157
  end
111
158
  ASSERTION
159
+ ruby2_keywords "assert_#{assertion_name}" if respond_to?(:ruby2_keywords)
112
160
  end
113
161
 
114
162
  alias_method :refute_selector, :assert_no_selector
@@ -116,18 +164,137 @@ module Capybara
116
164
  alias_method :refute_ancestor, :assert_no_ancestor
117
165
  alias_method :refute_sibling, :assert_no_sibling
118
166
 
167
+ ##
168
+ # Assert that provided xpath exists
169
+ #
170
+ # @!method assert_xpath
171
+ # See {Capybara::Node::Matchers#has_xpath?}
172
+
173
+ ##
174
+ # Assert that provide xpath does not exist
175
+ #
176
+ # @!method refute_xpath
177
+ # @!method assert_no_xpath
178
+ # See {Capybara::Node::Matchers#has_no_xpath?}
179
+
180
+ ##
181
+ # Assert that provided css exists
182
+ #
183
+ # @!method assert_css
184
+ # See {Capybara::Node::Matchers#has_css?}
185
+
186
+ ##
187
+ # Assert that provided css does not exist
188
+ #
189
+ # @!method refute_css
190
+ # @!method assert_no_css
191
+ # See {Capybara::Node::Matchers#has_no_css?}
192
+
193
+ ##
194
+ # Assert that provided link exists
195
+ #
196
+ # @!method assert_link
197
+ # See {Capybara::Node::Matchers#has_link?}
198
+
199
+ ##
200
+ # Assert that provided link does not exist
201
+ #
202
+ # @!method assert_no_link
203
+ # @!method refute_link
204
+ # See {Capybara::Node::Matchers#has_no_link?}
205
+
206
+ ##
207
+ # Assert that provided button exists
208
+ #
209
+ # @!method assert_button
210
+ # See {Capybara::Node::Matchers#has_button?}
211
+
212
+ ##
213
+ # Assert that provided button does not exist
214
+ #
215
+ # @!method refute_button
216
+ # @!method assert_no_button
217
+ # See {Capybara::Node::Matchers#has_no_button?}
218
+
219
+ ##
220
+ # Assert that provided field exists
221
+ #
222
+ # @!method assert_field
223
+ # See {Capybara::Node::Matchers#has_field?}
224
+
225
+ ##
226
+ # Assert that provided field does not exist
227
+ #
228
+ # @!method refute_field
229
+ # @!method assert_no_field
230
+ # See {Capybara::Node::Matchers#has_no_field?}
231
+
232
+ ##
233
+ # Assert that provided checked field exists
234
+ #
235
+ # @!method assert_checked_field
236
+ # See {Capybara::Node::Matchers#has_checked_field?}
237
+
238
+ ##
239
+ # Assert that provided checked_field does not exist
240
+ #
241
+ # @!method assert_no_checked_field
242
+ # @!method refute_checked_field
243
+ # See {Capybara::Node::Matchers#has_no_checked_field?}
244
+
245
+ ##
246
+ # Assert that provided unchecked field exists
247
+ #
248
+ # @!method assert_unchecked_field
249
+ # See {Capybara::Node::Matchers#has_unchecked_field?}
250
+
251
+ ##
252
+ # Assert that provided unchecked field does not exist
253
+ #
254
+ # @!method assert_no_unchecked_field
255
+ # @!method refute_unchecked_field
256
+ # See {Capybara::Node::Matchers#has_no_unchecked_field?}
257
+
258
+ ##
259
+ # Assert that provided select exists
260
+ #
261
+ # @!method assert_select
262
+ # See {Capybara::Node::Matchers#has_select?}
263
+
264
+ ##
265
+ # Assert that provided select does not exist
266
+ #
267
+ # @!method refute_select
268
+ # @!method assert_no_select
269
+ # See {Capybara::Node::Matchers#has_no_select?}
270
+
271
+ ##
272
+ # Assert that provided table exists
273
+ #
274
+ # @!method assert_table
275
+ # See {Capybara::Node::Matchers#has_table?}
276
+
277
+ ##
278
+ # Assert that provided table does not exist
279
+ #
280
+ # @!method refute_table
281
+ # @!method assert_no_table
282
+ # See {Capybara::Node::Matchers#has_no_table?}
283
+
119
284
  %w[xpath css link button field select table].each do |selector_type|
120
285
  define_method "assert_#{selector_type}" do |*args, &optional_filter_block|
121
286
  subject, args = determine_subject(args)
122
287
  locator, options = extract_locator(args)
123
- assert_selector(subject, selector_type.to_sym, locator, options, &optional_filter_block)
288
+ assert_selector(subject, selector_type.to_sym, locator, **options, &optional_filter_block)
124
289
  end
290
+ ruby2_keywords "assert_#{selector_type}" if respond_to?(:ruby2_keywords)
125
291
 
126
292
  define_method "assert_no_#{selector_type}" do |*args, &optional_filter_block|
127
293
  subject, args = determine_subject(args)
128
294
  locator, options = extract_locator(args)
129
- assert_no_selector(subject, selector_type.to_sym, locator, options, &optional_filter_block)
295
+ assert_no_selector(subject, selector_type.to_sym, locator, **options, &optional_filter_block)
130
296
  end
297
+ ruby2_keywords "assert_no_#{selector_type}" if respond_to?(:ruby2_keywords)
131
298
  alias_method "refute_#{selector_type}", "assert_no_#{selector_type}"
132
299
  end
133
300
 
@@ -135,145 +302,66 @@ module Capybara
135
302
  define_method "assert_#{field_type}_field" do |*args, &optional_filter_block|
136
303
  subject, args = determine_subject(args)
137
304
  locator, options = extract_locator(args)
138
- assert_selector(subject, :field, locator, options.merge(field_type.to_sym => true), &optional_filter_block)
305
+ assert_selector(subject, :field, locator, **options.merge(field_type.to_sym => true), &optional_filter_block)
139
306
  end
307
+ ruby2_keywords "assert_#{field_type}_field" if respond_to?(:ruby2_keywords)
140
308
 
141
309
  define_method "assert_no_#{field_type}_field" do |*args, &optional_filter_block|
142
310
  subject, args = determine_subject(args)
143
311
  locator, options = extract_locator(args)
144
- assert_no_selector(subject, :field, locator, options.merge(field_type.to_sym => true), &optional_filter_block)
312
+ assert_no_selector(
313
+ subject,
314
+ :field,
315
+ locator,
316
+ **options.merge(field_type.to_sym => true),
317
+ &optional_filter_block
318
+ )
145
319
  end
320
+ ruby2_keywords "assert_no_#{field_type}_field" if respond_to?(:ruby2_keywords)
146
321
  alias_method "refute_#{field_type}_field", "assert_no_#{field_type}_field"
147
322
  end
148
323
 
324
+ ##
325
+ # Assert that element matches xpath
326
+ #
327
+ # @!method assert_matches_xpath
328
+ # See {Capybara::Node::Matchers#matches_xpath?}
329
+
330
+ ##
331
+ # Assert that element does not match xpath
332
+ #
333
+ # @!method refute_matches_xpath
334
+ # @!method assert_not_matches_xpath
335
+ # See {Capybara::Node::Matchers#not_matches_xpath?}
336
+
337
+ ##
338
+ # Assert that element matches css
339
+ #
340
+ # @!method assert_matches_css
341
+ # See {Capybara::Node::Matchers#matches_css?}
342
+
343
+ ##
344
+ # Assert that element matches css
345
+ #
346
+ # @!method refute_matches_css
347
+ # @!method assert_not_matches_css
348
+ # See {Capybara::Node::Matchers#not_matches_css?}
349
+
149
350
  %w[xpath css].each do |selector_type|
150
351
  define_method "assert_matches_#{selector_type}" do |*args, &optional_filter_block|
151
352
  subject, args = determine_subject(args)
152
353
  assert_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
153
354
  end
355
+ ruby2_keywords "assert_matches_#{selector_type}" if respond_to?(:ruby2_keywords)
154
356
 
155
357
  define_method "assert_not_matches_#{selector_type}" do |*args, &optional_filter_block|
156
358
  subject, args = determine_subject(args)
157
359
  assert_not_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
158
360
  end
361
+ ruby2_keywords "assert_not_matches_#{selector_type}" if respond_to?(:ruby2_keywords)
159
362
  alias_method "refute_matches_#{selector_type}", "assert_not_matches_#{selector_type}"
160
363
  end
161
364
 
162
- ##
163
- # Assertion that there is xpath
164
- #
165
- # @!method assert_xpath
166
- # @see Capybara::Node::Matchers#has_xpath?
167
-
168
- ##
169
- # Assertion that there is no xpath
170
- #
171
- # @!method refute_xpath
172
- # @!method assert_no_xpath
173
- # @see Capybara::Node::Matchers#has_no_xpath?
174
-
175
- ##
176
- # Assertion that there is css
177
- #
178
- # @!method assert_css
179
- # @see Capybara::Node::Matchers#has_css?
180
-
181
- ##
182
- # Assertion that there is no css
183
- #
184
- # @!method refute_css
185
- # @!method assert_no_css
186
- # @see Capybara::Node::Matchers#has_no_css?
187
-
188
- ##
189
- # Assertion that there is link
190
- #
191
- # @!method assert_link
192
- # @see Capybara::Node::Matchers#has_link?
193
-
194
- ##
195
- # Assertion that there is no link
196
- #
197
- # @!method assert_no_link
198
- # @!method refute_link
199
- # @see Capybara::Node::Matchers#has_no_link?
200
-
201
- ##
202
- # Assertion that there is button
203
- #
204
- # @!method assert_button
205
- # @see Capybara::Node::Matchers#has_button?
206
-
207
- ##
208
- # Assertion that there is no button
209
- #
210
- # @!method refute_button
211
- # @!method assert_no_button
212
- # @see Capybara::Node::Matchers#has_no_button?
213
-
214
- ##
215
- # Assertion that there is field
216
- #
217
- # @!method assert_field
218
- # @see Capybara::Node::Matchers#has_field?
219
-
220
- ##
221
- # Assertion that there is no field
222
- #
223
- # @!method refute_field
224
- # @!method assert_no_field
225
- # @see Capybara::Node::Matchers#has_no_field?
226
-
227
- ##
228
- # Assertion that there is checked_field
229
- #
230
- # @!method assert_checked_field
231
- # @see Capybara::Node::Matchers#has_checked_field?
232
-
233
- ##
234
- # Assertion that there is no checked_field
235
- #
236
- # @!method assert_no_checked_field
237
- # @!method refute_checked_field
238
-
239
- ##
240
- # Assertion that there is unchecked_field
241
- #
242
- # @!method assert_unchecked_field
243
- # @see Capybara::Node::Matchers#has_unchecked_field?
244
-
245
- ##
246
- # Assertion that there is no unchecked_field
247
- #
248
- # @!method assert_no_unchecked_field
249
- # @!method refute_unchecked_field
250
-
251
- ##
252
- # Assertion that there is select
253
- #
254
- # @!method assert_select
255
- # @see Capybara::Node::Matchers#has_select?
256
-
257
- ##
258
- # Assertion that there is no select
259
- #
260
- # @!method refute_select
261
- # @!method assert_no_select
262
- # @see Capybara::Node::Matchers#has_no_select?
263
-
264
- ##
265
- # Assertion that there is table
266
- #
267
- # @!method assert_table
268
- # @see Capybara::Node::Matchers#has_table?
269
-
270
- ##
271
- # Assertion that there is no table
272
- #
273
- # @!method refute_table
274
- # @!method assert_no_table
275
- # @see Capybara::Node::Matchers#has_no_table?
276
-
277
365
  private
278
366
 
279
367
  def determine_subject(args)