capybara 3.13.2 → 3.40.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (260) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/History.md +587 -16
  4. data/README.md +240 -90
  5. data/lib/capybara/config.rb +24 -11
  6. data/lib/capybara/cucumber.rb +1 -1
  7. data/lib/capybara/driver/base.rb +8 -0
  8. data/lib/capybara/driver/node.rb +20 -4
  9. data/lib/capybara/dsl.rb +5 -3
  10. data/lib/capybara/helpers.rb +25 -4
  11. data/lib/capybara/minitest/spec.rb +174 -90
  12. data/lib/capybara/minitest.rb +256 -142
  13. data/lib/capybara/node/actions.rb +123 -77
  14. data/lib/capybara/node/base.rb +20 -12
  15. data/lib/capybara/node/document.rb +2 -2
  16. data/lib/capybara/node/document_matchers.rb +3 -3
  17. data/lib/capybara/node/element.rb +223 -117
  18. data/lib/capybara/node/finders.rb +81 -71
  19. data/lib/capybara/node/matchers.rb +271 -134
  20. data/lib/capybara/node/simple.rb +18 -5
  21. data/lib/capybara/node/whitespace_normalizer.rb +81 -0
  22. data/lib/capybara/queries/active_element_query.rb +18 -0
  23. data/lib/capybara/queries/ancestor_query.rb +8 -9
  24. data/lib/capybara/queries/base_query.rb +3 -2
  25. data/lib/capybara/queries/current_path_query.rb +15 -5
  26. data/lib/capybara/queries/selector_query.rb +364 -54
  27. data/lib/capybara/queries/sibling_query.rb +8 -6
  28. data/lib/capybara/queries/style_query.rb +2 -2
  29. data/lib/capybara/queries/text_query.rb +13 -1
  30. data/lib/capybara/queries/title_query.rb +1 -1
  31. data/lib/capybara/rack_test/browser.rb +76 -11
  32. data/lib/capybara/rack_test/driver.rb +10 -5
  33. data/lib/capybara/rack_test/errors.rb +6 -0
  34. data/lib/capybara/rack_test/form.rb +31 -9
  35. data/lib/capybara/rack_test/node.rb +74 -23
  36. data/lib/capybara/registration_container.rb +41 -0
  37. data/lib/capybara/registrations/drivers.rb +42 -0
  38. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  39. data/lib/capybara/registrations/servers.rb +66 -0
  40. data/lib/capybara/result.rb +44 -20
  41. data/lib/capybara/rspec/matcher_proxies.rb +13 -11
  42. data/lib/capybara/rspec/matchers/base.rb +31 -16
  43. data/lib/capybara/rspec/matchers/compound.rb +1 -1
  44. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  45. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  46. data/lib/capybara/rspec/matchers/have_current_path.rb +2 -2
  47. data/lib/capybara/rspec/matchers/have_selector.rb +21 -21
  48. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  49. data/lib/capybara/rspec/matchers/have_text.rb +4 -4
  50. data/lib/capybara/rspec/matchers/have_title.rb +2 -2
  51. data/lib/capybara/rspec/matchers/match_selector.rb +3 -3
  52. data/lib/capybara/rspec/matchers/match_style.rb +7 -2
  53. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  54. data/lib/capybara/rspec/matchers.rb +111 -68
  55. data/lib/capybara/rspec.rb +2 -0
  56. data/lib/capybara/selector/builders/css_builder.rb +11 -7
  57. data/lib/capybara/selector/builders/xpath_builder.rb +5 -3
  58. data/lib/capybara/selector/css.rb +11 -9
  59. data/lib/capybara/selector/definition/button.rb +68 -0
  60. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  61. data/lib/capybara/selector/definition/css.rb +10 -0
  62. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  63. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  64. data/lib/capybara/selector/definition/element.rb +28 -0
  65. data/lib/capybara/selector/definition/field.rb +40 -0
  66. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  67. data/lib/capybara/selector/definition/file_field.rb +13 -0
  68. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  69. data/lib/capybara/selector/definition/frame.rb +17 -0
  70. data/lib/capybara/selector/definition/id.rb +6 -0
  71. data/lib/capybara/selector/definition/label.rb +62 -0
  72. data/lib/capybara/selector/definition/link.rb +55 -0
  73. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  74. data/lib/capybara/selector/definition/option.rb +27 -0
  75. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  76. data/lib/capybara/selector/definition/select.rb +81 -0
  77. data/lib/capybara/selector/definition/table.rb +109 -0
  78. data/lib/capybara/selector/definition/table_row.rb +21 -0
  79. data/lib/capybara/selector/definition/xpath.rb +5 -0
  80. data/lib/capybara/selector/definition.rb +280 -0
  81. data/lib/capybara/selector/filter_set.rb +19 -18
  82. data/lib/capybara/selector/filters/base.rb +11 -2
  83. data/lib/capybara/selector/filters/locator_filter.rb +13 -3
  84. data/lib/capybara/selector/regexp_disassembler.rb +11 -7
  85. data/lib/capybara/selector/selector.rb +50 -440
  86. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  87. data/lib/capybara/selector.rb +473 -482
  88. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  89. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  90. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  91. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  92. data/lib/capybara/selenium/driver.rb +174 -62
  93. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +74 -18
  94. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
  95. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +37 -3
  96. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +14 -1
  97. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  98. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  99. data/lib/capybara/selenium/extensions/find.rb +68 -45
  100. data/lib/capybara/selenium/extensions/html5_drag.rb +192 -22
  101. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  102. data/lib/capybara/selenium/extensions/scroll.rb +8 -10
  103. data/lib/capybara/selenium/node.rb +268 -72
  104. data/lib/capybara/selenium/nodes/chrome_node.rb +105 -9
  105. data/lib/capybara/selenium/nodes/edge_node.rb +110 -0
  106. data/lib/capybara/selenium/nodes/firefox_node.rb +51 -61
  107. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  108. data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
  109. data/lib/capybara/selenium/patches/atoms.rb +18 -0
  110. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  111. data/lib/capybara/selenium/patches/logs.rb +45 -0
  112. data/lib/capybara/selenium/patches/pause_duration_fix.rb +1 -1
  113. data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  114. data/lib/capybara/server/animation_disabler.rb +43 -21
  115. data/lib/capybara/server/checker.rb +6 -2
  116. data/lib/capybara/server/middleware.rb +25 -13
  117. data/lib/capybara/server.rb +20 -4
  118. data/lib/capybara/session/config.rb +15 -11
  119. data/lib/capybara/session/matchers.rb +11 -11
  120. data/lib/capybara/session.rb +162 -131
  121. data/lib/capybara/spec/public/offset.js +6 -0
  122. data/lib/capybara/spec/public/test.js +105 -6
  123. data/lib/capybara/spec/session/accept_alert_spec.rb +1 -1
  124. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  125. data/lib/capybara/spec/session/all_spec.rb +89 -15
  126. data/lib/capybara/spec/session/ancestor_spec.rb +5 -0
  127. data/lib/capybara/spec/session/assert_current_path_spec.rb +5 -2
  128. data/lib/capybara/spec/session/assert_text_spec.rb +26 -22
  129. data/lib/capybara/spec/session/attach_file_spec.rb +64 -31
  130. data/lib/capybara/spec/session/check_spec.rb +26 -4
  131. data/lib/capybara/spec/session/choose_spec.rb +14 -2
  132. data/lib/capybara/spec/session/click_button_spec.rb +109 -61
  133. data/lib/capybara/spec/session/click_link_or_button_spec.rb +9 -0
  134. data/lib/capybara/spec/session/click_link_spec.rb +23 -1
  135. data/lib/capybara/spec/session/current_scope_spec.rb +1 -1
  136. data/lib/capybara/spec/session/current_url_spec.rb +11 -1
  137. data/lib/capybara/spec/session/element/matches_selector_spec.rb +40 -39
  138. data/lib/capybara/spec/session/evaluate_script_spec.rb +12 -0
  139. data/lib/capybara/spec/session/fill_in_spec.rb +46 -5
  140. data/lib/capybara/spec/session/find_link_spec.rb +10 -0
  141. data/lib/capybara/spec/session/find_spec.rb +80 -7
  142. data/lib/capybara/spec/session/first_spec.rb +2 -2
  143. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +14 -1
  144. data/lib/capybara/spec/session/frame/within_frame_spec.rb +14 -1
  145. data/lib/capybara/spec/session/has_all_selectors_spec.rb +5 -5
  146. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  147. data/lib/capybara/spec/session/has_any_selectors_spec.rb +6 -2
  148. data/lib/capybara/spec/session/has_button_spec.rb +81 -0
  149. data/lib/capybara/spec/session/has_css_spec.rb +45 -8
  150. data/lib/capybara/spec/session/has_current_path_spec.rb +22 -7
  151. data/lib/capybara/spec/session/has_element_spec.rb +47 -0
  152. data/lib/capybara/spec/session/has_field_spec.rb +59 -1
  153. data/lib/capybara/spec/session/has_link_spec.rb +40 -0
  154. data/lib/capybara/spec/session/has_none_selectors_spec.rb +7 -7
  155. data/lib/capybara/spec/session/has_select_spec.rb +42 -8
  156. data/lib/capybara/spec/session/has_selector_spec.rb +19 -4
  157. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  158. data/lib/capybara/spec/session/has_table_spec.rb +177 -0
  159. data/lib/capybara/spec/session/has_text_spec.rb +31 -3
  160. data/lib/capybara/spec/session/html_spec.rb +1 -1
  161. data/lib/capybara/spec/session/matches_style_spec.rb +6 -4
  162. data/lib/capybara/spec/session/node_spec.rb +697 -23
  163. data/lib/capybara/spec/session/node_wrapper_spec.rb +1 -1
  164. data/lib/capybara/spec/session/refresh_spec.rb +2 -1
  165. data/lib/capybara/spec/session/reset_session_spec.rb +21 -7
  166. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +2 -2
  167. data/lib/capybara/spec/session/save_page_spec.rb +4 -4
  168. data/lib/capybara/spec/session/save_screenshot_spec.rb +4 -4
  169. data/lib/capybara/spec/session/scroll_spec.rb +9 -7
  170. data/lib/capybara/spec/session/select_spec.rb +5 -10
  171. data/lib/capybara/spec/session/selectors_spec.rb +24 -3
  172. data/lib/capybara/spec/session/uncheck_spec.rb +3 -3
  173. data/lib/capybara/spec/session/unselect_spec.rb +1 -1
  174. data/lib/capybara/spec/session/visit_spec.rb +20 -0
  175. data/lib/capybara/spec/session/window/become_closed_spec.rb +20 -17
  176. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +1 -1
  177. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +1 -1
  178. data/lib/capybara/spec/session/window/window_spec.rb +54 -57
  179. data/lib/capybara/spec/session/window/windows_spec.rb +2 -2
  180. data/lib/capybara/spec/session/within_spec.rb +36 -0
  181. data/lib/capybara/spec/spec_helper.rb +30 -19
  182. data/lib/capybara/spec/test_app.rb +122 -34
  183. data/lib/capybara/spec/views/animated.erb +49 -0
  184. data/lib/capybara/spec/views/form.erb +86 -8
  185. data/lib/capybara/spec/views/frame_child.erb +3 -2
  186. data/lib/capybara/spec/views/frame_one.erb +2 -1
  187. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  188. data/lib/capybara/spec/views/frame_two.erb +1 -1
  189. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  190. data/lib/capybara/spec/views/layout.erb +10 -0
  191. data/lib/capybara/spec/views/obscured.erb +10 -10
  192. data/lib/capybara/spec/views/offset.erb +33 -0
  193. data/lib/capybara/spec/views/path.erb +2 -2
  194. data/lib/capybara/spec/views/popup_one.erb +1 -1
  195. data/lib/capybara/spec/views/popup_two.erb +1 -1
  196. data/lib/capybara/spec/views/react.erb +45 -0
  197. data/lib/capybara/spec/views/scroll.erb +2 -1
  198. data/lib/capybara/spec/views/spatial.erb +31 -0
  199. data/lib/capybara/spec/views/tables.erb +67 -0
  200. data/lib/capybara/spec/views/with_animation.erb +39 -4
  201. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  202. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  203. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  204. data/lib/capybara/spec/views/with_hover.erb +3 -2
  205. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  206. data/lib/capybara/spec/views/with_html.erb +34 -6
  207. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  208. data/lib/capybara/spec/views/with_js.erb +7 -4
  209. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  210. data/lib/capybara/spec/views/with_namespace.erb +1 -0
  211. data/lib/capybara/spec/views/with_scope.erb +2 -2
  212. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  213. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  214. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  215. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  216. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  217. data/lib/capybara/spec/views/with_windows.erb +1 -1
  218. data/lib/capybara/spec/views/within_frames.erb +1 -1
  219. data/lib/capybara/version.rb +1 -1
  220. data/lib/capybara/window.rb +14 -18
  221. data/lib/capybara.rb +91 -126
  222. data/spec/basic_node_spec.rb +30 -16
  223. data/spec/capybara_spec.rb +40 -28
  224. data/spec/counter_spec.rb +35 -0
  225. data/spec/css_builder_spec.rb +3 -1
  226. data/spec/css_splitter_spec.rb +1 -1
  227. data/spec/dsl_spec.rb +33 -22
  228. data/spec/filter_set_spec.rb +5 -5
  229. data/spec/fixtures/selenium_driver_rspec_failure.rb +3 -3
  230. data/spec/fixtures/selenium_driver_rspec_success.rb +3 -3
  231. data/spec/minitest_spec.rb +24 -2
  232. data/spec/minitest_spec_spec.rb +60 -45
  233. data/spec/per_session_config_spec.rb +1 -1
  234. data/spec/rack_test_spec.rb +131 -98
  235. data/spec/regexp_dissassembler_spec.rb +53 -39
  236. data/spec/result_spec.rb +68 -66
  237. data/spec/rspec/features_spec.rb +9 -4
  238. data/spec/rspec/scenarios_spec.rb +6 -2
  239. data/spec/rspec/shared_spec_matchers.rb +137 -98
  240. data/spec/rspec_matchers_spec.rb +25 -0
  241. data/spec/rspec_spec.rb +23 -21
  242. data/spec/sauce_spec_chrome.rb +43 -0
  243. data/spec/selector_spec.rb +77 -21
  244. data/spec/selenium_spec_chrome.rb +141 -39
  245. data/spec/selenium_spec_chrome_remote.rb +32 -17
  246. data/spec/selenium_spec_edge.rb +36 -8
  247. data/spec/selenium_spec_firefox.rb +110 -68
  248. data/spec/selenium_spec_firefox_remote.rb +22 -15
  249. data/spec/selenium_spec_ie.rb +29 -22
  250. data/spec/selenium_spec_safari.rb +162 -0
  251. data/spec/server_spec.rb +153 -81
  252. data/spec/session_spec.rb +11 -4
  253. data/spec/shared_selenium_node.rb +79 -0
  254. data/spec/shared_selenium_session.rb +179 -74
  255. data/spec/spec_helper.rb +80 -5
  256. data/spec/whitespace_normalizer_spec.rb +54 -0
  257. data/spec/xpath_builder_spec.rb +3 -1
  258. metadata +218 -30
  259. data/lib/capybara/spec/session/source_spec.rb +0 -0
  260. data/lib/capybara/spec/views/with_title.erb +0 -5
@@ -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, &optional_filter_block)
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, &optional_filter_block)
51
57
  rescue Capybara::ExpectationNotMet => e
52
58
  raise ::Minitest::Assertion, e.message
53
59
  end
@@ -61,34 +67,86 @@ 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}
78
88
 
79
- ## Assert element does not match selector
89
+ ##
90
+ # Assert element does not match selector
80
91
  #
81
- # @!method assert_xpath
82
- # see {Capybara::Node::Matchers#assert_not_matches_selector}
92
+ # @!method refute_matches_selector
93
+ # @!method assert_not_matches_selector
94
+ # See {Capybara::Node::Matchers#assert_not_matches_selector}
95
+
96
+ ##
97
+ # Assert all of the provided selectors exist on page
98
+ #
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}
83
107
 
84
- ## Assert element has the provided CSS styles
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}
113
+
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}
119
+
120
+ ##
121
+ # Assert element has a matching sibling
122
+ #
123
+ # @!method assert_sibling
124
+ # See {Capybara::Node::Matchers#assert_sibling}
125
+
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
135
+ #
136
+ # @!method 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}
88
145
 
89
146
  %w[selector no_selector matches_style
90
147
  all_of_selectors none_of_selectors any_of_selectors
91
- matches_selector not_matches_selector].each do |assertion_name|
148
+ matches_selector not_matches_selector
149
+ sibling no_sibling ancestor no_ancestor].each do |assertion_name|
92
150
  class_eval <<-ASSERTION, __FILE__, __LINE__ + 1
93
151
  def assert_#{assertion_name} *args, &optional_filter_block
94
152
  self.assertions +=1
@@ -98,23 +156,158 @@ module Capybara
98
156
  raise ::Minitest::Assertion, e.message
99
157
  end
100
158
  ASSERTION
159
+ ruby2_keywords "assert_#{assertion_name}" if respond_to?(:ruby2_keywords)
101
160
  end
102
161
 
103
162
  alias_method :refute_selector, :assert_no_selector
104
163
  alias_method :refute_matches_selector, :assert_not_matches_selector
164
+ alias_method :refute_ancestor, :assert_no_ancestor
165
+ alias_method :refute_sibling, :assert_no_sibling
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?}
105
185
 
106
- %w[xpath css link button field select table].each do |selector_type|
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 element exists
195
+ #
196
+ # @!method assert_element
197
+ # See {Capybara::Node::Matchers#has_element?}
198
+
199
+ ##
200
+ # Assert that provided element does not exist
201
+ #
202
+ # @!method assert_no_element
203
+ # @!method refute_element
204
+ # See {Capybara::Node::Matchers#has_no_element?}
205
+
206
+ ##
207
+ # Assert that provided link exists
208
+ #
209
+ # @!method assert_link
210
+ # See {Capybara::Node::Matchers#has_link?}
211
+
212
+ ##
213
+ # Assert that provided link does not exist
214
+ #
215
+ # @!method assert_no_link
216
+ # @!method refute_link
217
+ # See {Capybara::Node::Matchers#has_no_link?}
218
+
219
+ ##
220
+ # Assert that provided button exists
221
+ #
222
+ # @!method assert_button
223
+ # See {Capybara::Node::Matchers#has_button?}
224
+
225
+ ##
226
+ # Assert that provided button does not exist
227
+ #
228
+ # @!method refute_button
229
+ # @!method assert_no_button
230
+ # See {Capybara::Node::Matchers#has_no_button?}
231
+
232
+ ##
233
+ # Assert that provided field exists
234
+ #
235
+ # @!method assert_field
236
+ # See {Capybara::Node::Matchers#has_field?}
237
+
238
+ ##
239
+ # Assert that provided field does not exist
240
+ #
241
+ # @!method refute_field
242
+ # @!method assert_no_field
243
+ # See {Capybara::Node::Matchers#has_no_field?}
244
+
245
+ ##
246
+ # Assert that provided checked field exists
247
+ #
248
+ # @!method assert_checked_field
249
+ # See {Capybara::Node::Matchers#has_checked_field?}
250
+
251
+ ##
252
+ # Assert that provided checked_field does not exist
253
+ #
254
+ # @!method assert_no_checked_field
255
+ # @!method refute_checked_field
256
+ # See {Capybara::Node::Matchers#has_no_checked_field?}
257
+
258
+ ##
259
+ # Assert that provided unchecked field exists
260
+ #
261
+ # @!method assert_unchecked_field
262
+ # See {Capybara::Node::Matchers#has_unchecked_field?}
263
+
264
+ ##
265
+ # Assert that provided unchecked field does not exist
266
+ #
267
+ # @!method assert_no_unchecked_field
268
+ # @!method refute_unchecked_field
269
+ # See {Capybara::Node::Matchers#has_no_unchecked_field?}
270
+
271
+ ##
272
+ # Assert that provided select exists
273
+ #
274
+ # @!method assert_select
275
+ # See {Capybara::Node::Matchers#has_select?}
276
+
277
+ ##
278
+ # Assert that provided select does not exist
279
+ #
280
+ # @!method refute_select
281
+ # @!method assert_no_select
282
+ # See {Capybara::Node::Matchers#has_no_select?}
283
+
284
+ ##
285
+ # Assert that provided table exists
286
+ #
287
+ # @!method assert_table
288
+ # See {Capybara::Node::Matchers#has_table?}
289
+
290
+ ##
291
+ # Assert that provided table does not exist
292
+ #
293
+ # @!method refute_table
294
+ # @!method assert_no_table
295
+ # See {Capybara::Node::Matchers#has_no_table?}
296
+
297
+ %w[xpath css element link button field select table].each do |selector_type|
107
298
  define_method "assert_#{selector_type}" do |*args, &optional_filter_block|
108
299
  subject, args = determine_subject(args)
109
300
  locator, options = extract_locator(args)
110
- assert_selector(subject, selector_type.to_sym, locator, options, &optional_filter_block)
301
+ assert_selector(subject, selector_type.to_sym, locator, **options, &optional_filter_block)
111
302
  end
303
+ ruby2_keywords "assert_#{selector_type}" if respond_to?(:ruby2_keywords)
112
304
 
113
305
  define_method "assert_no_#{selector_type}" do |*args, &optional_filter_block|
114
306
  subject, args = determine_subject(args)
115
307
  locator, options = extract_locator(args)
116
- assert_no_selector(subject, selector_type.to_sym, locator, options, &optional_filter_block)
308
+ assert_no_selector(subject, selector_type.to_sym, locator, **options, &optional_filter_block)
117
309
  end
310
+ ruby2_keywords "assert_no_#{selector_type}" if respond_to?(:ruby2_keywords)
118
311
  alias_method "refute_#{selector_type}", "assert_no_#{selector_type}"
119
312
  end
120
313
 
@@ -122,145 +315,66 @@ module Capybara
122
315
  define_method "assert_#{field_type}_field" do |*args, &optional_filter_block|
123
316
  subject, args = determine_subject(args)
124
317
  locator, options = extract_locator(args)
125
- assert_selector(subject, :field, locator, options.merge(field_type.to_sym => true), &optional_filter_block)
318
+ assert_selector(subject, :field, locator, **options.merge(field_type.to_sym => true), &optional_filter_block)
126
319
  end
320
+ ruby2_keywords "assert_#{field_type}_field" if respond_to?(:ruby2_keywords)
127
321
 
128
322
  define_method "assert_no_#{field_type}_field" do |*args, &optional_filter_block|
129
323
  subject, args = determine_subject(args)
130
324
  locator, options = extract_locator(args)
131
- assert_no_selector(subject, :field, locator, options.merge(field_type.to_sym => true), &optional_filter_block)
325
+ assert_no_selector(
326
+ subject,
327
+ :field,
328
+ locator,
329
+ **options.merge(field_type.to_sym => true),
330
+ &optional_filter_block
331
+ )
132
332
  end
333
+ ruby2_keywords "assert_no_#{field_type}_field" if respond_to?(:ruby2_keywords)
133
334
  alias_method "refute_#{field_type}_field", "assert_no_#{field_type}_field"
134
335
  end
135
336
 
337
+ ##
338
+ # Assert that element matches xpath
339
+ #
340
+ # @!method assert_matches_xpath
341
+ # See {Capybara::Node::Matchers#matches_xpath?}
342
+
343
+ ##
344
+ # Assert that element does not match xpath
345
+ #
346
+ # @!method refute_matches_xpath
347
+ # @!method assert_not_matches_xpath
348
+ # See {Capybara::Node::Matchers#not_matches_xpath?}
349
+
350
+ ##
351
+ # Assert that element matches css
352
+ #
353
+ # @!method assert_matches_css
354
+ # See {Capybara::Node::Matchers#matches_css?}
355
+
356
+ ##
357
+ # Assert that element matches css
358
+ #
359
+ # @!method refute_matches_css
360
+ # @!method assert_not_matches_css
361
+ # See {Capybara::Node::Matchers#not_matches_css?}
362
+
136
363
  %w[xpath css].each do |selector_type|
137
364
  define_method "assert_matches_#{selector_type}" do |*args, &optional_filter_block|
138
365
  subject, args = determine_subject(args)
139
366
  assert_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
140
367
  end
368
+ ruby2_keywords "assert_matches_#{selector_type}" if respond_to?(:ruby2_keywords)
141
369
 
142
370
  define_method "assert_not_matches_#{selector_type}" do |*args, &optional_filter_block|
143
371
  subject, args = determine_subject(args)
144
372
  assert_not_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
145
373
  end
374
+ ruby2_keywords "assert_not_matches_#{selector_type}" if respond_to?(:ruby2_keywords)
146
375
  alias_method "refute_matches_#{selector_type}", "assert_not_matches_#{selector_type}"
147
376
  end
148
377
 
149
- ##
150
- # Assertion that there is xpath
151
- #
152
- # @!method assert_xpath
153
- # see Capybara::Node::Matchers#has_xpath?
154
-
155
- ##
156
- # Assertion that there is no xpath
157
- #
158
- # @!method refute_xpath
159
- # @!method assert_no_xpath
160
- # see Capybara::Node::Matchers#has_no_xpath?
161
-
162
- ##
163
- # Assertion that there is css
164
- #
165
- # @!method assert_css
166
- # see Capybara::Node::Matchers#has_css?
167
-
168
- ##
169
- # Assertion that there is no css
170
- #
171
- # @!method refute_css
172
- # @!method assert_no_css
173
- # see Capybara::Node::Matchers#has_no_css?
174
-
175
- ##
176
- # Assertion that there is link
177
- #
178
- # @!method assert_link
179
- # see {Capybara::Node::Matchers#has_link?}
180
-
181
- ##
182
- # Assertion that there is no link
183
- #
184
- # @!method assert_no_link
185
- # @!method refute_link
186
- # see {Capybara::Node::Matchers#has_no_link?}
187
-
188
- ##
189
- # Assertion that there is button
190
- #
191
- # @!method assert_button
192
- # see {Capybara::Node::Matchers#has_button?}
193
-
194
- ##
195
- # Assertion that there is no button
196
- #
197
- # @!method refute_button
198
- # @!method assert_no_button
199
- # see {Capybara::Node::Matchers#has_no_button?}
200
-
201
- ##
202
- # Assertion that there is field
203
- #
204
- # @!method assert_field
205
- # see {Capybara::Node::Matchers#has_field?}
206
-
207
- ##
208
- # Assertion that there is no field
209
- #
210
- # @!method refute_field
211
- # @!method assert_no_field
212
- # see {Capybara::Node::Matchers#has_no_field?}
213
-
214
- ##
215
- # Assertion that there is checked_field
216
- #
217
- # @!method assert_checked_field
218
- # see {Capybara::Node::Matchers#has_checked_field?}
219
-
220
- ##
221
- # Assertion that there is no checked_field
222
- #
223
- # @!method assert_no_checked_field
224
- # @!method refute_checked_field
225
-
226
- ##
227
- # Assertion that there is unchecked_field
228
- #
229
- # @!method assert_unchecked_field
230
- # see {Capybara::Node::Matchers#has_unchecked_field?}
231
-
232
- ##
233
- # Assertion that there is no unchecked_field
234
- #
235
- # @!method assert_no_unchecked_field
236
- # @!method refute_unchecked_field
237
-
238
- ##
239
- # Assertion that there is select
240
- #
241
- # @!method assert_select
242
- # see {Capybara::Node::Matchers#has_select?}
243
-
244
- ##
245
- # Assertion that there is no select
246
- #
247
- # @!method refute_select
248
- # @!method assert_no_select
249
- # see {Capybara::Node::Matchers#has_no_select?}
250
-
251
- ##
252
- # Assertion that there is table
253
- #
254
- # @!method assert_table
255
- # see {Capybara::Node::Matchers#has_table?}
256
-
257
- ##
258
- # Assertion that there is no table
259
- #
260
- # @!method refute_table
261
- # @!method assert_no_table
262
- # see {Capybara::Node::Matchers#has_no_table?}
263
-
264
378
  private
265
379
 
266
380
  def determine_subject(args)