capybara 3.0.0 → 3.36.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 (308) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/History.md +777 -10
  4. data/License.txt +1 -1
  5. data/README.md +75 -58
  6. data/lib/capybara/config.rb +29 -10
  7. data/lib/capybara/cucumber.rb +1 -1
  8. data/lib/capybara/driver/base.rb +22 -4
  9. data/lib/capybara/driver/node.rb +34 -9
  10. data/lib/capybara/dsl.rb +14 -6
  11. data/lib/capybara/helpers.rb +52 -7
  12. data/lib/capybara/minitest/spec.rb +173 -84
  13. data/lib/capybara/minitest.rb +250 -144
  14. data/lib/capybara/node/actions.rb +248 -124
  15. data/lib/capybara/node/base.rb +34 -20
  16. data/lib/capybara/node/document.rb +14 -2
  17. data/lib/capybara/node/document_matchers.rb +13 -15
  18. data/lib/capybara/node/element.rb +339 -113
  19. data/lib/capybara/node/finders.rb +95 -82
  20. data/lib/capybara/node/matchers.rb +338 -157
  21. data/lib/capybara/node/simple.rb +54 -15
  22. data/lib/capybara/queries/active_element_query.rb +18 -0
  23. data/lib/capybara/queries/ancestor_query.rb +9 -10
  24. data/lib/capybara/queries/base_query.rb +25 -18
  25. data/lib/capybara/queries/current_path_query.rb +16 -6
  26. data/lib/capybara/queries/match_query.rb +11 -0
  27. data/lib/capybara/queries/selector_query.rb +600 -103
  28. data/lib/capybara/queries/sibling_query.rb +9 -7
  29. data/lib/capybara/queries/style_query.rb +45 -0
  30. data/lib/capybara/queries/text_query.rb +40 -22
  31. data/lib/capybara/queries/title_query.rb +2 -2
  32. data/lib/capybara/rack_test/browser.rb +47 -28
  33. data/lib/capybara/rack_test/driver.rb +12 -3
  34. data/lib/capybara/rack_test/errors.rb +6 -0
  35. data/lib/capybara/rack_test/form.rb +53 -50
  36. data/lib/capybara/rack_test/node.rb +114 -37
  37. data/lib/capybara/rails.rb +1 -1
  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 +86 -52
  43. data/lib/capybara/rspec/features.rb +8 -10
  44. data/lib/capybara/rspec/matcher_proxies.rb +39 -18
  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 +138 -316
  59. data/lib/capybara/rspec.rb +3 -2
  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 +89 -12
  63. data/lib/capybara/selector/definition/button.rb +68 -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 +279 -0
  85. data/lib/capybara/selector/filter.rb +1 -0
  86. data/lib/capybara/selector/filter_set.rb +72 -27
  87. data/lib/capybara/selector/filters/base.rb +45 -2
  88. data/lib/capybara/selector/filters/expression_filter.rb +5 -6
  89. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  90. data/lib/capybara/selector/filters/node_filter.rb +18 -4
  91. data/lib/capybara/selector/regexp_disassembler.rb +214 -0
  92. data/lib/capybara/selector/selector.rb +85 -200
  93. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  94. data/lib/capybara/selector.rb +226 -537
  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 +296 -238
  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 +436 -166
  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 +69 -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 +58 -67
  127. data/lib/capybara/session/config.rb +38 -6
  128. data/lib/capybara/session/matchers.rb +26 -19
  129. data/lib/capybara/session.rb +258 -190
  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 +122 -8
  133. data/lib/capybara/spec/session/accept_alert_spec.rb +11 -11
  134. data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -3
  135. data/lib/capybara/spec/session/accept_prompt_spec.rb +9 -10
  136. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  137. data/lib/capybara/spec/session/all_spec.rb +135 -42
  138. data/lib/capybara/spec/session/ancestor_spec.rb +24 -19
  139. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +67 -38
  140. data/lib/capybara/spec/session/{assert_current_path.rb → assert_current_path_spec.rb} +20 -18
  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.rb → assert_text_spec.rb} +62 -38
  144. data/lib/capybara/spec/session/{assert_title.rb → assert_title_spec.rb} +12 -12
  145. data/lib/capybara/spec/session/attach_file_spec.rb +120 -72
  146. data/lib/capybara/spec/session/body_spec.rb +11 -13
  147. data/lib/capybara/spec/session/check_spec.rb +111 -51
  148. data/lib/capybara/spec/session/choose_spec.rb +62 -30
  149. data/lib/capybara/spec/session/click_button_spec.rb +227 -161
  150. data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -30
  151. data/lib/capybara/spec/session/click_link_spec.rb +78 -55
  152. data/lib/capybara/spec/session/current_scope_spec.rb +7 -7
  153. data/lib/capybara/spec/session/current_url_spec.rb +44 -37
  154. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
  155. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -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 +8 -6
  159. data/lib/capybara/spec/session/element/matches_selector_spec.rb +70 -56
  160. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +7 -7
  161. data/lib/capybara/spec/session/evaluate_script_spec.rb +28 -8
  162. data/lib/capybara/spec/session/execute_script_spec.rb +8 -7
  163. data/lib/capybara/spec/session/fill_in_spec.rb +104 -44
  164. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  165. data/lib/capybara/spec/session/find_by_id_spec.rb +8 -8
  166. data/lib/capybara/spec/session/find_field_spec.rb +33 -31
  167. data/lib/capybara/spec/session/find_link_spec.rb +32 -14
  168. data/lib/capybara/spec/session/find_spec.rb +236 -141
  169. data/lib/capybara/spec/session/first_spec.rb +44 -43
  170. data/lib/capybara/spec/session/frame/frame_title_spec.rb +6 -6
  171. data/lib/capybara/spec/session/frame/frame_url_spec.rb +6 -6
  172. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +32 -20
  173. data/lib/capybara/spec/session/frame/within_frame_spec.rb +44 -19
  174. data/lib/capybara/spec/session/go_back_spec.rb +1 -1
  175. data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
  176. data/lib/capybara/spec/session/has_all_selectors_spec.rb +18 -18
  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 +92 -12
  180. data/lib/capybara/spec/session/has_css_spec.rb +271 -137
  181. data/lib/capybara/spec/session/has_current_path_spec.rb +48 -33
  182. data/lib/capybara/spec/session/has_field_spec.rb +137 -58
  183. data/lib/capybara/spec/session/has_link_spec.rb +30 -6
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +26 -24
  185. data/lib/capybara/spec/session/has_select_spec.rb +75 -47
  186. data/lib/capybara/spec/session/has_selector_spec.rb +102 -69
  187. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  188. data/lib/capybara/spec/session/has_table_spec.rb +170 -4
  189. data/lib/capybara/spec/session/has_text_spec.rb +108 -52
  190. data/lib/capybara/spec/session/has_title_spec.rb +19 -14
  191. data/lib/capybara/spec/session/has_xpath_spec.rb +56 -38
  192. data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +1 -1
  193. data/lib/capybara/spec/session/html_spec.rb +13 -6
  194. data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
  195. data/lib/capybara/spec/session/node_spec.rb +871 -122
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +15 -12
  197. data/lib/capybara/spec/session/refresh_spec.rb +9 -7
  198. data/lib/capybara/spec/session/reset_session_spec.rb +52 -37
  199. data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +1 -1
  200. data/lib/capybara/spec/session/save_and_open_page_spec.rb +2 -2
  201. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +5 -4
  202. data/lib/capybara/spec/session/save_page_spec.rb +41 -38
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +13 -11
  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 +102 -76
  207. data/lib/capybara/spec/session/selectors_spec.rb +51 -18
  208. data/lib/capybara/spec/session/sibling_spec.rb +9 -9
  209. data/lib/capybara/spec/session/text_spec.rb +26 -24
  210. data/lib/capybara/spec/session/title_spec.rb +8 -6
  211. data/lib/capybara/spec/session/uncheck_spec.rb +40 -21
  212. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  213. data/lib/capybara/spec/session/visit_spec.rb +59 -53
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +22 -19
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +4 -3
  216. data/lib/capybara/spec/session/window/open_new_window_spec.rb +4 -3
  217. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +25 -21
  218. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +10 -5
  219. data/lib/capybara/spec/session/window/window_spec.rb +88 -54
  220. data/lib/capybara/spec/session/window/windows_spec.rb +10 -7
  221. data/lib/capybara/spec/session/window/within_window_spec.rb +17 -16
  222. data/lib/capybara/spec/session/within_spec.rb +69 -44
  223. data/lib/capybara/spec/spec_helper.rb +41 -53
  224. data/lib/capybara/spec/test_app.rb +79 -40
  225. data/lib/capybara/spec/views/animated.erb +49 -0
  226. data/lib/capybara/spec/views/form.erb +134 -42
  227. data/lib/capybara/spec/views/frame_child.erb +4 -3
  228. data/lib/capybara/spec/views/frame_one.erb +2 -1
  229. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  230. data/lib/capybara/spec/views/frame_two.erb +1 -1
  231. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  232. data/lib/capybara/spec/views/layout.erb +10 -0
  233. data/lib/capybara/spec/views/obscured.erb +47 -0
  234. data/lib/capybara/spec/views/offset.erb +33 -0
  235. data/lib/capybara/spec/views/path.erb +2 -2
  236. data/lib/capybara/spec/views/popup_one.erb +1 -1
  237. data/lib/capybara/spec/views/popup_two.erb +1 -1
  238. data/lib/capybara/spec/views/react.erb +45 -0
  239. data/lib/capybara/spec/views/scroll.erb +21 -0
  240. data/lib/capybara/spec/views/spatial.erb +31 -0
  241. data/lib/capybara/spec/views/tables.erb +68 -1
  242. data/lib/capybara/spec/views/with_animation.erb +81 -0
  243. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  244. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  245. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  246. data/lib/capybara/spec/views/with_hover.erb +3 -2
  247. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  248. data/lib/capybara/spec/views/with_html.erb +43 -10
  249. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  250. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  251. data/lib/capybara/spec/views/with_js.erb +30 -5
  252. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  253. data/lib/capybara/spec/views/with_namespace.erb +21 -0
  254. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  255. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  256. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  257. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  258. data/lib/capybara/spec/views/with_windows.erb +1 -1
  259. data/lib/capybara/spec/views/within_frames.erb +1 -1
  260. data/lib/capybara/version.rb +1 -1
  261. data/lib/capybara/window.rb +31 -25
  262. data/lib/capybara.rb +120 -100
  263. data/spec/basic_node_spec.rb +59 -34
  264. data/spec/capybara_spec.rb +54 -52
  265. data/spec/css_builder_spec.rb +101 -0
  266. data/spec/css_splitter_spec.rb +38 -0
  267. data/spec/dsl_spec.rb +80 -53
  268. data/spec/filter_set_spec.rb +24 -7
  269. data/spec/fixtures/certificate.pem +25 -0
  270. data/spec/fixtures/key.pem +27 -0
  271. data/spec/fixtures/selenium_driver_rspec_failure.rb +4 -4
  272. data/spec/fixtures/selenium_driver_rspec_success.rb +4 -4
  273. data/spec/minitest_spec.rb +38 -5
  274. data/spec/minitest_spec_spec.rb +88 -62
  275. data/spec/per_session_config_spec.rb +5 -5
  276. data/spec/rack_test_spec.rb +169 -115
  277. data/spec/regexp_dissassembler_spec.rb +250 -0
  278. data/spec/result_spec.rb +86 -33
  279. data/spec/rspec/features_spec.rb +26 -23
  280. data/spec/rspec/scenarios_spec.rb +8 -4
  281. data/spec/rspec/shared_spec_matchers.rb +393 -363
  282. data/spec/rspec/views_spec.rb +4 -3
  283. data/spec/rspec_matchers_spec.rb +10 -10
  284. data/spec/rspec_spec.rb +109 -85
  285. data/spec/sauce_spec_chrome.rb +43 -0
  286. data/spec/selector_spec.rb +391 -61
  287. data/spec/selenium_spec_chrome.rb +180 -41
  288. data/spec/selenium_spec_chrome_remote.rb +101 -0
  289. data/spec/selenium_spec_edge.rb +28 -8
  290. data/spec/selenium_spec_firefox.rb +211 -0
  291. data/spec/selenium_spec_firefox_remote.rb +80 -0
  292. data/spec/selenium_spec_ie.rb +127 -11
  293. data/spec/selenium_spec_safari.rb +156 -0
  294. data/spec/server_spec.rb +177 -78
  295. data/spec/session_spec.rb +52 -16
  296. data/spec/shared_selenium_node.rb +79 -0
  297. data/spec/shared_selenium_session.rb +455 -123
  298. data/spec/spec_helper.rb +91 -2
  299. data/spec/xpath_builder_spec.rb +93 -0
  300. metadata +343 -42
  301. data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
  302. data/.yard/templates_custom/default/class/html/setup.rb +0 -17
  303. data/.yard/yard_extensions.rb +0 -78
  304. data/lib/capybara/rspec/compound.rb +0 -90
  305. data/lib/capybara/spec/session/assert_selector.rb +0 -149
  306. data/lib/capybara/spec/session/source_spec.rb +0 -0
  307. data/lib/capybara/spec/views/with_title.erb +0 -5
  308. data/spec/selenium_spec_marionette.rb +0 -143
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Capybara::SpecHelper.spec '#has_text?' do
4
- 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
5
5
  @session.visit('/with_html')
6
6
  expect(@session).to have_text('est')
7
7
  expect(@session).to have_text('Lorem')
@@ -9,32 +9,51 @@ Capybara::SpecHelper.spec '#has_text?' do
9
9
  expect(@session).to have_text(:Redirect)
10
10
  end
11
11
 
12
- 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
13
13
  @session.visit('/with_html')
14
14
  @session.within("//a[@title='awesome title']") do
15
15
  expect(@session).to have_text('labore')
16
16
  end
17
17
  end
18
18
 
19
- 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
20
20
  @session.visit('/with_html')
21
21
  @session.within("//a[@title='awesome title']") do
22
22
  expect(@session).not_to have_text('monkey')
23
23
  end
24
24
  end
25
25
 
26
- it "should ignore tags" do
26
+ it 'should ignore tags' do
27
27
  @session.visit('/with_html')
28
28
  expect(@session).not_to have_text('exercitation <a href="/foo" id="foo">ullamco</a> laboris')
29
29
  expect(@session).to have_text('exercitation ullamco laboris')
30
30
  end
31
31
 
32
- it "should search correctly normalized text" do
32
+ it 'should search correctly normalized text' do
33
33
  @session.visit('/with_html')
34
34
  expect(@session).to have_text('text with whitespace')
35
35
  end
36
36
 
37
- it "should be false if the given text is not on the page" do
37
+ it 'should search whitespace collapsed text' do
38
+ @session.visit('/with_html')
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
54
+ end
55
+
56
+ it 'should be false if the given text is not on the page' do
38
57
  @session.visit('/with_html')
39
58
  expect(@session).not_to have_text('xxxxyzzz')
40
59
  expect(@session).not_to have_text('monkey')
@@ -66,23 +85,23 @@ Capybara::SpecHelper.spec '#has_text?' do
66
85
  expect(@session).not_to have_text('aVar')
67
86
  end
68
87
 
69
- 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
70
89
  @session.visit('/with_html')
71
90
  expect(@session).not_to have_text('Inside element with hidden ancestor')
72
91
  end
73
92
 
74
- 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
75
94
  @session.visit('/with_html')
76
95
  expect(@session).to have_text(:all, 'Some of this text is hidden!')
77
96
  end
78
97
 
79
- it "should be true if `Capybara.ignore_hidden_elements = false` and text is invisible." do
98
+ it 'should be true if `Capybara.ignore_hidden_elements = false` and text is invisible.' do
80
99
  Capybara.ignore_hidden_elements = false
81
100
  @session.visit('/with_html')
82
101
  expect(@session).to have_text('Some of this text is hidden!')
83
102
  end
84
103
 
85
- 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
86
105
  @session.visit('/with_html')
87
106
  expect(@session).to have_text(/Lorem/)
88
107
  end
@@ -92,50 +111,80 @@ Capybara::SpecHelper.spec '#has_text?' do
92
111
  expect(@session).not_to have_text(/xxxxyzzz/)
93
112
  end
94
113
 
95
- context "with exact: true option" do
96
- it "should be true if text matches exactly" 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
97
120
  @session.visit('/with_html')
98
- expect(@session.find(:id, "h2one")).to have_text("Header Class Test One", exact: true)
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)
99
142
  end
100
143
 
101
144
  it "should be false if text doesn't match exactly" do
102
145
  @session.visit('/with_html')
103
- expect(@session.find(:id, "h2one")).not_to have_text("Header Class Test On", exact: true)
146
+ expect(@session.find(:id, 'h2one')).not_to have_text('Header Class Test On', exact: true)
104
147
  end
105
148
  end
106
149
 
107
- it "should escape any characters that would have special meaning in a regexp" do
150
+ it 'should escape any characters that would have special meaning in a regexp' do
108
151
  @session.visit('/with_html')
109
152
  expect(@session).not_to have_text('.orem')
110
153
  end
111
154
 
112
- it "should accept non-string parameters" do
155
+ it 'should accept non-string parameters' do
113
156
  @session.visit('/with_html')
114
157
  expect(@session).to have_text(42)
115
158
  end
116
159
 
117
- it "should be true when passed nil" do
160
+ it 'should be true when passed nil' do
118
161
  # nil is converted to '' when to_s is invoked
119
162
  @session.visit('/with_html')
120
163
  expect(@session).to have_text(nil)
121
164
  end
122
165
 
123
- it "should wait for text to appear", requires: [:js] do
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
124
173
  Capybara.using_wait_time(3) do
125
174
  @session.visit('/with_js')
126
175
  @session.click_link('Click me')
127
- expect(@session).to have_text("Has been clicked")
176
+ expect(@session).to have_text('Has been clicked')
128
177
  end
129
178
  end
130
179
 
131
- context "with between" do
132
- 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
133
182
  @session.visit('/with_count')
134
183
  expect(@session).to have_text('count', between: 1..3)
135
184
  expect(@session).to have_text(/count/, between: 2..2)
136
185
  end
137
186
 
138
- 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
139
188
  @session.visit('/with_count')
140
189
  expect(@session).not_to have_text('count', between: 0..1)
141
190
  expect(@session).not_to have_text('count', between: 3..10)
@@ -143,76 +192,82 @@ Capybara::SpecHelper.spec '#has_text?' do
143
192
  end
144
193
  end
145
194
 
146
- context "with count" do
147
- 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
148
197
  @session.visit('/with_count')
149
198
  expect(@session).to have_text('count', count: 2)
199
+ expect(@session).to have_text('count').exactly(2).times
150
200
  end
151
201
 
152
- 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
153
203
  @session.visit('/with_count')
154
204
  expect(@session).not_to have_text('count', count: 0)
155
205
  expect(@session).not_to have_text('count', count: 1)
206
+ expect(@session).not_to have_text('count').once
156
207
  expect(@session).not_to have_text(/count/, count: 3)
157
208
  end
158
209
 
159
- it "should coerce count to an integer" do
210
+ it 'should coerce count to an integer' do
160
211
  @session.visit('/with_count')
161
212
  expect(@session).to have_text('count', count: '2')
162
213
  expect(@session).not_to have_text('count', count: '3')
163
214
  end
164
215
  end
165
216
 
166
- context "with maximum" do
167
- 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
168
219
  @session.visit('/with_count')
169
220
  expect(@session).to have_text('count', maximum: 2)
221
+ expect(@session).to have_text('count').at_most(2).times
170
222
  expect(@session).to have_text(/count/, maximum: 3)
171
223
  end
172
224
 
173
- 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
174
226
  @session.visit('/with_count')
175
227
  expect(@session).not_to have_text('count', maximum: 1)
228
+ expect(@session).not_to have_text('count').at_most(1).times
176
229
  expect(@session).not_to have_text('count', maximum: 0)
177
230
  end
178
231
 
179
- it "should coerce maximum to an integer" do
232
+ it 'should coerce maximum to an integer' do
180
233
  @session.visit('/with_count')
181
234
  expect(@session).to have_text('count', maximum: '2')
182
235
  expect(@session).not_to have_text('count', maximum: '1')
183
236
  end
184
237
  end
185
238
 
186
- context "with minimum" do
187
- 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
188
241
  @session.visit('/with_count')
189
242
  expect(@session).to have_text('count', minimum: 2)
243
+ expect(@session).to have_text('count').at_least(2).times
190
244
  expect(@session).to have_text(/count/, minimum: 0)
191
245
  end
192
246
 
193
- 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
194
248
  @session.visit('/with_count')
195
249
  expect(@session).not_to have_text('count', minimum: 3)
250
+ expect(@session).not_to have_text('count').at_least(3).times
196
251
  end
197
252
 
198
- it "should coerce minimum to an integer" do
253
+ it 'should coerce minimum to an integer' do
199
254
  @session.visit('/with_count')
200
255
  expect(@session).to have_text('count', minimum: '2')
201
256
  expect(@session).not_to have_text('count', minimum: '3')
202
257
  end
203
258
  end
204
259
 
205
- context "with wait", requires: [:js] do
206
- 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
207
262
  Capybara.using_wait_time(0.1) do
208
263
  @session.visit('/with_js')
209
264
  @session.click_link('Click me')
210
- expect(@session).to have_text('Has been clicked', wait: 0.9)
265
+ expect(@session).to have_text('Has been clicked', wait: 3)
211
266
  end
212
267
  end
213
268
  end
214
269
 
215
- 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
216
271
  @session.visit('/with_html')
217
272
  expect do
218
273
  expect(@session).to have_text('Lorem', invalid: true)
@@ -221,34 +276,34 @@ Capybara::SpecHelper.spec '#has_text?' do
221
276
  end
222
277
 
223
278
  Capybara::SpecHelper.spec '#has_no_text?' do
224
- 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
225
280
  @session.visit('/with_html')
226
281
  expect(@session).not_to have_no_text('est')
227
282
  expect(@session).not_to have_no_text('Lorem')
228
283
  expect(@session).not_to have_no_text('Redirect')
229
284
  end
230
285
 
231
- 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
232
287
  @session.visit('/with_html')
233
288
  @session.within("//a[@title='awesome title']") do
234
289
  expect(@session).not_to have_no_text('labore')
235
290
  end
236
291
  end
237
292
 
238
- 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
239
294
  @session.visit('/with_html')
240
295
  @session.within("//a[@title='awesome title']") do
241
296
  expect(@session).to have_no_text('monkey')
242
297
  end
243
298
  end
244
299
 
245
- it "should ignore tags" do
300
+ it 'should ignore tags' do
246
301
  @session.visit('/with_html')
247
302
  expect(@session).to have_no_text('exercitation <a href="/foo" id="foo">ullamco</a> laboris')
248
303
  expect(@session).not_to have_no_text('exercitation ullamco laboris')
249
304
  end
250
305
 
251
- 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
252
307
  @session.visit('/with_html')
253
308
  expect(@session).to have_no_text('xxxxyzzz')
254
309
  expect(@session).to have_no_text('monkey')
@@ -280,17 +335,17 @@ Capybara::SpecHelper.spec '#has_no_text?' do
280
335
  expect(@session).to have_no_text('aVar')
281
336
  end
282
337
 
283
- 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
284
339
  @session.visit('/with_html')
285
340
  expect(@session).to have_no_text('Inside element with hidden ancestor')
286
341
  end
287
342
 
288
- 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
289
344
  @session.visit('/with_html')
290
345
  expect(@session).not_to have_no_text(:all, 'Some of this text is hidden!')
291
346
  end
292
347
 
293
- it "should be false if `Capybara.ignore_hidden_elements = false` and text is invisible." do
348
+ it 'should be false if `Capybara.ignore_hidden_elements = false` and text is invisible.' do
294
349
  Capybara.ignore_hidden_elements = false
295
350
  @session.visit('/with_html')
296
351
  expect(@session).not_to have_no_text('Some of this text is hidden!')
@@ -301,24 +356,25 @@ Capybara::SpecHelper.spec '#has_no_text?' do
301
356
  expect(@session).to have_no_text(/xxxxyzzz/)
302
357
  end
303
358
 
304
- 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
305
360
  @session.visit('/with_html')
306
361
  expect(@session).not_to have_no_text(/Lorem/)
307
362
  end
308
363
 
309
- 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
310
365
  @session.visit('/with_html')
311
366
  expect(@session).to have_no_text('.orem')
312
367
  end
313
368
 
314
- 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
315
371
  @session.visit('/with_js')
316
372
  @session.click_link('Click me')
317
- expect(@session).to have_no_text("I changed it")
373
+ expect(@session).to have_no_text('I changed it')
318
374
  end
319
375
 
320
- context "with wait", requires: [:js] do
321
- 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
322
378
  @session.visit('/with_js')
323
379
  @session.click_link('Click me')
324
380
  expect(@session).to have_no_text('Has been clicked', wait: 0.05)
@@ -5,35 +5,39 @@ Capybara::SpecHelper.spec '#has_title?' do
5
5
  @session.visit('/with_js')
6
6
  end
7
7
 
8
- 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
9
9
  expect(@session).to have_title('with_js')
10
+ expect(@session.has_title?('with_js')).to be true
10
11
  end
11
12
 
12
- it "should allow regexp matches" do
13
+ it 'should allow regexp matches' do
13
14
  expect(@session).to have_title(/w[a-z]{3}_js/)
14
15
  expect(@session).not_to have_title(/monkey/)
15
16
  end
16
17
 
17
- it "should wait for title", requires: [:js] do
18
- @session.click_link("Change title")
19
- 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')
20
21
  end
21
22
 
22
- 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
23
24
  expect(@session).not_to have_title('monkey')
25
+ expect(@session.has_title?('monkey')).to be false
24
26
  end
25
27
 
26
- it "should default to exact: false matching" do
28
+ it 'should default to exact: false matching' do
27
29
  expect(@session).to have_title('with_js', exact: false)
28
30
  expect(@session).to have_title('with_', exact: false)
29
31
  end
30
32
 
31
- it "should match exactly if exact: true option passed" do
33
+ it 'should match exactly if exact: true option passed' do
32
34
  expect(@session).to have_title('with_js', exact: true)
33
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
34
38
  end
35
39
 
36
- it "should match partial if exact: false option passed" do
40
+ it 'should match partial if exact: false option passed' do
37
41
  expect(@session).to have_title('with_js', exact: false)
38
42
  expect(@session).to have_title('with_', exact: false)
39
43
  end
@@ -44,23 +48,24 @@ Capybara::SpecHelper.spec '#has_no_title?' do
44
48
  @session.visit('/with_js')
45
49
  end
46
50
 
47
- 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
48
52
  expect(@session).not_to have_no_title('with_js')
49
53
  end
50
54
 
51
- it "should allow regexp matches" do
55
+ it 'should allow regexp matches' do
52
56
  expect(@session).not_to have_no_title(/w[a-z]{3}_js/)
53
57
  expect(@session).to have_no_title(/monkey/)
54
58
  end
55
59
 
56
- it "should wait for title to disappear", requires: [:js] do
60
+ it 'should wait for title to disappear', requires: [:js] do
57
61
  Capybara.using_wait_time(5) do
58
- @session.click_link("Change title") # triggers title change after 400ms
62
+ @session.click_link('Change title') # triggers title change after 400ms
59
63
  expect(@session).to have_no_title('with_js')
60
64
  end
61
65
  end
62
66
 
63
- 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
64
68
  expect(@session).to have_no_title('monkey')
69
+ expect(@session.has_no_title?('monkey')).to be true
65
70
  end
66
71
  end
@@ -5,31 +5,45 @@ Capybara::SpecHelper.spec '#has_xpath?' do
5
5
  @session.visit('/with_html')
6
6
  end
7
7
 
8
- it "should be true if the given selector is on the page" do
9
- expect(@session).to have_xpath("//p")
8
+ it 'should be true if the given selector is on the page' do
9
+ expect(@session).to have_xpath('//p')
10
10
  expect(@session).to have_xpath("//p//a[@id='foo']")
11
11
  expect(@session).to have_xpath("//p[contains(.,'est')]")
12
12
  end
13
13
 
14
- it "should be false if the given selector is not on the page" do
15
- expect(@session).not_to have_xpath("//abbr")
14
+ it 'should support :id option' do
15
+ expect(@session).to have_xpath('//h2', id: 'h2one')
16
+ expect(@session).to have_xpath('//h2')
17
+ expect(@session).to have_xpath('//h2', id: /h2o/)
18
+ end
19
+
20
+ it 'should support :class option' do
21
+ expect(@session).to have_xpath('//li', class: 'guitarist')
22
+ expect(@session).to have_xpath('//li', class: /guitar/)
23
+ expect(@session).to have_xpath('//li', class: /guitar|drummer/)
24
+ expect(@session).to have_xpath('//li', class: %w[beatle guitarist])
25
+ expect(@session).to have_xpath('//li', class: /.*/)
26
+ end
27
+
28
+ it 'should be false if the given selector is not on the page' do
29
+ expect(@session).not_to have_xpath('//abbr')
16
30
  expect(@session).not_to have_xpath("//p//a[@id='doesnotexist']")
17
31
  expect(@session).not_to have_xpath("//p[contains(.,'thisstringisnotonpage')]")
18
32
  end
19
33
 
20
- it "should use xpath even if default selector is CSS" do
34
+ it 'should use xpath even if default selector is CSS' do
21
35
  Capybara.default_selector = :css
22
36
  expect(@session).not_to have_xpath("//p//a[@id='doesnotexist']")
23
37
  end
24
38
 
25
- it "should respect scopes" do
39
+ it 'should respect scopes' do
26
40
  @session.within "//p[@id='first']" do
27
41
  expect(@session).to have_xpath(".//a[@id='foo']")
28
42
  expect(@session).not_to have_xpath(".//a[@id='red']")
29
43
  end
30
44
  end
31
45
 
32
- it "should wait for content to appear", requires: [:js] do
46
+ it 'should wait for content to appear', requires: [:js] do
33
47
  Capybara.using_wait_time(3) do
34
48
  @session.visit('/with_js')
35
49
  @session.click_link('Click me') # updates page after 500ms
@@ -37,31 +51,34 @@ Capybara::SpecHelper.spec '#has_xpath?' do
37
51
  end
38
52
  end
39
53
 
40
- context "with count" do
41
- it "should be true if the content occurs the given number of times" do
42
- expect(@session).to have_xpath("//p", count: 3)
54
+ context 'with count' do
55
+ it 'should be true if the content occurs the given number of times' do
56
+ expect(@session).to have_xpath('//p', count: 3)
43
57
  expect(@session).to have_xpath("//p//a[@id='foo']", count: 1)
44
58
  expect(@session).to have_xpath("//p[contains(.,'est')]", count: 1)
45
59
  expect(@session).to have_xpath("//p//a[@id='doesnotexist']", count: 0)
60
+ expect(@session).to have_xpath('//li', class: /guitar|drummer/, count: 4)
61
+ expect(@session).to have_xpath('//li', id: /john|paul/, class: /guitar|drummer/, count: 2)
62
+ expect(@session).to have_xpath('//li', class: %w[beatle guitarist], count: 2)
46
63
  end
47
64
 
48
- it "should be false if the content occurs a different number of times than the given" do
49
- expect(@session).not_to have_xpath("//p", count: 6)
65
+ it 'should be false if the content occurs a different number of times than the given' do
66
+ expect(@session).not_to have_xpath('//p', count: 6)
50
67
  expect(@session).not_to have_xpath("//p//a[@id='foo']", count: 2)
51
68
  expect(@session).not_to have_xpath("//p[contains(.,'est')]", count: 5)
52
69
  expect(@session).not_to have_xpath("//p//a[@id='doesnotexist']", count: 1)
53
70
  end
54
71
  end
55
72
 
56
- context "with text" do
57
- it "should discard all matches where the given string is not contained" do
58
- expect(@session).to have_xpath("//p//a", text: "Redirect", count: 1)
59
- expect(@session).not_to have_xpath("//p", text: "Doesnotexist")
73
+ context 'with text' do
74
+ it 'should discard all matches where the given string is not contained' do
75
+ expect(@session).to have_xpath('//p//a', text: 'Redirect', count: 1)
76
+ expect(@session).not_to have_xpath('//p', text: 'Doesnotexist')
60
77
  end
61
78
 
62
- it "should discard all matches where the given regexp is not matched" do
63
- expect(@session).to have_xpath("//p//a", text: /re[dab]i/i, count: 1)
64
- expect(@session).not_to have_xpath("//p//a", text: /Red$/)
79
+ it 'should discard all matches where the given regexp is not matched' do
80
+ expect(@session).to have_xpath('//p//a', text: /re[dab]i/i, count: 1)
81
+ expect(@session).not_to have_xpath('//p//a', text: /Red$/)
65
82
  end
66
83
  end
67
84
  end
@@ -71,61 +88,62 @@ Capybara::SpecHelper.spec '#has_no_xpath?' do
71
88
  @session.visit('/with_html')
72
89
  end
73
90
 
74
- it "should be false if the given selector is on the page" do
75
- expect(@session).not_to have_no_xpath("//p")
91
+ it 'should be false if the given selector is on the page' do
92
+ expect(@session).not_to have_no_xpath('//p')
76
93
  expect(@session).not_to have_no_xpath("//p//a[@id='foo']")
77
94
  expect(@session).not_to have_no_xpath("//p[contains(.,'est')]")
78
95
  end
79
96
 
80
- it "should be true if the given selector is not on the page" do
81
- expect(@session).to have_no_xpath("//abbr")
97
+ it 'should be true if the given selector is not on the page' do
98
+ expect(@session).to have_no_xpath('//abbr')
82
99
  expect(@session).to have_no_xpath("//p//a[@id='doesnotexist']")
83
100
  expect(@session).to have_no_xpath("//p[contains(.,'thisstringisnotonpage')]")
84
101
  end
85
102
 
86
- it "should use xpath even if default selector is CSS" do
103
+ it 'should use xpath even if default selector is CSS' do
87
104
  Capybara.default_selector = :css
88
105
  expect(@session).to have_no_xpath("//p//a[@id='doesnotexist']")
89
106
  end
90
107
 
91
- it "should respect scopes" do
108
+ it 'should respect scopes' do
92
109
  @session.within "//p[@id='first']" do
93
110
  expect(@session).not_to have_no_xpath(".//a[@id='foo']")
94
111
  expect(@session).to have_no_xpath(".//a[@id='red']")
95
112
  end
96
113
  end
97
114
 
98
- it "should wait for content to disappear", requires: [:js] do
115
+ it 'should wait for content to disappear', requires: [:js] do
116
+ Capybara.default_max_wait_time = 2
99
117
  @session.visit('/with_js')
100
118
  @session.click_link('Click me')
101
119
  expect(@session).to have_no_xpath("//p[@id='change']")
102
120
  end
103
121
 
104
- context "with count" do
105
- it "should be false if the content occurs the given number of times" do
106
- expect(@session).not_to have_no_xpath("//p", count: 3)
122
+ context 'with count' do
123
+ it 'should be false if the content occurs the given number of times' do
124
+ expect(@session).not_to have_no_xpath('//p', count: 3)
107
125
  expect(@session).not_to have_no_xpath("//p//a[@id='foo']", count: 1)
108
126
  expect(@session).not_to have_no_xpath("//p[contains(.,'est')]", count: 1)
109
127
  expect(@session).not_to have_no_xpath("//p//a[@id='doesnotexist']", count: 0)
110
128
  end
111
129
 
112
- it "should be true if the content occurs a different number of times than the given" do
113
- expect(@session).to have_no_xpath("//p", count: 6)
130
+ it 'should be true if the content occurs a different number of times than the given' do
131
+ expect(@session).to have_no_xpath('//p', count: 6)
114
132
  expect(@session).to have_no_xpath("//p//a[@id='foo']", count: 2)
115
133
  expect(@session).to have_no_xpath("//p[contains(.,'est')]", count: 5)
116
134
  expect(@session).to have_no_xpath("//p//a[@id='doesnotexist']", count: 1)
117
135
  end
118
136
  end
119
137
 
120
- context "with text" do
121
- it "should discard all matches where the given string is contained" do
122
- expect(@session).not_to have_no_xpath("//p//a", text: "Redirect", count: 1)
123
- expect(@session).to have_no_xpath("//p", text: "Doesnotexist")
138
+ context 'with text' do
139
+ it 'should discard all matches where the given string is contained' do
140
+ expect(@session).not_to have_no_xpath('//p//a', text: 'Redirect', count: 1)
141
+ expect(@session).to have_no_xpath('//p', text: 'Doesnotexist')
124
142
  end
125
143
 
126
- it "should discard all matches where the given regexp is matched" do
127
- expect(@session).not_to have_no_xpath("//p//a", text: /re[dab]i/i, count: 1)
128
- expect(@session).to have_no_xpath("//p//a", text: /Red$/)
144
+ it 'should discard all matches where the given regexp is matched' do
145
+ expect(@session).not_to have_no_xpath('//p//a', text: /re[dab]i/i, count: 1)
146
+ expect(@session).to have_no_xpath('//p//a', text: /Red$/)
129
147
  end
130
148
  end
131
149
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Capybara::SpecHelper.spec '#response_headers' do
4
- it "should return response headers", requires: [:response_headers] do
4
+ it 'should return response headers', requires: [:response_headers] do
5
5
  @session.visit('/with_simple_html')
6
6
  expect(@session.response_headers['Content-Type']).to match %r{text/html}
7
7
  end