capybara 2.18.0 → 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 (316) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/History.md +945 -12
  4. data/License.txt +1 -1
  5. data/README.md +264 -90
  6. data/lib/capybara/config.rb +29 -57
  7. data/lib/capybara/cucumber.rb +2 -3
  8. data/lib/capybara/driver/base.rb +35 -18
  9. data/lib/capybara/driver/node.rb +40 -10
  10. data/lib/capybara/dsl.rb +10 -7
  11. data/lib/capybara/helpers.rb +70 -31
  12. data/lib/capybara/minitest/spec.rb +185 -83
  13. data/lib/capybara/minitest.rb +232 -112
  14. data/lib/capybara/node/actions.rb +274 -171
  15. data/lib/capybara/node/base.rb +42 -34
  16. data/lib/capybara/node/document.rb +15 -3
  17. data/lib/capybara/node/document_matchers.rb +19 -21
  18. data/lib/capybara/node/element.rb +362 -135
  19. data/lib/capybara/node/finders.rb +151 -137
  20. data/lib/capybara/node/matchers.rb +394 -209
  21. data/lib/capybara/node/simple.rb +59 -26
  22. data/lib/capybara/node/whitespace_normalizer.rb +81 -0
  23. data/lib/capybara/queries/active_element_query.rb +18 -0
  24. data/lib/capybara/queries/ancestor_query.rb +12 -9
  25. data/lib/capybara/queries/base_query.rb +39 -28
  26. data/lib/capybara/queries/current_path_query.rb +21 -27
  27. data/lib/capybara/queries/match_query.rb +14 -7
  28. data/lib/capybara/queries/selector_query.rb +659 -149
  29. data/lib/capybara/queries/sibling_query.rb +11 -9
  30. data/lib/capybara/queries/style_query.rb +45 -0
  31. data/lib/capybara/queries/text_query.rb +56 -38
  32. data/lib/capybara/queries/title_query.rb +8 -11
  33. data/lib/capybara/rack_test/browser.rb +114 -42
  34. data/lib/capybara/rack_test/css_handlers.rb +6 -4
  35. data/lib/capybara/rack_test/driver.rb +22 -17
  36. data/lib/capybara/rack_test/errors.rb +6 -0
  37. data/lib/capybara/rack_test/form.rb +93 -58
  38. data/lib/capybara/rack_test/node.rb +184 -81
  39. data/lib/capybara/rails.rb +3 -7
  40. data/lib/capybara/registration_container.rb +41 -0
  41. data/lib/capybara/registrations/drivers.rb +42 -0
  42. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  43. data/lib/capybara/registrations/servers.rb +66 -0
  44. data/lib/capybara/result.rb +97 -63
  45. data/lib/capybara/rspec/features.rb +17 -50
  46. data/lib/capybara/rspec/matcher_proxies.rb +52 -15
  47. data/lib/capybara/rspec/matchers/base.rb +113 -0
  48. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  49. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  50. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  51. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  52. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  53. data/lib/capybara/rspec/matchers/have_selector.rb +69 -0
  54. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  55. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  56. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  57. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  58. data/lib/capybara/rspec/matchers/match_style.rb +43 -0
  59. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  60. data/lib/capybara/rspec/matchers.rb +146 -310
  61. data/lib/capybara/rspec.rb +7 -11
  62. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  63. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  64. data/lib/capybara/selector/css.rb +85 -13
  65. data/lib/capybara/selector/definition/button.rb +68 -0
  66. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  67. data/lib/capybara/selector/definition/css.rb +10 -0
  68. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  69. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  70. data/lib/capybara/selector/definition/element.rb +28 -0
  71. data/lib/capybara/selector/definition/field.rb +40 -0
  72. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  73. data/lib/capybara/selector/definition/file_field.rb +13 -0
  74. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  75. data/lib/capybara/selector/definition/frame.rb +17 -0
  76. data/lib/capybara/selector/definition/id.rb +6 -0
  77. data/lib/capybara/selector/definition/label.rb +62 -0
  78. data/lib/capybara/selector/definition/link.rb +55 -0
  79. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  80. data/lib/capybara/selector/definition/option.rb +27 -0
  81. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  82. data/lib/capybara/selector/definition/select.rb +81 -0
  83. data/lib/capybara/selector/definition/table.rb +109 -0
  84. data/lib/capybara/selector/definition/table_row.rb +21 -0
  85. data/lib/capybara/selector/definition/xpath.rb +5 -0
  86. data/lib/capybara/selector/definition.rb +280 -0
  87. data/lib/capybara/selector/filter.rb +2 -17
  88. data/lib/capybara/selector/filter_set.rb +80 -33
  89. data/lib/capybara/selector/filters/base.rb +50 -6
  90. data/lib/capybara/selector/filters/expression_filter.rb +8 -26
  91. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  92. data/lib/capybara/selector/filters/node_filter.rb +16 -12
  93. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  94. data/lib/capybara/selector/selector.rb +93 -210
  95. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  96. data/lib/capybara/selector.rb +475 -523
  97. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  98. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  99. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  100. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  101. data/lib/capybara/selenium/driver.rb +298 -267
  102. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  103. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
  104. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
  105. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  106. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  107. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  108. data/lib/capybara/selenium/extensions/find.rb +110 -0
  109. data/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
  110. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  111. data/lib/capybara/selenium/extensions/scroll.rb +76 -0
  112. data/lib/capybara/selenium/node.rb +517 -145
  113. data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
  114. data/lib/capybara/selenium/nodes/edge_node.rb +110 -0
  115. data/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
  116. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  117. data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
  118. data/lib/capybara/selenium/patches/atoms.rb +18 -0
  119. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  120. data/lib/capybara/selenium/patches/logs.rb +45 -0
  121. data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
  122. data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  123. data/lib/capybara/server/animation_disabler.rb +80 -0
  124. data/lib/capybara/server/checker.rb +44 -0
  125. data/lib/capybara/server/middleware.rb +71 -0
  126. data/lib/capybara/server.rb +59 -67
  127. data/lib/capybara/session/config.rb +81 -67
  128. data/lib/capybara/session/matchers.rb +28 -20
  129. data/lib/capybara/session.rb +337 -365
  130. data/lib/capybara/spec/public/jquery.js +5 -5
  131. data/lib/capybara/spec/public/offset.js +6 -0
  132. data/lib/capybara/spec/public/test.js +151 -12
  133. data/lib/capybara/spec/session/accept_alert_spec.rb +12 -11
  134. data/lib/capybara/spec/session/accept_confirm_spec.rb +6 -5
  135. data/lib/capybara/spec/session/accept_prompt_spec.rb +10 -10
  136. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  137. data/lib/capybara/spec/session/all_spec.rb +161 -57
  138. data/lib/capybara/spec/session/ancestor_spec.rb +27 -24
  139. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +68 -38
  140. data/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
  141. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  142. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  143. data/lib/capybara/spec/session/assert_text_spec.rb +258 -0
  144. data/lib/capybara/spec/session/{assert_title.rb → assert_title_spec.rb} +22 -12
  145. data/lib/capybara/spec/session/attach_file_spec.rb +144 -69
  146. data/lib/capybara/spec/session/body_spec.rb +12 -13
  147. data/lib/capybara/spec/session/check_spec.rb +117 -55
  148. data/lib/capybara/spec/session/choose_spec.rb +64 -31
  149. data/lib/capybara/spec/session/click_button_spec.rb +231 -173
  150. data/lib/capybara/spec/session/click_link_or_button_spec.rb +55 -35
  151. data/lib/capybara/spec/session/click_link_spec.rb +93 -58
  152. data/lib/capybara/spec/session/current_scope_spec.rb +12 -11
  153. data/lib/capybara/spec/session/current_url_spec.rb +57 -39
  154. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +4 -4
  155. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +3 -2
  156. data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +11 -9
  157. data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
  158. data/lib/capybara/spec/session/element/match_xpath_spec.rb +9 -7
  159. data/lib/capybara/spec/session/element/matches_selector_spec.rb +71 -57
  160. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +8 -7
  161. data/lib/capybara/spec/session/evaluate_script_spec.rb +29 -8
  162. data/lib/capybara/spec/session/execute_script_spec.rb +10 -8
  163. data/lib/capybara/spec/session/fill_in_spec.rb +134 -43
  164. data/lib/capybara/spec/session/find_button_spec.rb +25 -24
  165. data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
  166. data/lib/capybara/spec/session/find_field_spec.rb +37 -41
  167. data/lib/capybara/spec/session/find_link_spec.rb +46 -17
  168. data/lib/capybara/spec/session/find_spec.rb +260 -145
  169. data/lib/capybara/spec/session/first_spec.rb +80 -52
  170. data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
  171. data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
  172. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +33 -20
  173. data/lib/capybara/spec/session/frame/within_frame_spec.rb +52 -32
  174. data/lib/capybara/spec/session/go_back_spec.rb +2 -1
  175. data/lib/capybara/spec/session/go_forward_spec.rb +2 -1
  176. data/lib/capybara/spec/session/has_all_selectors_spec.rb +31 -31
  177. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  178. data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
  179. data/lib/capybara/spec/session/has_button_spec.rb +100 -13
  180. data/lib/capybara/spec/session/has_css_spec.rb +272 -137
  181. data/lib/capybara/spec/session/has_current_path_spec.rb +60 -61
  182. data/lib/capybara/spec/session/has_element_spec.rb +47 -0
  183. data/lib/capybara/spec/session/has_field_spec.rb +139 -59
  184. data/lib/capybara/spec/session/has_link_spec.rb +47 -6
  185. data/lib/capybara/spec/session/has_none_selectors_spec.rb +42 -40
  186. data/lib/capybara/spec/session/has_select_spec.rb +107 -72
  187. data/lib/capybara/spec/session/has_selector_spec.rb +120 -71
  188. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  189. data/lib/capybara/spec/session/has_table_spec.rb +183 -5
  190. data/lib/capybara/spec/session/has_text_spec.rb +106 -62
  191. data/lib/capybara/spec/session/has_title_spec.rb +20 -14
  192. data/lib/capybara/spec/session/has_xpath_spec.rb +57 -38
  193. data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +3 -2
  194. data/lib/capybara/spec/session/html_spec.rb +14 -6
  195. data/lib/capybara/spec/session/matches_style_spec.rb +37 -0
  196. data/lib/capybara/spec/session/node_spec.rb +1024 -153
  197. data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  198. data/lib/capybara/spec/session/refresh_spec.rb +12 -6
  199. data/lib/capybara/spec/session/reset_session_spec.rb +82 -35
  200. data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +2 -1
  201. data/lib/capybara/spec/session/save_and_open_page_spec.rb +3 -2
  202. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +8 -12
  203. data/lib/capybara/spec/session/save_page_spec.rb +42 -55
  204. data/lib/capybara/spec/session/save_screenshot_spec.rb +16 -14
  205. data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
  206. data/lib/capybara/spec/session/scroll_spec.rb +119 -0
  207. data/lib/capybara/spec/session/select_spec.rb +107 -81
  208. data/lib/capybara/spec/session/selectors_spec.rb +52 -19
  209. data/lib/capybara/spec/session/sibling_spec.rb +10 -10
  210. data/lib/capybara/spec/session/text_spec.rb +37 -21
  211. data/lib/capybara/spec/session/title_spec.rb +17 -5
  212. data/lib/capybara/spec/session/uncheck_spec.rb +43 -23
  213. data/lib/capybara/spec/session/unselect_spec.rb +39 -38
  214. data/lib/capybara/spec/session/visit_spec.rb +85 -53
  215. data/lib/capybara/spec/session/window/become_closed_spec.rb +24 -20
  216. data/lib/capybara/spec/session/window/current_window_spec.rb +5 -3
  217. data/lib/capybara/spec/session/window/open_new_window_spec.rb +5 -3
  218. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +27 -22
  219. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +12 -6
  220. data/lib/capybara/spec/session/window/window_spec.rb +97 -63
  221. data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
  222. data/lib/capybara/spec/session/window/within_window_spec.rb +31 -86
  223. data/lib/capybara/spec/session/within_spec.rb +83 -44
  224. data/lib/capybara/spec/spec_helper.rb +54 -44
  225. data/lib/capybara/spec/test_app.rb +158 -43
  226. data/lib/capybara/spec/views/animated.erb +49 -0
  227. data/lib/capybara/spec/views/form.erb +163 -42
  228. data/lib/capybara/spec/views/frame_child.erb +4 -3
  229. data/lib/capybara/spec/views/frame_one.erb +2 -1
  230. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  231. data/lib/capybara/spec/views/frame_two.erb +1 -1
  232. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  233. data/lib/capybara/spec/views/layout.erb +10 -0
  234. data/lib/capybara/spec/views/obscured.erb +47 -0
  235. data/lib/capybara/spec/views/offset.erb +33 -0
  236. data/lib/capybara/spec/views/path.erb +2 -2
  237. data/lib/capybara/spec/views/popup_one.erb +1 -1
  238. data/lib/capybara/spec/views/popup_two.erb +1 -1
  239. data/lib/capybara/spec/views/react.erb +45 -0
  240. data/lib/capybara/spec/views/scroll.erb +21 -0
  241. data/lib/capybara/spec/views/spatial.erb +31 -0
  242. data/lib/capybara/spec/views/tables.erb +68 -1
  243. data/lib/capybara/spec/views/with_animation.erb +81 -0
  244. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  245. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  246. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  247. data/lib/capybara/spec/views/with_hover.erb +3 -2
  248. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  249. data/lib/capybara/spec/views/with_html.erb +69 -12
  250. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  251. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  252. data/lib/capybara/spec/views/with_js.erb +30 -5
  253. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  254. data/lib/capybara/spec/views/with_namespace.erb +21 -0
  255. data/lib/capybara/spec/views/with_scope.erb +2 -2
  256. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  257. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  258. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  259. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  260. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  261. data/lib/capybara/spec/views/with_windows.erb +1 -1
  262. data/lib/capybara/spec/views/within_frames.erb +5 -2
  263. data/lib/capybara/version.rb +2 -1
  264. data/lib/capybara/window.rb +36 -34
  265. data/lib/capybara.rb +134 -107
  266. data/spec/basic_node_spec.rb +60 -34
  267. data/spec/capybara_spec.rb +63 -88
  268. data/spec/counter_spec.rb +35 -0
  269. data/spec/css_builder_spec.rb +101 -0
  270. data/spec/css_splitter_spec.rb +38 -0
  271. data/spec/dsl_spec.rb +85 -64
  272. data/spec/filter_set_spec.rb +27 -9
  273. data/spec/fixtures/certificate.pem +25 -0
  274. data/spec/fixtures/key.pem +27 -0
  275. data/spec/fixtures/selenium_driver_rspec_failure.rb +6 -5
  276. data/spec/fixtures/selenium_driver_rspec_success.rb +6 -5
  277. data/spec/minitest_spec.rb +52 -7
  278. data/spec/minitest_spec_spec.rb +94 -63
  279. data/spec/per_session_config_spec.rb +14 -13
  280. data/spec/rack_test_spec.rb +194 -125
  281. data/spec/regexp_dissassembler_spec.rb +250 -0
  282. data/spec/result_spec.rb +111 -50
  283. data/spec/rspec/features_spec.rb +37 -31
  284. data/spec/rspec/scenarios_spec.rb +10 -8
  285. data/spec/rspec/shared_spec_matchers.rb +473 -422
  286. data/spec/rspec/views_spec.rb +5 -3
  287. data/spec/rspec_matchers_spec.rb +52 -11
  288. data/spec/rspec_spec.rb +109 -89
  289. data/spec/sauce_spec_chrome.rb +43 -0
  290. data/spec/selector_spec.rb +397 -68
  291. data/spec/selenium_spec_chrome.rb +187 -40
  292. data/spec/selenium_spec_chrome_remote.rb +96 -0
  293. data/spec/selenium_spec_edge.rb +60 -0
  294. data/spec/selenium_spec_firefox.rb +201 -41
  295. data/spec/selenium_spec_firefox_remote.rb +94 -0
  296. data/spec/selenium_spec_ie.rb +149 -0
  297. data/spec/selenium_spec_safari.rb +162 -0
  298. data/spec/server_spec.rb +213 -102
  299. data/spec/session_spec.rb +53 -16
  300. data/spec/shared_selenium_node.rb +79 -0
  301. data/spec/shared_selenium_session.rb +473 -122
  302. data/spec/spec_helper.rb +126 -7
  303. data/spec/whitespace_normalizer_spec.rb +54 -0
  304. data/spec/xpath_builder_spec.rb +93 -0
  305. metadata +355 -73
  306. data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
  307. data/.yard/templates_custom/default/class/html/setup.rb +0 -17
  308. data/.yard/yard_extensions.rb +0 -78
  309. data/lib/capybara/query.rb +0 -7
  310. data/lib/capybara/rspec/compound.rb +0 -95
  311. data/lib/capybara/spec/session/assert_current_path.rb +0 -72
  312. data/lib/capybara/spec/session/assert_selector.rb +0 -148
  313. data/lib/capybara/spec/session/assert_text.rb +0 -234
  314. data/lib/capybara/spec/session/source_spec.rb +0 -0
  315. data/lib/capybara/spec/views/with_title.erb +0 -5
  316. data/spec/selenium_spec_marionette.rb +0 -127
@@ -1,57 +1,63 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'minitest'
3
4
  require 'capybara/dsl'
4
5
 
5
6
  module Capybara
6
7
  module Minitest
7
8
  module Assertions
8
- ## Assert text exists
9
+ ##
10
+ # Assert text exists
9
11
  #
12
+ # @!method assert_content
10
13
  # @!method assert_text
11
- # see {Capybara::Node::Matchers#assert_text}
14
+ # See {Capybara::Node::Matchers#assert_text}
12
15
 
13
- ## Assert text does not exist
16
+ ##
17
+ # Assert text does not exist
14
18
  #
19
+ # @!method refute_content
20
+ # @!method assert_no_content
21
+ # @!method refute_text
15
22
  # @!method assert_no_text
16
- # see {Capybara::Node::Matchers#assert_no_text}
23
+ # See {Capybara::Node::Matchers#assert_no_text}
17
24
 
18
25
  ##
19
26
  # Assertion that page title does match
20
27
  #
21
28
  # @!method assert_title
22
- # see {Capybara::Node::DocumentMatchers#assert_title}
29
+ # See {Capybara::Node::DocumentMatchers#assert_title}
23
30
 
24
31
  ##
25
32
  # Assertion that page title does not match
26
33
  #
27
34
  # @!method refute_title
28
35
  # @!method assert_no_title
29
- # see {Capybara::Node::DocumentMatchers#assert_no_title}
36
+ # See {Capybara::Node::DocumentMatchers#assert_no_title}
30
37
 
31
38
  ##
32
39
  # Assertion that current path matches
33
40
  #
34
41
  # @!method assert_current_path
35
- # see {Capybara::SessionMatchers#assert_current_path}
42
+ # See {Capybara::SessionMatchers#assert_current_path}
36
43
 
37
44
  ##
38
45
  # Assertion that current page does not match
39
46
  #
40
47
  # @!method refute_current_path
41
48
  # @!method assert_no_current_path
42
- # see {Capybara::SessionMatchers#assert_no_current_path}
43
-
49
+ # See {Capybara::SessionMatchers#assert_no_current_path}
44
50
 
45
- %w(assert_text assert_no_text assert_title assert_no_title assert_current_path assert_no_current_path).each do |assertion_name|
46
- self.class_eval <<-EOM, __FILE__, __LINE__ + 1
47
- def #{assertion_name} *args
51
+ %w[text no_text title no_title current_path no_current_path].each do |assertion_name|
52
+ class_eval <<-ASSERTION, __FILE__, __LINE__ + 1
53
+ def assert_#{assertion_name}(*args, **kwargs, &optional_filter_block)
48
54
  self.assertions +=1
49
- subject, *args = determine_subject(args)
50
- subject.#{assertion_name}(*args)
55
+ subject, args = determine_subject(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
54
- EOM
60
+ ASSERTION
55
61
  end
56
62
 
57
63
  alias_method :refute_title, :assert_no_title
@@ -61,210 +67,324 @@ 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}
83
95
 
84
- %w(assert_selector assert_no_selector
85
- assert_all_of_selectors assert_none_of_selectors
86
- assert_matches_selector assert_not_matches_selector).each do |assertion_name|
87
- self.class_eval <<-EOM, __FILE__, __LINE__ + 1
88
- def #{assertion_name} *args, &optional_filter_block
89
- self.assertions +=1
90
- subject, *args = determine_subject(args)
91
- subject.#{assertion_name}(*args, &optional_filter_block)
92
- rescue Capybara::ExpectationNotMet => e
93
- raise ::Minitest::Assertion, e.message
94
- end
95
- EOM
96
- end
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}
97
101
 
98
- alias_method :refute_selector, :assert_no_selector
99
- alias_method :refute_matches_selector, :assert_not_matches_selector
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}
100
107
 
101
- %w(xpath css link button field select table).each do |selector_type|
102
- define_method "assert_#{selector_type}" do |*args, &optional_filter_block|
103
- subject, *args = determine_subject(args)
104
- locator, options = extract_locator(args)
105
- assert_selector(subject, selector_type.to_sym, locator, options, &optional_filter_block)
106
- end
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}
107
113
 
108
- define_method "assert_no_#{selector_type}" do |*args, &optional_filter_block|
109
- subject, *args = determine_subject(args)
110
- locator, options = extract_locator(args)
111
- assert_no_selector(subject, selector_type.to_sym, locator, options, &optional_filter_block)
112
- end
113
- alias_method "refute_#{selector_type}", "assert_no_#{selector_type}"
114
- end
114
+ ##
115
+ # Assert element has the provided CSS styles
116
+ #
117
+ # @!method assert_matches_style
118
+ # See {Capybara::Node::Matchers#assert_matches_style}
115
119
 
116
- %w(checked unchecked).each do |field_type|
117
- define_method "assert_#{field_type}_field" do |*args, &optional_filter_block|
118
- subject, *args = determine_subject(args)
119
- locator, options = extract_locator(args)
120
- assert_selector(subject, :field, locator, options.merge(field_type.to_sym => true), &optional_filter_block)
121
- end
120
+ ##
121
+ # Assert element has a matching sibling
122
+ #
123
+ # @!method assert_sibling
124
+ # See {Capybara::Node::Matchers#assert_sibling}
122
125
 
123
- define_method "assert_no_#{field_type}_field" do |*args, &optional_filter_block|
124
- subject, *args = determine_subject(args)
125
- locator, options = extract_locator(args)
126
- assert_no_selector(subject, :field, locator, options.merge(field_type.to_sym => true), &optional_filter_block)
127
- end
128
- alias_method "refute_#{field_type}_field", "assert_no_#{field_type}_field"
129
- end
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}
130
132
 
131
- %w(xpath css).each do |selector_type|
132
- define_method "assert_matches_#{selector_type}" do |*args, &optional_filter_block|
133
- subject, *args = determine_subject(args)
134
- assert_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
135
- end
133
+ ##
134
+ # Assert element has a matching ancestor
135
+ #
136
+ # @!method assert_ancestor
137
+ # See {Capybara::Node::Matchers#assert_ancestor}
136
138
 
137
- define_method "assert_not_matches_#{selector_type}" do |*args, &optional_filter_block|
138
- subject, *args = determine_subject(args)
139
- assert_not_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
140
- end
141
- alias_method "refute_matches_#{selector_type}", "assert_not_matches_#{selector_type}"
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}
145
+
146
+ %w[selector no_selector matches_style
147
+ all_of_selectors none_of_selectors any_of_selectors
148
+ matches_selector not_matches_selector
149
+ sibling no_sibling ancestor no_ancestor].each do |assertion_name|
150
+ class_eval <<-ASSERTION, __FILE__, __LINE__ + 1
151
+ def assert_#{assertion_name} *args, &optional_filter_block
152
+ self.assertions +=1
153
+ subject, args = determine_subject(args)
154
+ subject.assert_#{assertion_name}(*args, &optional_filter_block)
155
+ rescue Capybara::ExpectationNotMet => e
156
+ raise ::Minitest::Assertion, e.message
157
+ end
158
+ ASSERTION
159
+ ruby2_keywords "assert_#{assertion_name}" if respond_to?(:ruby2_keywords)
142
160
  end
143
161
 
162
+ alias_method :refute_selector, :assert_no_selector
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
144
166
 
145
167
  ##
146
- # Assertion that there is xpath
168
+ # Assert that provided xpath exists
147
169
  #
148
170
  # @!method assert_xpath
149
- # see Capybara::Node::Matchers#has_xpath?
171
+ # See {Capybara::Node::Matchers#has_xpath?}
150
172
 
151
173
  ##
152
- # Assertion that there is no xpath
174
+ # Assert that provide xpath does not exist
153
175
  #
154
176
  # @!method refute_xpath
155
177
  # @!method assert_no_xpath
156
- # see Capybara::Node::Matchers#has_no_xpath?
178
+ # See {Capybara::Node::Matchers#has_no_xpath?}
157
179
 
158
180
  ##
159
- # Assertion that there is css
181
+ # Assert that provided css exists
160
182
  #
161
183
  # @!method assert_css
162
- # see Capybara::Node::Matchers#has_css?
184
+ # See {Capybara::Node::Matchers#has_css?}
163
185
 
164
186
  ##
165
- # Assertion that there is no css
187
+ # Assert that provided css does not exist
166
188
  #
167
189
  # @!method refute_css
168
190
  # @!method assert_no_css
169
- # see Capybara::Node::Matchers#has_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?}
170
198
 
171
199
  ##
172
- # Assertion that there is link
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
173
208
  #
174
209
  # @!method assert_link
175
- # see {Capybara::Node::Matchers#has_link?}
210
+ # See {Capybara::Node::Matchers#has_link?}
176
211
 
177
212
  ##
178
- # Assertion that there is no link
213
+ # Assert that provided link does not exist
179
214
  #
180
215
  # @!method assert_no_link
181
216
  # @!method refute_link
182
- # see {Capybara::Node::Matchers#has_no_link?}
217
+ # See {Capybara::Node::Matchers#has_no_link?}
183
218
 
184
219
  ##
185
- # Assertion that there is button
220
+ # Assert that provided button exists
186
221
  #
187
222
  # @!method assert_button
188
- # see {Capybara::Node::Matchers#has_button?}
223
+ # See {Capybara::Node::Matchers#has_button?}
189
224
 
190
225
  ##
191
- # Assertion that there is no button
226
+ # Assert that provided button does not exist
192
227
  #
193
228
  # @!method refute_button
194
229
  # @!method assert_no_button
195
- # see {Capybara::Node::Matchers#has_no_button?}
230
+ # See {Capybara::Node::Matchers#has_no_button?}
196
231
 
197
232
  ##
198
- # Assertion that there is field
233
+ # Assert that provided field exists
199
234
  #
200
235
  # @!method assert_field
201
- # see {Capybara::Node::Matchers#has_field?}
236
+ # See {Capybara::Node::Matchers#has_field?}
202
237
 
203
238
  ##
204
- # Assertion that there is no field
239
+ # Assert that provided field does not exist
205
240
  #
206
241
  # @!method refute_field
207
242
  # @!method assert_no_field
208
- # see {Capybara::Node::Matchers#has_no_field?}
243
+ # See {Capybara::Node::Matchers#has_no_field?}
209
244
 
210
245
  ##
211
- # Assertion that there is checked_field
246
+ # Assert that provided checked field exists
212
247
  #
213
248
  # @!method assert_checked_field
214
- # see {Capybara::Node::Matchers#has_checked_field?}
249
+ # See {Capybara::Node::Matchers#has_checked_field?}
215
250
 
216
251
  ##
217
- # Assertion that there is no checked_field
252
+ # Assert that provided checked_field does not exist
218
253
  #
219
254
  # @!method assert_no_checked_field
220
255
  # @!method refute_checked_field
256
+ # See {Capybara::Node::Matchers#has_no_checked_field?}
221
257
 
222
258
  ##
223
- # Assertion that there is unchecked_field
259
+ # Assert that provided unchecked field exists
224
260
  #
225
261
  # @!method assert_unchecked_field
226
- # see {Capybara::Node::Matchers#has_unchecked_field?}
262
+ # See {Capybara::Node::Matchers#has_unchecked_field?}
227
263
 
228
264
  ##
229
- # Assertion that there is no unchecked_field
265
+ # Assert that provided unchecked field does not exist
230
266
  #
231
267
  # @!method assert_no_unchecked_field
232
268
  # @!method refute_unchecked_field
269
+ # See {Capybara::Node::Matchers#has_no_unchecked_field?}
233
270
 
234
271
  ##
235
- # Assertion that there is select
272
+ # Assert that provided select exists
236
273
  #
237
274
  # @!method assert_select
238
- # see {Capybara::Node::Matchers#has_select?}
275
+ # See {Capybara::Node::Matchers#has_select?}
239
276
 
240
277
  ##
241
- # Assertion that there is no select
278
+ # Assert that provided select does not exist
242
279
  #
243
280
  # @!method refute_select
244
281
  # @!method assert_no_select
245
- # see {Capybara::Node::Matchers#has_no_select?}
282
+ # See {Capybara::Node::Matchers#has_no_select?}
246
283
 
247
284
  ##
248
- # Assertion that there is table
285
+ # Assert that provided table exists
249
286
  #
250
287
  # @!method assert_table
251
- # see {Capybara::Node::Matchers#has_table?}
288
+ # See {Capybara::Node::Matchers#has_table?}
252
289
 
253
290
  ##
254
- # Assertion that there is no table
291
+ # Assert that provided table does not exist
255
292
  #
256
293
  # @!method refute_table
257
294
  # @!method assert_no_table
258
- # see {Capybara::Node::Matchers#has_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|
298
+ define_method "assert_#{selector_type}" do |*args, &optional_filter_block|
299
+ subject, args = determine_subject(args)
300
+ locator, options = extract_locator(args)
301
+ assert_selector(subject, selector_type.to_sym, locator, **options, &optional_filter_block)
302
+ end
303
+ ruby2_keywords "assert_#{selector_type}" if respond_to?(:ruby2_keywords)
304
+
305
+ define_method "assert_no_#{selector_type}" do |*args, &optional_filter_block|
306
+ subject, args = determine_subject(args)
307
+ locator, options = extract_locator(args)
308
+ assert_no_selector(subject, selector_type.to_sym, locator, **options, &optional_filter_block)
309
+ end
310
+ ruby2_keywords "assert_no_#{selector_type}" if respond_to?(:ruby2_keywords)
311
+ alias_method "refute_#{selector_type}", "assert_no_#{selector_type}"
312
+ end
313
+
314
+ %w[checked unchecked].each do |field_type|
315
+ define_method "assert_#{field_type}_field" do |*args, &optional_filter_block|
316
+ subject, args = determine_subject(args)
317
+ locator, options = extract_locator(args)
318
+ assert_selector(subject, :field, locator, **options.merge(field_type.to_sym => true), &optional_filter_block)
319
+ end
320
+ ruby2_keywords "assert_#{field_type}_field" if respond_to?(:ruby2_keywords)
321
+
322
+ define_method "assert_no_#{field_type}_field" do |*args, &optional_filter_block|
323
+ subject, args = determine_subject(args)
324
+ locator, options = extract_locator(args)
325
+ assert_no_selector(
326
+ subject,
327
+ :field,
328
+ locator,
329
+ **options.merge(field_type.to_sym => true),
330
+ &optional_filter_block
331
+ )
332
+ end
333
+ ruby2_keywords "assert_no_#{field_type}_field" if respond_to?(:ruby2_keywords)
334
+ alias_method "refute_#{field_type}_field", "assert_no_#{field_type}_field"
335
+ end
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
+
363
+ %w[xpath css].each do |selector_type|
364
+ define_method "assert_matches_#{selector_type}" do |*args, &optional_filter_block|
365
+ subject, args = determine_subject(args)
366
+ assert_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
367
+ end
368
+ ruby2_keywords "assert_matches_#{selector_type}" if respond_to?(:ruby2_keywords)
369
+
370
+ define_method "assert_not_matches_#{selector_type}" do |*args, &optional_filter_block|
371
+ subject, args = determine_subject(args)
372
+ assert_not_matches_selector(subject, selector_type.to_sym, *args, &optional_filter_block)
373
+ end
374
+ ruby2_keywords "assert_not_matches_#{selector_type}" if respond_to?(:ruby2_keywords)
375
+ alias_method "refute_matches_#{selector_type}", "assert_not_matches_#{selector_type}"
376
+ end
259
377
 
260
- private
378
+ private
261
379
 
262
380
  def determine_subject(args)
263
381
  case args.first
264
382
  when Capybara::Session, Capybara::Node::Base, Capybara::Node::Simple
265
- args
383
+ [args.shift, args]
384
+ when ->(arg) { arg.respond_to?(:to_capybara_node) }
385
+ [args.shift.to_capybara_node, args]
266
386
  else
267
- [page, *args]
387
+ [page, args]
268
388
  end
269
389
  end
270
390