capybara 2.7.0 → 3.35.3

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 (318) hide show
  1. checksums.yaml +5 -5
  2. data/.yardopts +1 -0
  3. data/History.md +1147 -11
  4. data/License.txt +1 -1
  5. data/README.md +252 -131
  6. data/lib/capybara/config.rb +92 -0
  7. data/lib/capybara/cucumber.rb +3 -3
  8. data/lib/capybara/driver/base.rb +52 -21
  9. data/lib/capybara/driver/node.rb +48 -14
  10. data/lib/capybara/dsl.rb +16 -9
  11. data/lib/capybara/helpers.rb +72 -81
  12. data/lib/capybara/minitest/spec.rb +267 -0
  13. data/lib/capybara/minitest.rb +385 -0
  14. data/lib/capybara/node/actions.rb +337 -89
  15. data/lib/capybara/node/base.rb +50 -32
  16. data/lib/capybara/node/document.rb +19 -3
  17. data/lib/capybara/node/document_matchers.rb +22 -24
  18. data/lib/capybara/node/element.rb +388 -125
  19. data/lib/capybara/node/finders.rb +231 -121
  20. data/lib/capybara/node/matchers.rb +503 -217
  21. data/lib/capybara/node/simple.rb +64 -27
  22. data/lib/capybara/queries/ancestor_query.rb +27 -0
  23. data/lib/capybara/queries/base_query.rb +87 -11
  24. data/lib/capybara/queries/current_path_query.rb +24 -24
  25. data/lib/capybara/queries/match_query.rb +15 -10
  26. data/lib/capybara/queries/selector_query.rb +675 -81
  27. data/lib/capybara/queries/sibling_query.rb +26 -0
  28. data/lib/capybara/queries/style_query.rb +45 -0
  29. data/lib/capybara/queries/text_query.rb +88 -20
  30. data/lib/capybara/queries/title_query.rb +9 -11
  31. data/lib/capybara/rack_test/browser.rb +63 -39
  32. data/lib/capybara/rack_test/css_handlers.rb +6 -4
  33. data/lib/capybara/rack_test/driver.rb +26 -16
  34. data/lib/capybara/rack_test/errors.rb +6 -0
  35. data/lib/capybara/rack_test/form.rb +73 -58
  36. data/lib/capybara/rack_test/node.rb +187 -67
  37. data/lib/capybara/rails.rb +4 -8
  38. data/lib/capybara/registration_container.rb +44 -0
  39. data/lib/capybara/registrations/drivers.rb +42 -0
  40. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  41. data/lib/capybara/registrations/servers.rb +45 -0
  42. data/lib/capybara/result.rb +142 -14
  43. data/lib/capybara/rspec/features.rb +17 -42
  44. data/lib/capybara/rspec/matcher_proxies.rb +82 -0
  45. data/lib/capybara/rspec/matchers/base.rb +111 -0
  46. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  47. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  48. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  49. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  50. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  51. data/lib/capybara/rspec/matchers/have_selector.rb +77 -0
  52. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  53. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  54. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  55. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  56. data/lib/capybara/rspec/matchers/match_style.rb +43 -0
  57. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  58. data/lib/capybara/rspec/matchers.rb +143 -244
  59. data/lib/capybara/rspec.rb +10 -12
  60. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  61. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  62. data/lib/capybara/selector/css.rb +102 -0
  63. data/lib/capybara/selector/definition/button.rb +63 -0
  64. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  65. data/lib/capybara/selector/definition/css.rb +10 -0
  66. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  67. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  68. data/lib/capybara/selector/definition/element.rb +28 -0
  69. data/lib/capybara/selector/definition/field.rb +40 -0
  70. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  71. data/lib/capybara/selector/definition/file_field.rb +13 -0
  72. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  73. data/lib/capybara/selector/definition/frame.rb +17 -0
  74. data/lib/capybara/selector/definition/id.rb +6 -0
  75. data/lib/capybara/selector/definition/label.rb +62 -0
  76. data/lib/capybara/selector/definition/link.rb +54 -0
  77. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  78. data/lib/capybara/selector/definition/option.rb +27 -0
  79. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  80. data/lib/capybara/selector/definition/select.rb +81 -0
  81. data/lib/capybara/selector/definition/table.rb +109 -0
  82. data/lib/capybara/selector/definition/table_row.rb +21 -0
  83. data/lib/capybara/selector/definition/xpath.rb +5 -0
  84. data/lib/capybara/selector/definition.rb +278 -0
  85. data/lib/capybara/selector/filter.rb +3 -46
  86. data/lib/capybara/selector/filter_set.rb +124 -0
  87. data/lib/capybara/selector/filters/base.rb +77 -0
  88. data/lib/capybara/selector/filters/expression_filter.rb +22 -0
  89. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  90. data/lib/capybara/selector/filters/node_filter.rb +31 -0
  91. data/lib/capybara/selector/regexp_disassembler.rb +214 -0
  92. data/lib/capybara/selector/selector.rb +155 -0
  93. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  94. data/lib/capybara/selector.rb +232 -369
  95. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  96. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  97. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  98. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  99. data/lib/capybara/selenium/driver.rb +380 -142
  100. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  101. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +124 -0
  102. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +89 -0
  103. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  104. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  105. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  106. data/lib/capybara/selenium/extensions/find.rb +110 -0
  107. data/lib/capybara/selenium/extensions/html5_drag.rb +228 -0
  108. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  109. data/lib/capybara/selenium/extensions/scroll.rb +76 -0
  110. data/lib/capybara/selenium/logger_suppressor.rb +40 -0
  111. data/lib/capybara/selenium/node.rb +528 -97
  112. data/lib/capybara/selenium/nodes/chrome_node.rb +137 -0
  113. data/lib/capybara/selenium/nodes/edge_node.rb +104 -0
  114. data/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
  115. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  116. data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
  117. data/lib/capybara/selenium/patches/action_pauser.rb +26 -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 +63 -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 +74 -71
  127. data/lib/capybara/session/config.rb +126 -0
  128. data/lib/capybara/session/matchers.rb +44 -27
  129. data/lib/capybara/session.rb +500 -297
  130. data/lib/capybara/spec/fixtures/no_extension +1 -0
  131. data/lib/capybara/spec/public/jquery.js +5 -5
  132. data/lib/capybara/spec/public/offset.js +6 -0
  133. data/lib/capybara/spec/public/test.js +168 -14
  134. data/lib/capybara/spec/session/accept_alert_spec.rb +37 -14
  135. data/lib/capybara/spec/session/accept_confirm_spec.rb +7 -6
  136. data/lib/capybara/spec/session/accept_prompt_spec.rb +38 -10
  137. data/lib/capybara/spec/session/all_spec.rb +179 -59
  138. data/lib/capybara/spec/session/ancestor_spec.rb +88 -0
  139. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +140 -0
  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_spec.rb +93 -0
  145. data/lib/capybara/spec/session/attach_file_spec.rb +154 -48
  146. data/lib/capybara/spec/session/body_spec.rb +12 -13
  147. data/lib/capybara/spec/session/check_spec.rb +168 -41
  148. data/lib/capybara/spec/session/choose_spec.rb +75 -23
  149. data/lib/capybara/spec/session/click_button_spec.rb +243 -175
  150. data/lib/capybara/spec/session/click_link_or_button_spec.rb +57 -32
  151. data/lib/capybara/spec/session/click_link_spec.rb +100 -53
  152. data/lib/capybara/spec/session/current_scope_spec.rb +11 -10
  153. data/lib/capybara/spec/session/current_url_spec.rb +61 -35
  154. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +7 -7
  155. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +5 -4
  156. data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +13 -6
  157. data/lib/capybara/spec/session/element/match_css_spec.rb +21 -7
  158. data/lib/capybara/spec/session/element/match_xpath_spec.rb +9 -7
  159. data/lib/capybara/spec/session/element/matches_selector_spec.rb +91 -34
  160. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
  161. data/lib/capybara/spec/session/evaluate_script_spec.rb +45 -3
  162. data/lib/capybara/spec/session/execute_script_spec.rb +24 -4
  163. data/lib/capybara/spec/session/fill_in_spec.rb +166 -64
  164. data/lib/capybara/spec/session/find_button_spec.rb +37 -18
  165. data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
  166. data/lib/capybara/spec/session/find_field_spec.rb +57 -34
  167. data/lib/capybara/spec/session/find_link_spec.rb +47 -10
  168. data/lib/capybara/spec/session/find_spec.rb +290 -144
  169. data/lib/capybara/spec/session/first_spec.rb +91 -48
  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 +116 -0
  173. data/lib/capybara/spec/session/frame/within_frame_spec.rb +112 -0
  174. data/lib/capybara/spec/session/go_back_spec.rb +3 -2
  175. data/lib/capybara/spec/session/go_forward_spec.rb +3 -2
  176. data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
  177. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  178. data/lib/capybara/spec/session/has_any_selectors_spec.rb +25 -0
  179. data/lib/capybara/spec/session/has_button_spec.rb +76 -19
  180. data/lib/capybara/spec/session/has_css_spec.rb +277 -131
  181. data/lib/capybara/spec/session/has_current_path_spec.rb +98 -26
  182. data/lib/capybara/spec/session/has_field_spec.rb +177 -107
  183. data/lib/capybara/spec/session/has_link_spec.rb +13 -12
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
  185. data/lib/capybara/spec/session/has_select_spec.rb +191 -95
  186. data/lib/capybara/spec/session/has_selector_spec.rb +128 -64
  187. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  188. data/lib/capybara/spec/session/has_table_spec.rb +172 -5
  189. data/lib/capybara/spec/session/has_text_spec.rb +126 -60
  190. data/lib/capybara/spec/session/has_title_spec.rb +35 -12
  191. data/lib/capybara/spec/session/has_xpath_spec.rb +74 -53
  192. data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +3 -2
  193. data/lib/capybara/spec/session/html_spec.rb +14 -6
  194. data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
  195. data/lib/capybara/spec/session/node_spec.rb +1028 -131
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  197. data/lib/capybara/spec/session/refresh_spec.rb +34 -0
  198. data/lib/capybara/spec/session/reset_session_spec.rb +75 -34
  199. data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +2 -1
  200. data/lib/capybara/spec/session/save_and_open_page_spec.rb +3 -2
  201. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +11 -15
  202. data/lib/capybara/spec/session/save_page_spec.rb +42 -55
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +16 -14
  204. data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
  205. data/lib/capybara/spec/session/scroll_spec.rb +117 -0
  206. data/lib/capybara/spec/session/select_spec.rb +112 -85
  207. data/lib/capybara/spec/session/selectors_spec.rb +71 -8
  208. data/lib/capybara/spec/session/sibling_spec.rb +52 -0
  209. data/lib/capybara/spec/session/text_spec.rb +38 -23
  210. data/lib/capybara/spec/session/title_spec.rb +17 -5
  211. data/lib/capybara/spec/session/uncheck_spec.rb +71 -12
  212. data/lib/capybara/spec/session/unselect_spec.rb +44 -43
  213. data/lib/capybara/spec/session/visit_spec.rb +99 -32
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +33 -29
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +5 -3
  216. data/lib/capybara/spec/session/window/open_new_window_spec.rb +5 -3
  217. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +39 -30
  218. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +17 -10
  219. data/lib/capybara/spec/session/window/window_spec.rb +121 -73
  220. data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
  221. data/lib/capybara/spec/session/window/within_window_spec.rb +52 -82
  222. data/lib/capybara/spec/session/within_spec.rb +76 -43
  223. data/lib/capybara/spec/spec_helper.rb +67 -33
  224. data/lib/capybara/spec/test_app.rb +85 -36
  225. data/lib/capybara/spec/views/animated.erb +49 -0
  226. data/lib/capybara/spec/views/buttons.erb +1 -1
  227. data/lib/capybara/spec/views/fieldsets.erb +1 -1
  228. data/lib/capybara/spec/views/form.erb +227 -20
  229. data/lib/capybara/spec/views/frame_child.erb +10 -2
  230. data/lib/capybara/spec/views/frame_one.erb +2 -1
  231. data/lib/capybara/spec/views/frame_parent.erb +2 -2
  232. data/lib/capybara/spec/views/frame_two.erb +1 -1
  233. data/lib/capybara/spec/views/header_links.erb +1 -1
  234. data/lib/capybara/spec/views/host_links.erb +1 -1
  235. data/lib/capybara/spec/views/initial_alert.erb +10 -0
  236. data/lib/capybara/spec/views/obscured.erb +47 -0
  237. data/lib/capybara/spec/views/offset.erb +32 -0
  238. data/lib/capybara/spec/views/path.erb +1 -1
  239. data/lib/capybara/spec/views/popup_one.erb +1 -1
  240. data/lib/capybara/spec/views/popup_two.erb +1 -1
  241. data/lib/capybara/spec/views/postback.erb +1 -1
  242. data/lib/capybara/spec/views/react.erb +45 -0
  243. data/lib/capybara/spec/views/scroll.erb +20 -0
  244. data/lib/capybara/spec/views/spatial.erb +31 -0
  245. data/lib/capybara/spec/views/tables.erb +69 -2
  246. data/lib/capybara/spec/views/with_animation.erb +82 -0
  247. data/lib/capybara/spec/views/with_base_tag.erb +1 -1
  248. data/lib/capybara/spec/views/with_count.erb +1 -1
  249. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  250. data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
  251. data/lib/capybara/spec/views/with_hover.erb +7 -1
  252. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  253. data/lib/capybara/spec/views/with_html.erb +100 -10
  254. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  255. data/lib/capybara/spec/views/with_html_entities.erb +1 -1
  256. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  257. data/lib/capybara/spec/views/with_js.erb +49 -3
  258. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  259. data/lib/capybara/spec/views/with_namespace.erb +20 -0
  260. data/lib/capybara/spec/views/with_scope.erb +1 -1
  261. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  262. data/lib/capybara/spec/views/with_simple_html.erb +1 -1
  263. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  264. data/lib/capybara/spec/views/with_title.erb +1 -1
  265. data/lib/capybara/spec/views/with_unload_alert.erb +3 -1
  266. data/lib/capybara/spec/views/with_windows.erb +7 -1
  267. data/lib/capybara/spec/views/within_frames.erb +6 -3
  268. data/lib/capybara/version.rb +2 -1
  269. data/lib/capybara/window.rb +39 -21
  270. data/lib/capybara.rb +208 -186
  271. data/spec/basic_node_spec.rb +52 -39
  272. data/spec/capybara_spec.rb +72 -50
  273. data/spec/css_builder_spec.rb +101 -0
  274. data/spec/css_splitter_spec.rb +38 -0
  275. data/spec/dsl_spec.rb +81 -61
  276. data/spec/filter_set_spec.rb +46 -0
  277. data/spec/fixtures/capybara.csv +1 -0
  278. data/spec/fixtures/certificate.pem +25 -0
  279. data/spec/fixtures/key.pem +27 -0
  280. data/spec/fixtures/selenium_driver_rspec_failure.rb +7 -3
  281. data/spec/fixtures/selenium_driver_rspec_success.rb +7 -3
  282. data/spec/minitest_spec.rb +164 -0
  283. data/spec/minitest_spec_spec.rb +162 -0
  284. data/spec/per_session_config_spec.rb +68 -0
  285. data/spec/rack_test_spec.rb +189 -96
  286. data/spec/regexp_dissassembler_spec.rb +250 -0
  287. data/spec/result_spec.rb +143 -13
  288. data/spec/rspec/features_spec.rb +38 -32
  289. data/spec/rspec/scenarios_spec.rb +9 -7
  290. data/spec/rspec/shared_spec_matchers.rb +959 -0
  291. data/spec/rspec/views_spec.rb +9 -3
  292. data/spec/rspec_matchers_spec.rb +62 -0
  293. data/spec/rspec_spec.rb +127 -30
  294. data/spec/sauce_spec_chrome.rb +43 -0
  295. data/spec/selector_spec.rb +458 -37
  296. data/spec/selenium_spec_chrome.rb +196 -9
  297. data/spec/selenium_spec_chrome_remote.rb +100 -0
  298. data/spec/selenium_spec_edge.rb +47 -0
  299. data/spec/selenium_spec_firefox.rb +210 -0
  300. data/spec/selenium_spec_firefox_remote.rb +80 -0
  301. data/spec/selenium_spec_ie.rb +150 -0
  302. data/spec/selenium_spec_safari.rb +148 -0
  303. data/spec/server_spec.rb +200 -101
  304. data/spec/session_spec.rb +91 -0
  305. data/spec/shared_selenium_node.rb +83 -0
  306. data/spec/shared_selenium_session.rb +558 -0
  307. data/spec/spec_helper.rb +94 -2
  308. data/spec/xpath_builder_spec.rb +93 -0
  309. metadata +420 -60
  310. data/lib/capybara/query.rb +0 -7
  311. data/lib/capybara/spec/session/assert_current_path.rb +0 -60
  312. data/lib/capybara/spec/session/assert_selector.rb +0 -148
  313. data/lib/capybara/spec/session/assert_text.rb +0 -196
  314. data/lib/capybara/spec/session/assert_title.rb +0 -70
  315. data/lib/capybara/spec/session/source_spec.rb +0 -0
  316. data/lib/capybara/spec/session/within_frame_spec.rb +0 -53
  317. data/spec/rspec/matchers_spec.rb +0 -827
  318. data/spec/selenium_spec.rb +0 -151
@@ -1,44 +1,59 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#has_text?' do
3
- it "should be true if the given text is on the page at least once" do
4
+ it 'should be true if the given text is on the page at least once' do
4
5
  @session.visit('/with_html')
5
6
  expect(@session).to have_text('est')
6
7
  expect(@session).to have_text('Lorem')
7
8
  expect(@session).to have_text('Redirect')
8
- expect(@session).to have_text(:'Redirect')
9
+ expect(@session).to have_text(:Redirect)
9
10
  end
10
11
 
11
- it "should be true if scoped to an element which has the text" do
12
+ it 'should be true if scoped to an element which has the text' do
12
13
  @session.visit('/with_html')
13
14
  @session.within("//a[@title='awesome title']") do
14
15
  expect(@session).to have_text('labore')
15
16
  end
16
17
  end
17
18
 
18
- it "should be false if scoped to an element which does not have the text" do
19
+ it 'should be false if scoped to an element which does not have the text' do
19
20
  @session.visit('/with_html')
20
21
  @session.within("//a[@title='awesome title']") do
21
22
  expect(@session).not_to have_text('monkey')
22
23
  end
23
24
  end
24
25
 
25
- it "should ignore tags" do
26
+ it 'should ignore tags' do
26
27
  @session.visit('/with_html')
27
28
  expect(@session).not_to have_text('exercitation <a href="/foo" id="foo">ullamco</a> laboris')
28
29
  expect(@session).to have_text('exercitation ullamco laboris')
29
30
  end
30
31
 
31
- it "should ignore extra whitespace and newlines" do
32
+ it 'should search correctly normalized text' do
32
33
  @session.visit('/with_html')
33
- expect(@session).to have_text('text with whitespace')
34
+ expect(@session).to have_text('text with whitespace')
34
35
  end
35
36
 
36
- it "should ignore whitespace and newlines in the search string" do
37
+ it 'should search whitespace collapsed text' do
37
38
  @session.visit('/with_html')
38
- expect(@session).to have_text("text with \n\n whitespace")
39
+ expect(@session).to have_text('text with whitespace', normalize_ws: true)
40
+ end
41
+
42
+ context 'with enabled default collapsing whitespace' do
43
+ before { Capybara.default_normalize_ws = true }
44
+
45
+ it 'should search unnormalized text' do
46
+ @session.visit('/with_html')
47
+ expect(@session).to have_text('text with whitespace', normalize_ws: false)
48
+ end
49
+
50
+ it 'should search whitespace collapsed text' do
51
+ @session.visit('/with_html')
52
+ expect(@session).to have_text('text with whitespace')
53
+ end
39
54
  end
40
55
 
41
- it "should be false if the given text is not on the page" do
56
+ it 'should be false if the given text is not on the page' do
42
57
  @session.visit('/with_html')
43
58
  expect(@session).not_to have_text('xxxxyzzz')
44
59
  expect(@session).not_to have_text('monkey')
@@ -51,12 +66,12 @@ Capybara::SpecHelper.spec '#has_text?' do
51
66
 
52
67
  it 'should handle double quotes in the text' do
53
68
  @session.visit('/with-quotes')
54
- expect(@session).to have_text(%q{"No," he said})
69
+ expect(@session).to have_text('"No," he said')
55
70
  end
56
71
 
57
72
  it 'should handle mixed single and double quotes in the text' do
58
73
  @session.visit('/with-quotes')
59
- expect(@session).to have_text(%q{"you can't do that."})
74
+ expect(@session).to have_text(%q("you can't do that."))
60
75
  end
61
76
 
62
77
  it 'should be false if text is in the title tag in the head' do
@@ -70,23 +85,23 @@ Capybara::SpecHelper.spec '#has_text?' do
70
85
  expect(@session).not_to have_text('aVar')
71
86
  end
72
87
 
73
- it "should be false if the given text is on the page but not visible" do
88
+ it 'should be false if the given text is on the page but not visible' do
74
89
  @session.visit('/with_html')
75
90
  expect(@session).not_to have_text('Inside element with hidden ancestor')
76
91
  end
77
92
 
78
- it "should be true if :all given and text is invisible." do
93
+ it 'should be true if :all given and text is invisible.' do
79
94
  @session.visit('/with_html')
80
95
  expect(@session).to have_text(:all, 'Some of this text is hidden!')
81
96
  end
82
97
 
83
- it "should be true if `Capybara.ignore_hidden_elements = true` and text is invisible." do
98
+ it 'should be true if `Capybara.ignore_hidden_elements = false` and text is invisible.' do
84
99
  Capybara.ignore_hidden_elements = false
85
100
  @session.visit('/with_html')
86
101
  expect(@session).to have_text('Some of this text is hidden!')
87
102
  end
88
103
 
89
- it "should be true if the text in the page matches given regexp" do
104
+ it 'should be true if the text in the page matches given regexp' do
90
105
  @session.visit('/with_html')
91
106
  expect(@session).to have_text(/Lorem/)
92
107
  end
@@ -96,36 +111,80 @@ Capybara::SpecHelper.spec '#has_text?' do
96
111
  expect(@session).not_to have_text(/xxxxyzzz/)
97
112
  end
98
113
 
99
- it "should escape any characters that would have special meaning in a regexp" do
114
+ context 'with object implementing to_s and to_hash' do
115
+ it 'should work if the object is passed alone' do
116
+ with_to_hash = Class.new do
117
+ def to_s; '42' end
118
+ def to_hash; { value: 'Other hash' } end
119
+ end.new
120
+ @session.visit('/with_html')
121
+ expect(@session).to have_text(with_to_hash)
122
+ end
123
+
124
+ it 'should work if passed with empty options' do
125
+ with_to_hash = Class.new do
126
+ def to_s; '42' end
127
+ def to_hash; { value: 'Other hash' } end
128
+ end.new
129
+ @session.visit('/with_html')
130
+ if RUBY_VERSION >= '2.7'
131
+ expect(@session).to have_text(:visible, with_to_hash, **{})
132
+ else
133
+ expect(@session).to have_text(:visible, with_to_hash, {})
134
+ end
135
+ end
136
+ end
137
+
138
+ context 'with exact: true option' do
139
+ it 'should be true if text matches exactly' do
140
+ @session.visit('/with_html')
141
+ expect(@session.find(:id, 'h2one')).to have_text('Header Class Test One', exact: true)
142
+ end
143
+
144
+ it "should be false if text doesn't match exactly" do
145
+ @session.visit('/with_html')
146
+ expect(@session.find(:id, 'h2one')).not_to have_text('Header Class Test On', exact: true)
147
+ end
148
+ end
149
+
150
+ it 'should escape any characters that would have special meaning in a regexp' do
100
151
  @session.visit('/with_html')
101
152
  expect(@session).not_to have_text('.orem')
102
153
  end
103
154
 
104
- it "should accept non-string parameters" do
155
+ it 'should accept non-string parameters' do
105
156
  @session.visit('/with_html')
106
157
  expect(@session).to have_text(42)
107
158
  end
108
159
 
109
- it "should be true when passed nil" do
160
+ it 'should be true when passed nil' do
110
161
  # nil is converted to '' when to_s is invoked
111
162
  @session.visit('/with_html')
112
163
  expect(@session).to have_text(nil)
113
164
  end
114
165
 
115
- it "should wait for text to appear", :requires => [:js] do
116
- @session.visit('/with_js')
117
- @session.click_link('Click me')
118
- expect(@session).to have_text("Has been clicked")
166
+ it 'should warn when passed nil' do
167
+ @session.visit('/with_html')
168
+ expect_any_instance_of(Kernel).to receive(:warn).with(/Checking for expected text of nil is confusing/) # rubocop:disable RSpec/AnyInstance
169
+ expect(@session).to have_text(nil)
170
+ end
171
+
172
+ it 'should wait for text to appear', requires: [:js] do
173
+ Capybara.using_wait_time(3) do
174
+ @session.visit('/with_js')
175
+ @session.click_link('Click me')
176
+ expect(@session).to have_text('Has been clicked')
177
+ end
119
178
  end
120
179
 
121
- context "with between" do
122
- it "should be true if the text occurs within the range given" do
180
+ context 'with between' do
181
+ it 'should be true if the text occurs within the range given' do
123
182
  @session.visit('/with_count')
124
183
  expect(@session).to have_text('count', between: 1..3)
125
184
  expect(@session).to have_text(/count/, between: 2..2)
126
185
  end
127
186
 
128
- it "should be false if the text occurs more or fewer times than range" do
187
+ it 'should be false if the text occurs more or fewer times than range' do
129
188
  @session.visit('/with_count')
130
189
  expect(@session).not_to have_text('count', between: 0..1)
131
190
  expect(@session).not_to have_text('count', between: 3..10)
@@ -133,112 +192,118 @@ Capybara::SpecHelper.spec '#has_text?' do
133
192
  end
134
193
  end
135
194
 
136
- context "with count" do
137
- it "should be true if the text occurs the given number of times" do
195
+ context 'with count' do
196
+ it 'should be true if the text occurs the given number of times' do
138
197
  @session.visit('/with_count')
139
198
  expect(@session).to have_text('count', count: 2)
199
+ expect(@session).to have_text('count').exactly(2).times
140
200
  end
141
201
 
142
- it "should be false if the text occurs a different number of times than the given" do
202
+ it 'should be false if the text occurs a different number of times than the given' do
143
203
  @session.visit('/with_count')
144
204
  expect(@session).not_to have_text('count', count: 0)
145
205
  expect(@session).not_to have_text('count', count: 1)
206
+ expect(@session).not_to have_text('count').once
146
207
  expect(@session).not_to have_text(/count/, count: 3)
147
208
  end
148
209
 
149
- it "should coerce count to an integer" do
210
+ it 'should coerce count to an integer' do
150
211
  @session.visit('/with_count')
151
212
  expect(@session).to have_text('count', count: '2')
152
213
  expect(@session).not_to have_text('count', count: '3')
153
214
  end
154
215
  end
155
216
 
156
- context "with maximum" do
157
- it "should be true when text occurs same or fewer times than given" do
217
+ context 'with maximum' do
218
+ it 'should be true when text occurs same or fewer times than given' do
158
219
  @session.visit('/with_count')
159
220
  expect(@session).to have_text('count', maximum: 2)
221
+ expect(@session).to have_text('count').at_most(2).times
160
222
  expect(@session).to have_text(/count/, maximum: 3)
161
223
  end
162
224
 
163
- it "should be false when text occurs more times than given" do
225
+ it 'should be false when text occurs more times than given' do
164
226
  @session.visit('/with_count')
165
227
  expect(@session).not_to have_text('count', maximum: 1)
228
+ expect(@session).not_to have_text('count').at_most(1).times
166
229
  expect(@session).not_to have_text('count', maximum: 0)
167
230
  end
168
231
 
169
- it "should coerce maximum to an integer" do
232
+ it 'should coerce maximum to an integer' do
170
233
  @session.visit('/with_count')
171
234
  expect(@session).to have_text('count', maximum: '2')
172
235
  expect(@session).not_to have_text('count', maximum: '1')
173
236
  end
174
237
  end
175
238
 
176
- context "with minimum" do
177
- it "should be true when text occurs same or more times than given" do
239
+ context 'with minimum' do
240
+ it 'should be true when text occurs same or more times than given' do
178
241
  @session.visit('/with_count')
179
242
  expect(@session).to have_text('count', minimum: 2)
243
+ expect(@session).to have_text('count').at_least(2).times
180
244
  expect(@session).to have_text(/count/, minimum: 0)
181
245
  end
182
246
 
183
- it "should be false when text occurs fewer times than given" do
247
+ it 'should be false when text occurs fewer times than given' do
184
248
  @session.visit('/with_count')
185
249
  expect(@session).not_to have_text('count', minimum: 3)
250
+ expect(@session).not_to have_text('count').at_least(3).times
186
251
  end
187
252
 
188
- it "should coerce minimum to an integer" do
253
+ it 'should coerce minimum to an integer' do
189
254
  @session.visit('/with_count')
190
255
  expect(@session).to have_text('count', minimum: '2')
191
256
  expect(@session).not_to have_text('count', minimum: '3')
192
257
  end
193
258
  end
194
259
 
195
- context "with wait", :requires => [:js] do
196
- it "should find element if it appears before given wait duration" do
260
+ context 'with wait', requires: [:js] do
261
+ it 'should find element if it appears before given wait duration' do
197
262
  Capybara.using_wait_time(0.1) do
198
263
  @session.visit('/with_js')
199
264
  @session.click_link('Click me')
200
- expect(@session).to have_text('Has been clicked', :wait => 0.9)
265
+ expect(@session).to have_text('Has been clicked', wait: 3)
201
266
  end
202
267
  end
203
268
  end
204
269
 
205
- it "should raise an error if an invalid option is passed" do
270
+ it 'should raise an error if an invalid option is passed' do
206
271
  @session.visit('/with_html')
207
272
  expect do
208
- expect(@session).to have_text('Lorem', exact: true)
273
+ expect(@session).to have_text('Lorem', invalid: true)
209
274
  end.to raise_error(ArgumentError)
210
275
  end
211
276
  end
212
277
 
213
278
  Capybara::SpecHelper.spec '#has_no_text?' do
214
- it "should be false if the given text is on the page at least once" do
279
+ it 'should be false if the given text is on the page at least once' do
215
280
  @session.visit('/with_html')
216
281
  expect(@session).not_to have_no_text('est')
217
282
  expect(@session).not_to have_no_text('Lorem')
218
283
  expect(@session).not_to have_no_text('Redirect')
219
284
  end
220
285
 
221
- it "should be false if scoped to an element which has the text" do
286
+ it 'should be false if scoped to an element which has the text' do
222
287
  @session.visit('/with_html')
223
288
  @session.within("//a[@title='awesome title']") do
224
289
  expect(@session).not_to have_no_text('labore')
225
290
  end
226
291
  end
227
292
 
228
- it "should be true if scoped to an element which does not have the text" do
293
+ it 'should be true if scoped to an element which does not have the text' do
229
294
  @session.visit('/with_html')
230
295
  @session.within("//a[@title='awesome title']") do
231
296
  expect(@session).to have_no_text('monkey')
232
297
  end
233
298
  end
234
299
 
235
- it "should ignore tags" do
300
+ it 'should ignore tags' do
236
301
  @session.visit('/with_html')
237
302
  expect(@session).to have_no_text('exercitation <a href="/foo" id="foo">ullamco</a> laboris')
238
303
  expect(@session).not_to have_no_text('exercitation ullamco laboris')
239
304
  end
240
305
 
241
- it "should be true if the given text is not on the page" do
306
+ it 'should be true if the given text is not on the page' do
242
307
  @session.visit('/with_html')
243
308
  expect(@session).to have_no_text('xxxxyzzz')
244
309
  expect(@session).to have_no_text('monkey')
@@ -251,12 +316,12 @@ Capybara::SpecHelper.spec '#has_no_text?' do
251
316
 
252
317
  it 'should handle double quotes in the text' do
253
318
  @session.visit('/with-quotes')
254
- expect(@session).not_to have_no_text(%q{"No," he said})
319
+ expect(@session).not_to have_no_text('"No," he said')
255
320
  end
256
321
 
257
322
  it 'should handle mixed single and double quotes in the text' do
258
323
  @session.visit('/with-quotes')
259
- expect(@session).not_to have_no_text(%q{"you can't do that."})
324
+ expect(@session).not_to have_no_text(%q("you can't do that."))
260
325
  end
261
326
 
262
327
  it 'should be true if text is in the title tag in the head' do
@@ -270,17 +335,17 @@ Capybara::SpecHelper.spec '#has_no_text?' do
270
335
  expect(@session).to have_no_text('aVar')
271
336
  end
272
337
 
273
- it "should be true if the given text is on the page but not visible" do
338
+ it 'should be true if the given text is on the page but not visible' do
274
339
  @session.visit('/with_html')
275
340
  expect(@session).to have_no_text('Inside element with hidden ancestor')
276
341
  end
277
342
 
278
- it "should be false if :all given and text is invisible." do
343
+ it 'should be false if :all given and text is invisible.' do
279
344
  @session.visit('/with_html')
280
345
  expect(@session).not_to have_no_text(:all, 'Some of this text is hidden!')
281
346
  end
282
347
 
283
- it "should be false if `Capybara.ignore_hidden_elements = true` and text is invisible." do
348
+ it 'should be false if `Capybara.ignore_hidden_elements = false` and text is invisible.' do
284
349
  Capybara.ignore_hidden_elements = false
285
350
  @session.visit('/with_html')
286
351
  expect(@session).not_to have_no_text('Some of this text is hidden!')
@@ -291,27 +356,28 @@ Capybara::SpecHelper.spec '#has_no_text?' do
291
356
  expect(@session).to have_no_text(/xxxxyzzz/)
292
357
  end
293
358
 
294
- it "should be false if the text in the page matches given regexp" do
359
+ it 'should be false if the text in the page matches given regexp' do
295
360
  @session.visit('/with_html')
296
361
  expect(@session).not_to have_no_text(/Lorem/)
297
362
  end
298
363
 
299
- it "should escape any characters that would have special meaning in a regexp" do
364
+ it 'should escape any characters that would have special meaning in a regexp' do
300
365
  @session.visit('/with_html')
301
366
  expect(@session).to have_no_text('.orem')
302
367
  end
303
368
 
304
- it "should wait for text to disappear", :requires => [:js] do
369
+ it 'should wait for text to disappear', requires: [:js] do
370
+ Capybara.default_max_wait_time = 2
305
371
  @session.visit('/with_js')
306
372
  @session.click_link('Click me')
307
- expect(@session).to have_no_text("I changed it")
373
+ expect(@session).to have_no_text('I changed it')
308
374
  end
309
375
 
310
- context "with wait", :requires => [:js] do
311
- it "should not find element if it appears after given wait duration" do
376
+ context 'with wait', requires: [:js] do
377
+ it 'should not find element if it appears after given wait duration' do
312
378
  @session.visit('/with_js')
313
379
  @session.click_link('Click me')
314
- expect(@session).to have_no_text('Has been clicked', :wait => 0.1)
380
+ expect(@session).to have_no_text('Has been clicked', wait: 0.05)
315
381
  end
316
382
  end
317
383
  end
@@ -1,25 +1,45 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#has_title?' do
3
4
  before do
4
5
  @session.visit('/with_js')
5
6
  end
6
7
 
7
- it "should be true if the page has the given title" do
8
+ it 'should be true if the page has the given title' do
8
9
  expect(@session).to have_title('with_js')
10
+ expect(@session.has_title?('with_js')).to be true
9
11
  end
10
12
 
11
- it "should allow regexp matches" do
13
+ it 'should allow regexp matches' do
12
14
  expect(@session).to have_title(/w[a-z]{3}_js/)
13
15
  expect(@session).not_to have_title(/monkey/)
14
16
  end
15
17
 
16
- it "should wait for title", :requires => [:js] do
17
- @session.click_link("Change title")
18
- expect(@session).to have_title("changed title")
18
+ it 'should wait for title', requires: [:js] do
19
+ @session.click_link('Change title')
20
+ expect(@session).to have_title('changed title')
19
21
  end
20
22
 
21
- it "should be false if the page has not the given title" do
23
+ it 'should be false if the page has not the given title' do
22
24
  expect(@session).not_to have_title('monkey')
25
+ expect(@session.has_title?('monkey')).to be false
26
+ end
27
+
28
+ it 'should default to exact: false matching' do
29
+ expect(@session).to have_title('with_js', exact: false)
30
+ expect(@session).to have_title('with_', exact: false)
31
+ end
32
+
33
+ it 'should match exactly if exact: true option passed' do
34
+ expect(@session).to have_title('with_js', exact: true)
35
+ expect(@session).not_to have_title('with_', exact: true)
36
+ expect(@session.has_title?('with_js', exact: true)).to be true
37
+ expect(@session.has_title?('with_', exact: true)).to be false
38
+ end
39
+
40
+ it 'should match partial if exact: false option passed' do
41
+ expect(@session).to have_title('with_js', exact: false)
42
+ expect(@session).to have_title('with_', exact: false)
23
43
  end
24
44
  end
25
45
 
@@ -28,21 +48,24 @@ Capybara::SpecHelper.spec '#has_no_title?' do
28
48
  @session.visit('/with_js')
29
49
  end
30
50
 
31
- it "should be false if the page has the given title" do
51
+ it 'should be false if the page has the given title' do
32
52
  expect(@session).not_to have_no_title('with_js')
33
53
  end
34
54
 
35
- it "should allow regexp matches" do
55
+ it 'should allow regexp matches' do
36
56
  expect(@session).not_to have_no_title(/w[a-z]{3}_js/)
37
57
  expect(@session).to have_no_title(/monkey/)
38
58
  end
39
59
 
40
- it "should wait for title to disappear", :requires => [:js] do
41
- @session.click_link("Change title")
42
- expect(@session).to have_no_title('with_js')
60
+ it 'should wait for title to disappear', requires: [:js] do
61
+ Capybara.using_wait_time(5) do
62
+ @session.click_link('Change title') # triggers title change after 400ms
63
+ expect(@session).to have_no_title('with_js')
64
+ end
43
65
  end
44
66
 
45
- it "should be true if the page has not the given title" do
67
+ it 'should be true if the page has not the given title' do
46
68
  expect(@session).to have_no_title('monkey')
69
+ expect(@session.has_no_title?('monkey')).to be true
47
70
  end
48
71
  end