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
@@ -0,0 +1,75 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#assert_current_path' do
4
+ before do
5
+ @session.visit('/with_js')
6
+ end
7
+
8
+ it 'should not raise if the page has the given current path' do
9
+ expect { @session.assert_current_path('/with_js') }.not_to raise_error
10
+ end
11
+
12
+ it 'should allow regexp matches' do
13
+ expect { @session.assert_current_path(/w[a-z]{3}_js/) }.not_to raise_error
14
+ end
15
+
16
+ it 'should wait for current_path', requires: [:js] do
17
+ @session.click_link('Change page')
18
+ expect { @session.assert_current_path('/with_html') }.not_to raise_error
19
+ end
20
+
21
+ it 'should raise if the page has not the given current_path' do
22
+ expect { @session.assert_current_path('/with_html') }.to raise_error(Capybara::ExpectationNotMet, 'expected "/with_js" to equal "/with_html"')
23
+ end
24
+
25
+ it 'should check query options' do
26
+ @session.visit('/with_js?test=test')
27
+ expect { @session.assert_current_path('/with_js?test=test') }.not_to raise_error
28
+ end
29
+
30
+ it 'should compare the full url' do
31
+ expect { @session.assert_current_path(%r{\Ahttp://[^/]*/with_js\Z}, url: true) }.not_to raise_error
32
+ end
33
+
34
+ it 'should ignore the query' do
35
+ @session.visit('/with_js?test=test')
36
+ expect { @session.assert_current_path('/with_js', ignore_query: true) }.not_to raise_error
37
+ end
38
+
39
+ it 'should not cause an exception when current_url is nil' do
40
+ allow(@session).to receive(:current_url).and_return(nil)
41
+ allow(@session.page).to receive(:current_url).and_return(nil) if @session.respond_to? :page
42
+
43
+ expect { @session.assert_current_path(nil) }.not_to raise_error
44
+ end
45
+ end
46
+
47
+ Capybara::SpecHelper.spec '#assert_no_current_path?' do
48
+ before do
49
+ @session.visit('/with_js')
50
+ end
51
+
52
+ it 'should raise if the page has the given current_path' do
53
+ expect { @session.assert_no_current_path('/with_js') }.to raise_error(Capybara::ExpectationNotMet)
54
+ end
55
+
56
+ it 'should allow regexp matches' do
57
+ expect { @session.assert_no_current_path(/monkey/) }.not_to raise_error
58
+ end
59
+
60
+ it 'should wait for current_path to disappear', requires: [:js] do
61
+ @session.click_link('Change page')
62
+ expect { @session.assert_no_current_path('/with_js') }.not_to raise_error
63
+ end
64
+
65
+ it 'should not raise if the page has not the given current_path' do
66
+ expect { @session.assert_no_current_path('/with_html') }.not_to raise_error
67
+ end
68
+
69
+ it 'should not cause an exception when current_url is nil' do
70
+ allow(@session).to receive(:current_url).and_return(nil)
71
+ allow(@session.page).to receive(:current_url).and_return(nil) if @session.respond_to? :page
72
+
73
+ expect { @session.assert_no_current_path('/with_html') }.not_to raise_error
74
+ end
75
+ end
@@ -0,0 +1,143 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#assert_selector' do
4
+ before do
5
+ @session.visit('/with_html')
6
+ end
7
+
8
+ it 'should be true if the given selector is on the page' do
9
+ @session.assert_selector(:xpath, '//p')
10
+ @session.assert_selector(:css, 'p a#foo')
11
+ @session.assert_selector("//p[contains(.,'est')]")
12
+ end
13
+
14
+ it 'should be false if the given selector is not on the page' do
15
+ expect { @session.assert_selector(:xpath, '//abbr') }.to raise_error(Capybara::ElementNotFound)
16
+ expect { @session.assert_selector(:css, 'p a#doesnotexist') }.to raise_error(Capybara::ElementNotFound)
17
+ expect { @session.assert_selector("//p[contains(.,'thisstringisnotonpage')]") }.to raise_error(Capybara::ElementNotFound)
18
+ end
19
+
20
+ it 'should use default selector' do
21
+ Capybara.default_selector = :css
22
+ expect { @session.assert_selector('p a#doesnotexist') }.to raise_error(Capybara::ElementNotFound)
23
+ @session.assert_selector('p a#foo')
24
+ end
25
+
26
+ it 'should respect scopes' do
27
+ @session.within "//p[@id='first']" do
28
+ @session.assert_selector(".//a[@id='foo']")
29
+ expect { @session.assert_selector(".//a[@id='red']") }.to raise_error(Capybara::ElementNotFound)
30
+ end
31
+ end
32
+
33
+ context 'with count' do
34
+ it 'should be true if the content is on the page the given number of times' do
35
+ @session.assert_selector('//p', count: 3)
36
+ @session.assert_selector("//p//a[@id='foo']", count: 1)
37
+ @session.assert_selector("//p[contains(.,'est')]", count: 1)
38
+ end
39
+
40
+ it 'should be false if the content is on the page the given number of times' do
41
+ expect { @session.assert_selector('//p', count: 6) }.to raise_error(Capybara::ElementNotFound)
42
+ expect { @session.assert_selector("//p//a[@id='foo']", count: 2) }.to raise_error(Capybara::ElementNotFound)
43
+ expect { @session.assert_selector("//p[contains(.,'est')]", count: 5) }.to raise_error(Capybara::ElementNotFound)
44
+ end
45
+
46
+ it "should be false if the content isn't on the page at all" do
47
+ expect { @session.assert_selector('//abbr', count: 2) }.to raise_error(Capybara::ElementNotFound)
48
+ expect { @session.assert_selector("//p//a[@id='doesnotexist']", count: 1) }.to raise_error(Capybara::ElementNotFound)
49
+ end
50
+ end
51
+
52
+ context 'with text' do
53
+ it 'should discard all matches where the given string is not contained' do
54
+ @session.assert_selector('//p//a', text: 'Redirect', count: 1)
55
+ expect { @session.assert_selector('//p', text: 'Doesnotexist') }.to raise_error(Capybara::ElementNotFound)
56
+ end
57
+
58
+ it 'should discard all matches where the given regexp is not matched' do
59
+ @session.assert_selector('//p//a', text: /re[dab]i/i, count: 1)
60
+ expect { @session.assert_selector('//p//a', text: /Red$/) }.to raise_error(Capybara::ElementNotFound)
61
+ end
62
+ end
63
+
64
+ context 'with wait', requires: [:js] do
65
+ it 'should find element if it appears before given wait duration' do
66
+ Capybara.using_wait_time(0.1) do
67
+ @session.visit('/with_js')
68
+ @session.click_link('Click me')
69
+ @session.assert_selector(:css, 'a#has-been-clicked', text: 'Has been clicked', wait: 2)
70
+ end
71
+ end
72
+ end
73
+ end
74
+
75
+ Capybara::SpecHelper.spec '#assert_no_selector' do
76
+ before do
77
+ @session.visit('/with_html')
78
+ end
79
+
80
+ it 'should be false if the given selector is on the page' do
81
+ expect { @session.assert_no_selector(:xpath, '//p') }.to raise_error(Capybara::ElementNotFound)
82
+ expect { @session.assert_no_selector(:css, 'p a#foo') }.to raise_error(Capybara::ElementNotFound)
83
+ expect { @session.assert_no_selector("//p[contains(.,'est')]") }.to raise_error(Capybara::ElementNotFound)
84
+ end
85
+
86
+ it 'should be true if the given selector is not on the page' do
87
+ @session.assert_no_selector(:xpath, '//abbr')
88
+ @session.assert_no_selector(:css, 'p a#doesnotexist')
89
+ @session.assert_no_selector("//p[contains(.,'thisstringisnotonpage')]")
90
+ end
91
+
92
+ it 'should use default selector' do
93
+ Capybara.default_selector = :css
94
+ @session.assert_no_selector('p a#doesnotexist')
95
+ expect { @session.assert_no_selector('p a#foo') }.to raise_error(Capybara::ElementNotFound)
96
+ end
97
+
98
+ it 'should respect scopes' do
99
+ @session.within "//p[@id='first']" do
100
+ expect { @session.assert_no_selector(".//a[@id='foo']") }.to raise_error(Capybara::ElementNotFound)
101
+ @session.assert_no_selector(".//a[@id='red']")
102
+ end
103
+ end
104
+
105
+ context 'with count' do
106
+ it 'should be false if the content is on the page the given number of times' do
107
+ expect { @session.assert_no_selector('//p', count: 3) }.to raise_error(Capybara::ElementNotFound)
108
+ expect { @session.assert_no_selector("//p//a[@id='foo']", count: 1) }.to raise_error(Capybara::ElementNotFound)
109
+ expect { @session.assert_no_selector("//p[contains(.,'est')]", count: 1) }.to raise_error(Capybara::ElementNotFound)
110
+ end
111
+
112
+ it 'should be true if the content is on the page the wrong number of times' do
113
+ @session.assert_no_selector('//p', count: 6)
114
+ @session.assert_no_selector("//p//a[@id='foo']", count: 2)
115
+ @session.assert_no_selector("//p[contains(.,'est')]", count: 5)
116
+ end
117
+
118
+ it "should be true if the content isn't on the page at all" do
119
+ @session.assert_no_selector('//abbr', count: 2)
120
+ @session.assert_no_selector("//p//a[@id='doesnotexist']", count: 1)
121
+ end
122
+ end
123
+
124
+ context 'with text' do
125
+ it 'should discard all matches where the given string is contained' do
126
+ expect { @session.assert_no_selector('//p//a', text: 'Redirect', count: 1) }.to raise_error(Capybara::ElementNotFound)
127
+ @session.assert_no_selector('//p', text: 'Doesnotexist')
128
+ end
129
+
130
+ it 'should discard all matches where the given regexp is matched' do
131
+ expect { @session.assert_no_selector('//p//a', text: /re[dab]i/i, count: 1) }.to raise_error(Capybara::ElementNotFound)
132
+ @session.assert_no_selector('//p//a', text: /Red$/)
133
+ end
134
+ end
135
+
136
+ context 'with wait', requires: [:js] do
137
+ it 'should not find element if it appears after given wait duration' do
138
+ @session.visit('/with_js')
139
+ @session.click_link('Click me')
140
+ @session.assert_no_selector(:css, 'a#has-been-clicked', text: 'Has been clicked', wait: 0.1)
141
+ end
142
+ end
143
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#assert_matches_style', requires: [:css] do
4
+ it 'should not raise if the elements style contains the given properties' do
5
+ @session.visit('/with_html')
6
+ expect do
7
+ @session.find(:css, '#first').assert_matches_style(display: 'block')
8
+ end.not_to raise_error
9
+ end
10
+
11
+ it "should raise error if the elements style doesn't contain the given properties" do
12
+ @session.visit('/with_html')
13
+ expect do
14
+ @session.find(:css, '#first').assert_matches_style(display: 'inline')
15
+ end.to raise_error(Capybara::ExpectationNotMet, 'Expected node to have styles {"display"=>"inline"}. Actual styles were {"display"=>"block"}')
16
+ end
17
+
18
+ it 'should wait for style', requires: %i[css js] do
19
+ @session.visit('/with_js')
20
+ el = @session.find(:css, '#change')
21
+ @session.click_link('Change size')
22
+ expect do
23
+ el.assert_matches_style({ 'font-size': '50px' }, wait: 3)
24
+ end.not_to raise_error
25
+ end
26
+ end
@@ -0,0 +1,258 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#assert_text' do
4
+ it 'should be true if the given text is on the page' do
5
+ @session.visit('/with_html')
6
+ expect(@session.assert_text('est')).to be(true)
7
+ expect(@session.assert_text('Lorem')).to be(true)
8
+ expect(@session.assert_text('Redirect')).to be(true)
9
+ expect(@session.assert_text(:Redirect)).to be(true)
10
+ expect(@session.assert_text('text with whitespace')).to be(true)
11
+ end
12
+
13
+ it 'should support collapsing whitespace' do
14
+ @session.visit('/with_html')
15
+ expect(@session.assert_text('text with whitespace', normalize_ws: true)).to be(true)
16
+ end
17
+
18
+ context 'with enabled default collapsing whitespace' do
19
+ before { Capybara.default_normalize_ws = true }
20
+
21
+ it 'should be true if the given unnormalized text is on the page' do
22
+ @session.visit('/with_html')
23
+ expect(@session.assert_text('text with whitespace', normalize_ws: false)).to be(true)
24
+ end
25
+
26
+ it 'should support collapsing whitespace' do
27
+ @session.visit('/with_html')
28
+ expect(@session.assert_text('text with whitespace')).to be(true)
29
+ end
30
+ end
31
+
32
+ it 'should take scopes into account' do
33
+ @session.visit('/with_html')
34
+ @session.within("//a[@title='awesome title']") do
35
+ expect(@session.assert_text('labore')).to be(true)
36
+ end
37
+ end
38
+
39
+ it 'should raise if scoped to an element which does not have the text' do
40
+ @session.visit('/with_html')
41
+ @session.within("//a[@title='awesome title']") do
42
+ expect do
43
+ @session.assert_text('monkey')
44
+ end.to raise_error(Capybara::ExpectationNotMet, 'expected to find text "monkey" in "labore"')
45
+ end
46
+ end
47
+
48
+ it 'should be true if :all given and text is invisible.' do
49
+ @session.visit('/with_html')
50
+ expect(@session.assert_text(:all, 'Some of this text is hidden!')).to be(true)
51
+ end
52
+
53
+ it 'should be true if `Capybara.ignore_hidden_elements = true` and text is invisible.' do
54
+ Capybara.ignore_hidden_elements = false
55
+ @session.visit('/with_html')
56
+ expect(@session.assert_text('Some of this text is hidden!')).to be(true)
57
+ end
58
+
59
+ it 'should raise error with a helpful message if the requested text is present but invisible' do
60
+ @session.visit('/with_html')
61
+ el = @session.find(:css, '#hidden-text')
62
+ expect do
63
+ el.assert_text(:visible, 'Some of this text is hidden!')
64
+ end.to raise_error(Capybara::ExpectationNotMet, /it was found 1 time including non-visible text/)
65
+ end
66
+
67
+ it 'should raise error with a helpful message if the requested text is present but with incorrect case' do
68
+ @session.visit('/with_html')
69
+ expect do
70
+ @session.assert_text('Text With Whitespace')
71
+ end.to raise_error(Capybara::ExpectationNotMet, /it was found 1 time using a case insensitive search/)
72
+ end
73
+
74
+ it 'should raise error with helpful message if requested text is present but invisible and with incorrect case', requires: [:js] do
75
+ @session.visit('/with_html')
76
+ el = @session.find(:css, '#uppercase')
77
+ expect do
78
+ el.assert_text('text here')
79
+ end.to raise_error(Capybara::ExpectationNotMet, /it was found 1 time using a case insensitive search and it was found 1 time including non-visible text/)
80
+ end
81
+
82
+ it 'should raise the correct error if requested text is missing but contains regex special characters' do
83
+ @session.visit('/with_html')
84
+ expect do
85
+ @session.assert_text('[]*.')
86
+ end.to raise_error(Capybara::ExpectationNotMet, /expected to find text "\[\]\*\."/)
87
+ end
88
+
89
+ it 'should be true if the text in the page matches given regexp' do
90
+ @session.visit('/with_html')
91
+ expect(@session.assert_text(/Lorem/)).to be(true)
92
+ end
93
+
94
+ it "should raise error if the text in the page doesn't match given regexp" do
95
+ @session.visit('/with_html')
96
+ expect do
97
+ @session.assert_text(/xxxxyzzz/)
98
+ end.to raise_error(Capybara::ExpectationNotMet, %r{\Aexpected to find text matching /xxxxyzzz/ in "This is a test\\nHeader Class(.+)"\Z})
99
+ end
100
+
101
+ it 'should escape any characters that would have special meaning in a regexp' do
102
+ @session.visit('/with_html')
103
+ expect do
104
+ @session.assert_text('.orem')
105
+ end.to raise_error(Capybara::ExpectationNotMet)
106
+ end
107
+
108
+ it 'should wait for text to appear', requires: [:js] do
109
+ Capybara.default_max_wait_time = 2
110
+ @session.visit('/with_js')
111
+ @session.click_link('Click me')
112
+ expect(@session.assert_text('Has been clicked')).to be(true)
113
+ end
114
+
115
+ context 'with between' do
116
+ it 'should be true if the text occurs within the range given' do
117
+ @session.visit('/with_count')
118
+ expect(@session.assert_text('count', between: 1..3)).to be(true)
119
+ end
120
+
121
+ it 'should be false if the text occurs more or fewer times than range' do
122
+ @session.visit('/with_html')
123
+ expect do
124
+ @session.find(:css, '.number').assert_text(/\d/, between: 0..1)
125
+ end.to raise_error(Capybara::ExpectationNotMet, 'expected to find text matching /\\d/ between 0 and 1 times but found 2 times in "42"')
126
+ end
127
+ end
128
+
129
+ context 'with wait', requires: [:js] do
130
+ it 'should find element if it appears before given wait duration' do
131
+ Capybara.using_wait_time(0) do
132
+ @session.visit('/with_js')
133
+ @session.find(:css, '#reload-list').click
134
+ @session.find(:css, '#the-list').assert_text("Foo\nBar", wait: 0.9)
135
+ end
136
+ end
137
+
138
+ it 'should raise error if it appears after given wait duration' do
139
+ Capybara.using_wait_time(0) do
140
+ @session.visit('/with_js')
141
+ @session.find(:css, '#reload-list').click
142
+ el = @session.find(:css, '#the-list', visible: false)
143
+ expect do
144
+ el.assert_text(:all, 'Foo Bar', wait: 0.3)
145
+ end.to raise_error(Capybara::ExpectationNotMet)
146
+ end
147
+ end
148
+ end
149
+
150
+ context 'with multiple count filters' do
151
+ before do
152
+ @session.visit('/with_html')
153
+ end
154
+
155
+ it 'ignores other filters when :count is specified' do
156
+ o = { count: 5,
157
+ minimum: 6,
158
+ maximum: 0,
159
+ between: 0..4 }
160
+ expect { @session.assert_text('Header', **o) }.not_to raise_error
161
+ end
162
+
163
+ context 'with no :count expectation' do
164
+ it 'fails if :minimum is not met' do
165
+ o = { minimum: 6,
166
+ maximum: 5,
167
+ between: 2..7 }
168
+ expect { @session.assert_text('Header', **o) }.to raise_error(Capybara::ExpectationNotMet)
169
+ end
170
+
171
+ it 'fails if :maximum is not met' do
172
+ o = { minimum: 0,
173
+ maximum: 0,
174
+ between: 2..7 }
175
+ expect { @session.assert_text('Header', **o) }.to raise_error(Capybara::ExpectationNotMet)
176
+ end
177
+
178
+ it 'fails if :between is not met' do
179
+ o = { minimum: 0,
180
+ maximum: 5,
181
+ between: 0..4 }
182
+ expect { @session.assert_text('Header', **o) }.to raise_error(Capybara::ExpectationNotMet)
183
+ end
184
+
185
+ it 'succeeds if all combineable expectations are met' do
186
+ o = { minimum: 0,
187
+ maximum: 5,
188
+ between: 2..7 }
189
+ expect { @session.assert_text('Header', **o) }.not_to raise_error
190
+ end
191
+ end
192
+ end
193
+ end
194
+
195
+ Capybara::SpecHelper.spec '#assert_no_text' do
196
+ it 'should raise error if the given text is on the page at least once' do
197
+ @session.visit('/with_html')
198
+ expect do
199
+ @session.assert_no_text('Lorem')
200
+ end.to raise_error(Capybara::ExpectationNotMet, /\Aexpected not to find text "Lorem" in "This is a test.*"\z/)
201
+ end
202
+
203
+ it 'should be true if scoped to an element which does not have the text' do
204
+ @session.visit('/with_html')
205
+ @session.within("//a[@title='awesome title']") do
206
+ expect(@session.assert_no_text('monkey')).to be(true)
207
+ end
208
+ end
209
+
210
+ it 'should be true if the given text is on the page but not visible' do
211
+ @session.visit('/with_html')
212
+ expect(@session.assert_no_text('Inside element with hidden ancestor')).to be(true)
213
+ end
214
+
215
+ it 'should raise error if :all given and text is invisible.' do
216
+ @session.visit('/with_html')
217
+ el = @session.find(:css, '#hidden-text', visible: false)
218
+ expect do
219
+ el.assert_no_text(:all, 'Some of this text is hidden!')
220
+ end.to raise_error(Capybara::ExpectationNotMet, 'expected not to find text "Some of this text is hidden!" in "Some of this text is hidden!"')
221
+ end
222
+
223
+ it 'should raise error if :all given and text is invisible.' do
224
+ @session.visit('/with_html')
225
+ el = @session.find(:css, '#some-hidden-text', visible: false)
226
+ expect do
227
+ el.assert_no_text(:visible, 'hidden')
228
+ end.to raise_error(Capybara::ExpectationNotMet, 'expected not to find text "hidden" in "Some of this text is not hidden"')
229
+ end
230
+
231
+ it "should be true if the text in the page doesn't match given regexp" do
232
+ @session.visit('/with_html')
233
+ @session.assert_no_text(/xxxxyzzz/)
234
+ end
235
+
236
+ context 'with count' do
237
+ it 'should be true if the text occurs within the range given' do
238
+ @session.visit('/with_count')
239
+ expect(@session.assert_text('count', count: 2)).to be(true)
240
+ end
241
+
242
+ it 'should be false if the text occurs more or fewer times than range' do
243
+ @session.visit('/with_html')
244
+ expect do
245
+ @session.find(:css, '.number').assert_text(/\d/, count: 1)
246
+ end.to raise_error(Capybara::ExpectationNotMet, 'expected to find text matching /\\d/ 1 time but found 2 times in "42"')
247
+ end
248
+ end
249
+
250
+ context 'with wait', requires: [:js] do
251
+ it 'should not find element if it appears after given wait duration' do
252
+ @session.visit('/with_js')
253
+ @session.click_link('Click me')
254
+ @session.find(:css, '#reload-list').click
255
+ @session.find(:css, '#the-list').assert_no_text('Foo Bar', wait: 0.3)
256
+ end
257
+ end
258
+ end
@@ -1,4 +1,5 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#assert_title' do
3
4
  before do
4
5
  @session.visit('/with_js')
@@ -10,13 +11,13 @@ Capybara::SpecHelper.spec '#assert_title' do
10
11
  end.not_to raise_error
11
12
  end
12
13
 
13
- it "should not raise when given an empty string" do
14
+ it 'should not raise when given an empty string' do
14
15
  expect do
15
16
  @session.assert_title('')
16
17
  end.not_to raise_error
17
18
  end
18
19
 
19
- it "should allow regexp matches" do
20
+ it 'should allow regexp matches' do
20
21
  expect do
21
22
  @session.assert_title(/w[a-z]{3}_js/)
22
23
  end.not_to raise_error
@@ -26,10 +27,10 @@ Capybara::SpecHelper.spec '#assert_title' do
26
27
  end.to raise_error(Capybara::ExpectationNotMet, 'expected "with_js" to match /w[a-z]{10}_js/')
27
28
  end
28
29
 
29
- it "should wait for title", requires: [:js] do
30
- @session.click_link("Change title")
30
+ it 'should wait for title', requires: [:js] do
31
+ @session.click_link('Change title')
31
32
  expect do
32
- @session.assert_title("changed title", wait: 3)
33
+ @session.assert_title('changed title', wait: 3)
33
34
  end.not_to raise_error
34
35
  end
35
36
 
@@ -39,11 +40,20 @@ Capybara::SpecHelper.spec '#assert_title' do
39
40
  end.to raise_error(Capybara::ExpectationNotMet, 'expected "with_js" to include "monkey"')
40
41
  end
41
42
 
42
- it "should normalize given title" do
43
- @session.assert_title(' with_js ')
43
+ it 'should not normalize given title' do
44
+ @session.visit('/with_js')
45
+ expect { @session.assert_title(' with_js ') }.to raise_error(Capybara::ExpectationNotMet)
46
+ end
47
+
48
+ it 'should match correctly normalized title' do
49
+ uri = Addressable::URI.parse('/with_title')
50
+ uri.query_values = { title: '   with space  title ' }
51
+ @session.visit(uri.to_s)
52
+ @session.assert_title(' with space title')
53
+ expect { @session.assert_title('with space title') }.to raise_error(Capybara::ExpectationNotMet)
44
54
  end
45
55
 
46
- it "should normalize given title in error message" do
56
+ it 'should not normalize given title in error message' do
47
57
  expect do
48
58
  @session.assert_title(2)
49
59
  end.to raise_error(Capybara::ExpectationNotMet, 'expected "with_js" to include "2"')
@@ -55,21 +65,21 @@ Capybara::SpecHelper.spec '#assert_no_title' do
55
65
  @session.visit('/with_js')
56
66
  end
57
67
 
58
- it "should raise error if the title contains the given string" do
68
+ it 'should raise error if the title contains the given string' do
59
69
  expect do
60
70
  @session.assert_no_title('with_j')
61
71
  end.to raise_error(Capybara::ExpectationNotMet, 'expected "with_js" not to include "with_j"')
62
72
  end
63
73
 
64
- it "should allow regexp matches" do
74
+ it 'should allow regexp matches' do
65
75
  expect do
66
76
  @session.assert_no_title(/w[a-z]{3}_js/)
67
77
  end.to raise_error(Capybara::ExpectationNotMet, 'expected "with_js" not to match /w[a-z]{3}_js/')
68
78
  @session.assert_no_title(/monkey/)
69
79
  end
70
80
 
71
- it "should wait for title to disappear", requires: [:js] do
72
- @session.click_link("Change title")
81
+ it 'should wait for title to disappear', requires: [:js] do
82
+ @session.click_link('Change title')
73
83
  expect do
74
84
  @session.assert_no_title('with_js', wait: 3)
75
85
  end.not_to raise_error