capybara 3.0.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 (312) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/History.md +891 -12
  4. data/License.txt +1 -1
  5. data/README.md +257 -84
  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 +38 -9
  10. data/lib/capybara/dsl.rb +9 -7
  11. data/lib/capybara/helpers.rb +57 -8
  12. data/lib/capybara/minitest/spec.rb +185 -84
  13. data/lib/capybara/minitest.rb +264 -145
  14. data/lib/capybara/node/actions.rb +248 -124
  15. data/lib/capybara/node/base.rb +35 -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 +350 -113
  19. data/lib/capybara/node/finders.rb +104 -82
  20. data/lib/capybara/node/matchers.rb +363 -157
  21. data/lib/capybara/node/simple.rb +54 -15
  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 +9 -10
  25. data/lib/capybara/queries/base_query.rb +25 -18
  26. data/lib/capybara/queries/current_path_query.rb +16 -6
  27. data/lib/capybara/queries/match_query.rb +11 -0
  28. data/lib/capybara/queries/selector_query.rb +617 -104
  29. data/lib/capybara/queries/sibling_query.rb +9 -7
  30. data/lib/capybara/queries/style_query.rb +45 -0
  31. data/lib/capybara/queries/text_query.rb +40 -22
  32. data/lib/capybara/queries/title_query.rb +2 -2
  33. data/lib/capybara/rack_test/browser.rb +106 -31
  34. data/lib/capybara/rack_test/driver.rb +16 -7
  35. data/lib/capybara/rack_test/errors.rb +6 -0
  36. data/lib/capybara/rack_test/form.rb +74 -49
  37. data/lib/capybara/rack_test/node.rb +120 -47
  38. data/lib/capybara/rails.rb +1 -1
  39. data/lib/capybara/registration_container.rb +41 -0
  40. data/lib/capybara/registrations/drivers.rb +42 -0
  41. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  42. data/lib/capybara/registrations/servers.rb +66 -0
  43. data/lib/capybara/result.rb +87 -53
  44. data/lib/capybara/rspec/features.rb +8 -10
  45. data/lib/capybara/rspec/matcher_proxies.rb +39 -18
  46. data/lib/capybara/rspec/matchers/base.rb +113 -0
  47. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  48. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  49. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  50. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  51. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  52. data/lib/capybara/rspec/matchers/have_selector.rb +69 -0
  53. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  54. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  55. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  56. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  57. data/lib/capybara/rspec/matchers/match_style.rb +43 -0
  58. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  59. data/lib/capybara/rspec/matchers.rb +142 -315
  60. data/lib/capybara/rspec.rb +3 -2
  61. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  62. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  63. data/lib/capybara/selector/css.rb +85 -8
  64. data/lib/capybara/selector/definition/button.rb +68 -0
  65. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  66. data/lib/capybara/selector/definition/css.rb +10 -0
  67. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  68. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  69. data/lib/capybara/selector/definition/element.rb +28 -0
  70. data/lib/capybara/selector/definition/field.rb +40 -0
  71. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  72. data/lib/capybara/selector/definition/file_field.rb +13 -0
  73. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  74. data/lib/capybara/selector/definition/frame.rb +17 -0
  75. data/lib/capybara/selector/definition/id.rb +6 -0
  76. data/lib/capybara/selector/definition/label.rb +62 -0
  77. data/lib/capybara/selector/definition/link.rb +55 -0
  78. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  79. data/lib/capybara/selector/definition/option.rb +27 -0
  80. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  81. data/lib/capybara/selector/definition/select.rb +81 -0
  82. data/lib/capybara/selector/definition/table.rb +109 -0
  83. data/lib/capybara/selector/definition/table_row.rb +21 -0
  84. data/lib/capybara/selector/definition/xpath.rb +5 -0
  85. data/lib/capybara/selector/definition.rb +280 -0
  86. data/lib/capybara/selector/filter.rb +1 -0
  87. data/lib/capybara/selector/filter_set.rb +72 -28
  88. data/lib/capybara/selector/filters/base.rb +45 -2
  89. data/lib/capybara/selector/filters/expression_filter.rb +5 -6
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +18 -4
  92. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  93. data/lib/capybara/selector/selector.rb +89 -200
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/lib/capybara/selector.rb +474 -534
  96. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  97. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  98. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  99. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  100. data/lib/capybara/selenium/driver.rb +270 -245
  101. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  102. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
  103. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
  104. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  105. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  106. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  107. data/lib/capybara/selenium/extensions/find.rb +110 -0
  108. data/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
  109. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  110. data/lib/capybara/selenium/extensions/scroll.rb +76 -0
  111. data/lib/capybara/selenium/node.rb +460 -170
  112. data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
  113. data/lib/capybara/selenium/nodes/edge_node.rb +110 -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/atoms.rb +18 -0
  118. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  119. data/lib/capybara/selenium/patches/logs.rb +45 -0
  120. data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
  121. data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  122. data/lib/capybara/server/animation_disabler.rb +80 -0
  123. data/lib/capybara/server/checker.rb +44 -0
  124. data/lib/capybara/server/middleware.rb +71 -0
  125. data/lib/capybara/server.rb +58 -67
  126. data/lib/capybara/session/config.rb +40 -6
  127. data/lib/capybara/session/matchers.rb +26 -19
  128. data/lib/capybara/session.rb +252 -194
  129. data/lib/capybara/spec/public/jquery.js +5 -5
  130. data/lib/capybara/spec/public/offset.js +6 -0
  131. data/lib/capybara/spec/public/test.js +126 -8
  132. data/lib/capybara/spec/session/accept_alert_spec.rb +11 -11
  133. data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -3
  134. data/lib/capybara/spec/session/accept_prompt_spec.rb +9 -10
  135. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  136. data/lib/capybara/spec/session/all_spec.rb +135 -44
  137. data/lib/capybara/spec/session/ancestor_spec.rb +24 -19
  138. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +67 -38
  139. data/lib/capybara/spec/session/{assert_current_path.rb → assert_current_path_spec.rb} +20 -18
  140. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  141. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  142. data/lib/capybara/spec/session/{assert_text.rb → assert_text_spec.rb} +76 -52
  143. data/lib/capybara/spec/session/{assert_title.rb → assert_title_spec.rb} +12 -12
  144. data/lib/capybara/spec/session/attach_file_spec.rb +126 -72
  145. data/lib/capybara/spec/session/body_spec.rb +11 -13
  146. data/lib/capybara/spec/session/check_spec.rb +112 -51
  147. data/lib/capybara/spec/session/choose_spec.rb +62 -30
  148. data/lib/capybara/spec/session/click_button_spec.rb +227 -161
  149. data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -30
  150. data/lib/capybara/spec/session/click_link_spec.rb +89 -55
  151. data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
  152. data/lib/capybara/spec/session/current_url_spec.rb +44 -37
  153. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
  154. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -2
  155. data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +11 -9
  156. data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
  157. data/lib/capybara/spec/session/element/match_xpath_spec.rb +8 -6
  158. data/lib/capybara/spec/session/element/matches_selector_spec.rb +70 -56
  159. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +7 -7
  160. data/lib/capybara/spec/session/evaluate_script_spec.rb +28 -8
  161. data/lib/capybara/spec/session/execute_script_spec.rb +8 -7
  162. data/lib/capybara/spec/session/fill_in_spec.rb +110 -44
  163. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  164. data/lib/capybara/spec/session/find_by_id_spec.rb +8 -8
  165. data/lib/capybara/spec/session/find_field_spec.rb +33 -31
  166. data/lib/capybara/spec/session/find_link_spec.rb +42 -14
  167. data/lib/capybara/spec/session/find_spec.rb +251 -142
  168. data/lib/capybara/spec/session/first_spec.rb +45 -44
  169. data/lib/capybara/spec/session/frame/frame_title_spec.rb +6 -6
  170. data/lib/capybara/spec/session/frame/frame_url_spec.rb +6 -6
  171. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +32 -20
  172. data/lib/capybara/spec/session/frame/within_frame_spec.rb +46 -19
  173. data/lib/capybara/spec/session/go_back_spec.rb +1 -1
  174. data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
  175. data/lib/capybara/spec/session/has_all_selectors_spec.rb +23 -23
  176. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  177. data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
  178. data/lib/capybara/spec/session/has_button_spec.rb +98 -12
  179. data/lib/capybara/spec/session/has_css_spec.rb +271 -137
  180. data/lib/capybara/spec/session/has_current_path_spec.rb +50 -35
  181. data/lib/capybara/spec/session/has_element_spec.rb +47 -0
  182. data/lib/capybara/spec/session/has_field_spec.rb +137 -58
  183. data/lib/capybara/spec/session/has_link_spec.rb +46 -6
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +33 -31
  185. data/lib/capybara/spec/session/has_select_spec.rb +84 -50
  186. data/lib/capybara/spec/session/has_selector_spec.rb +117 -69
  187. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  188. data/lib/capybara/spec/session/has_table_spec.rb +181 -4
  189. data/lib/capybara/spec/session/has_text_spec.rb +101 -53
  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 +37 -0
  195. data/lib/capybara/spec/session/node_spec.rb +958 -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 +65 -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 +119 -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 +41 -22
  212. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  213. data/lib/capybara/spec/session/visit_spec.rb +79 -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 +11 -8
  221. data/lib/capybara/spec/session/window/within_window_spec.rb +17 -16
  222. data/lib/capybara/spec/session/within_spec.rb +82 -44
  223. data/lib/capybara/spec/spec_helper.rb +46 -52
  224. data/lib/capybara/spec/test_app.rb +148 -41
  225. data/lib/capybara/spec/views/animated.erb +49 -0
  226. data/lib/capybara/spec/views/form.erb +156 -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 +46 -11
  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.erb +2 -2
  255. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  256. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  257. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  258. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  259. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  260. data/lib/capybara/spec/views/with_windows.erb +1 -1
  261. data/lib/capybara/spec/views/within_frames.erb +1 -1
  262. data/lib/capybara/version.rb +1 -1
  263. data/lib/capybara/window.rb +32 -26
  264. data/lib/capybara.rb +128 -104
  265. data/spec/basic_node_spec.rb +59 -34
  266. data/spec/capybara_spec.rb +65 -51
  267. data/spec/counter_spec.rb +35 -0
  268. data/spec/css_builder_spec.rb +101 -0
  269. data/spec/css_splitter_spec.rb +38 -0
  270. data/spec/dsl_spec.rb +84 -55
  271. data/spec/filter_set_spec.rb +24 -7
  272. data/spec/fixtures/certificate.pem +25 -0
  273. data/spec/fixtures/key.pem +27 -0
  274. data/spec/fixtures/selenium_driver_rspec_failure.rb +5 -5
  275. data/spec/fixtures/selenium_driver_rspec_success.rb +5 -5
  276. data/spec/minitest_spec.rb +49 -5
  277. data/spec/minitest_spec_spec.rb +92 -62
  278. data/spec/per_session_config_spec.rb +6 -6
  279. data/spec/rack_test_spec.rb +183 -115
  280. data/spec/regexp_dissassembler_spec.rb +250 -0
  281. data/spec/result_spec.rb +99 -39
  282. data/spec/rspec/features_spec.rb +28 -25
  283. data/spec/rspec/scenarios_spec.rb +10 -6
  284. data/spec/rspec/shared_spec_matchers.rb +418 -364
  285. data/spec/rspec/views_spec.rb +4 -3
  286. data/spec/rspec_matchers_spec.rb +35 -10
  287. data/spec/rspec_spec.rb +109 -85
  288. data/spec/sauce_spec_chrome.rb +43 -0
  289. data/spec/selector_spec.rb +392 -62
  290. data/spec/selenium_spec_chrome.rb +183 -41
  291. data/spec/selenium_spec_chrome_remote.rb +96 -0
  292. data/spec/selenium_spec_edge.rb +41 -8
  293. data/spec/selenium_spec_firefox.rb +228 -0
  294. data/spec/selenium_spec_firefox_remote.rb +94 -0
  295. data/spec/selenium_spec_ie.rb +129 -11
  296. data/spec/selenium_spec_safari.rb +162 -0
  297. data/spec/server_spec.rb +192 -81
  298. data/spec/session_spec.rb +52 -16
  299. data/spec/shared_selenium_node.rb +79 -0
  300. data/spec/shared_selenium_session.rb +460 -123
  301. data/spec/spec_helper.rb +124 -2
  302. data/spec/whitespace_normalizer_spec.rb +54 -0
  303. data/spec/xpath_builder_spec.rb +93 -0
  304. metadata +344 -45
  305. data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
  306. data/.yard/templates_custom/default/class/html/setup.rb +0 -17
  307. data/.yard/yard_extensions.rb +0 -78
  308. data/lib/capybara/rspec/compound.rb +0 -90
  309. data/lib/capybara/spec/session/assert_selector.rb +0 -149
  310. data/lib/capybara/spec/session/source_spec.rb +0 -0
  311. data/lib/capybara/spec/views/with_title.erb +0 -5
  312. data/spec/selenium_spec_marionette.rb +0 -143
@@ -5,516 +5,565 @@ require 'capybara/dsl'
5
5
  require 'capybara/rspec/matchers'
6
6
  require 'benchmark'
7
7
 
8
+ # rubocop:disable RSpec/ExpectActual
9
+
8
10
  RSpec.shared_examples Capybara::RSpecMatchers do |session, _mode|
9
11
  include Capybara::DSL
10
12
  include Capybara::RSpecMatchers
11
13
 
12
- describe "have_css matcher" do
13
- it "gives proper description" do
14
- expect(have_css('h1').description).to eq("have visible css \"h1\"")
14
+ describe 'have_css matcher' do
15
+ it 'gives proper description' do
16
+ expect(have_css('h1').description).to eq('have visible css "h1"')
15
17
  end
16
18
 
17
- context "on a string" do
18
- context "with should" do
19
- it "passes if has_css? returns true" do
20
- expect("<h1>Text</h1>").to have_css('h1')
19
+ context 'on a string' do
20
+ context 'with should' do
21
+ it 'passes if has_css? returns true' do
22
+ expect('<h1>Text</h1>').to have_css('h1')
21
23
  end
22
24
 
23
- it "fails if has_css? returns false" do
25
+ it 'fails if has_css? returns false' do
24
26
  expect do
25
- expect("<h1>Text</h1>").to have_css('h2')
26
- end.to raise_error(/expected to find visible css "h2" but there were no matches/)
27
+ expect('<h1>Text</h1>').to have_css('h2')
28
+ end.to raise_error(/expected to find css "h2" but there were no matches/)
27
29
  end
28
30
 
29
- it "passes if matched node count equals expected count" do
30
- expect("<h1>Text</h1>").to have_css('h1', count: 1)
31
+ it 'passes if matched node count equals expected count' do
32
+ expect('<h1>Text</h1>').to have_css('h1', count: 1)
31
33
  end
32
34
 
33
- it "fails if matched node count does not equal expected count" do
35
+ it 'fails if matched node count does not equal expected count' do
34
36
  expect do
35
- expect("<h1>Text</h1>").to have_css('h1', count: 2)
36
- end.to raise_error("expected to find visible css \"h1\" 2 times, found 1 match: \"Text\"")
37
+ expect('<h1>Text</h1>').to have_css('h1', count: 2)
38
+ end.to raise_error('expected to find visible css "h1" 2 times, found 1 match: "Text"')
37
39
  end
38
40
 
39
- it "fails if matched node count is less than expected minimum count" do
41
+ it 'fails if matched node count is less than expected minimum count' do
40
42
  expect do
41
- expect("<h1>Text</h1>").to have_css('p', minimum: 1)
42
- end.to raise_error("expected to find visible css \"p\" at least 1 time but there were no matches")
43
+ expect('<h1>Text</h1>').to have_css('p', minimum: 1)
44
+ end.to raise_error('expected to find css "p" at least 1 time but there were no matches')
43
45
  end
44
46
 
45
- it "fails if matched node count is more than expected maximum count" do
47
+ it 'fails if matched node count is more than expected maximum count' do
46
48
  expect do
47
- expect("<h1>Text</h1><h1>Text</h1><h1>Text</h1>").to have_css('h1', maximum: 2)
49
+ expect('<h1>Text</h1><h1>Text</h1><h1>Text</h1>').to have_css('h1', maximum: 2)
48
50
  end.to raise_error('expected to find visible css "h1" at most 2 times, found 3 matches: "Text", "Text", "Text"')
49
51
  end
50
52
 
51
- it "fails if matched node count does not belong to expected range" do
53
+ it 'fails if matched node count does not belong to expected range' do
52
54
  expect do
53
- expect("<h1>Text</h1>").to have_css('h1', between: 2..3)
54
- end.to raise_error("expected to find visible css \"h1\" between 2 and 3 times, found 1 match: \"Text\"")
55
+ expect('<h1>Text</h1>').to have_css('h1', between: 2..3)
56
+ end.to raise_error('expected to find visible css "h1" between 2 and 3 times, found 1 match: "Text"')
55
57
  end
56
58
  end
57
59
 
58
- context "with should_not" do
59
- it "passes if has_no_css? returns true" do
60
- expect("<h1>Text</h1>").not_to have_css('h2')
60
+ context 'with should_not' do
61
+ it 'passes if has_no_css? returns true' do
62
+ expect('<h1>Text</h1>').not_to have_css('h2')
61
63
  end
62
64
 
63
- it "fails if has_no_css? returns false" do
65
+ it 'fails if has_no_css? returns false' do
64
66
  expect do
65
- expect("<h1>Text</h1>").not_to have_css('h1')
67
+ expect('<h1>Text</h1>').not_to have_css('h1')
66
68
  end.to raise_error(/expected not to find visible css "h1"/)
67
69
  end
68
70
 
69
- it "passes if matched node count does not equal expected count" do
70
- expect("<h1>Text</h1>").not_to have_css('h1', count: 2)
71
+ it 'passes if matched node count does not equal expected count' do
72
+ expect('<h1>Text</h1>').not_to have_css('h1', count: 2)
71
73
  end
72
74
 
73
- it "fails if matched node count equals expected count" do
75
+ it 'fails if matched node count equals expected count' do
74
76
  expect do
75
- expect("<h1>Text</h1>").not_to have_css('h1', count: 1)
77
+ expect('<h1>Text</h1>').not_to have_css('h1', count: 1)
76
78
  end.to raise_error(/expected not to find visible css "h1"/)
77
79
  end
78
80
  end
79
81
 
80
- it "supports compounding" do
81
- expect("<h1>Text</h1><h2>Text</h2>").to have_css('h1').and have_css('h2')
82
- expect("<h1>Text</h1><h2>Text</h2>").to have_css('h3').or have_css('h1')
82
+ it 'supports compounding' do
83
+ expect('<h1>Text</h1><h2>Text</h2>').to have_css('h1').and have_css('h2')
84
+ expect('<h1>Text</h1><h2>Text</h2>').to have_css('h3').or have_css('h1')
85
+ expect('<h1>Text</h1><h2>Text</h2>').to have_no_css('h4').and have_css('h2')
86
+ expect('<h1>Text</h1><h2>Text</h2>').to have_no_css('h2').or have_css('h1')
83
87
  end
84
88
  end
85
89
 
86
- context "on a page or node" do
90
+ context 'on a page or node' do
87
91
  before do
88
- visit('/with_html')
92
+ session.visit('/with_html')
89
93
  end
90
94
 
91
- context "with should" do
92
- it "passes if has_css? returns true" do
93
- expect(page).to have_css('h1')
95
+ context 'with should' do
96
+ it 'passes if has_css? returns true' do
97
+ expect(session).to have_css('h1')
94
98
  end
95
99
 
96
- it "fails if has_css? returns false" do
100
+ it 'fails if has_css? returns false' do
97
101
  expect do
98
- expect(page).to have_css('h1#doesnotexist')
99
- end.to raise_error(/expected to find visible css "h1#doesnotexist" but there were no matches/)
102
+ expect(session).to have_css('h1#doesnotexist')
103
+ end.to raise_error(/expected to find css "h1#doesnotexist" but there were no matches/)
100
104
  end
101
105
  end
102
106
 
103
- context "with should_not" do
104
- it "passes if has_no_css? returns true" do
105
- expect(page).not_to have_css('h1#doesnotexist')
107
+ context 'with should_not' do
108
+ it 'passes if has_no_css? returns true' do
109
+ expect(session).not_to have_css('h1#doesnotexist')
106
110
  end
107
111
 
108
- it "fails if has_no_css? returns false" do
112
+ it 'fails if has_no_css? returns false' do
109
113
  expect do
110
- expect(page).not_to have_css('h1')
114
+ expect(session).not_to have_css('h1')
111
115
  end.to raise_error(/expected not to find visible css "h1"/)
112
116
  end
113
117
  end
114
118
  end
115
119
  end
116
120
 
117
- describe "have_xpath matcher" do
118
- it "gives proper description" do
119
- expect(have_xpath('//h1').description).to eq("have visible xpath \"\/\/h1\"")
121
+ describe 'have_xpath matcher' do
122
+ it 'gives proper description' do
123
+ expect(have_xpath('//h1').description).to eq('have visible xpath "//h1"')
120
124
  end
121
125
 
122
- context "on a string" do
123
- context "with should" do
124
- it "passes if has_xpath? returns true" do
125
- expect("<h1>Text</h1>").to have_xpath('//h1')
126
+ context 'on a string' do
127
+ context 'with should' do
128
+ it 'passes if has_xpath? returns true' do
129
+ expect('<h1>Text</h1>').to have_xpath('//h1')
126
130
  end
127
131
 
128
- it "fails if has_xpath? returns false" do
132
+ it 'fails if has_xpath? returns false' do
129
133
  expect do
130
- expect("<h1>Text</h1>").to have_xpath('//h2')
131
- end.to raise_error(%r{expected to find visible xpath "//h2" but there were no matches})
134
+ expect('<h1>Text</h1>').to have_xpath('//h2')
135
+ end.to raise_error(%r{expected to find xpath "//h2" but there were no matches})
132
136
  end
133
137
  end
134
138
 
135
- context "with should_not" do
136
- it "passes if has_no_xpath? returns true" do
137
- expect("<h1>Text</h1>").not_to have_xpath('//h2')
139
+ context 'with should_not' do
140
+ it 'passes if has_no_xpath? returns true' do
141
+ expect('<h1>Text</h1>').not_to have_xpath('//h2')
138
142
  end
139
143
 
140
- it "fails if has_no_xpath? returns false" do
144
+ it 'fails if has_no_xpath? returns false' do
141
145
  expect do
142
- expect("<h1>Text</h1>").not_to have_xpath('//h1')
146
+ expect('<h1>Text</h1>').not_to have_xpath('//h1')
143
147
  end.to raise_error(%r{expected not to find visible xpath "//h1"})
144
148
  end
145
149
  end
146
150
 
147
- it "supports compounding" do
148
- expect("<h1>Text</h1><h2>Text</h2>").to have_xpath('//h1').and have_xpath('//h2')
149
- expect("<h1>Text</h1><h2>Text</h2>").to have_xpath('//h3').or have_xpath('//h1')
151
+ it 'supports compounding' do
152
+ expect('<h1>Text</h1><h2>Text</h2>').to have_xpath('//h1').and have_xpath('//h2')
153
+ expect('<h1>Text</h1><h2>Text</h2>').to have_xpath('//h3').or have_xpath('//h1')
154
+ expect('<h1>Text</h1><h2>Text</h2>').to have_no_xpath('//h4').and have_xpath('//h1')
155
+ expect('<h1>Text</h1><h2>Text</h2>').to have_no_xpath('//h4').or have_xpath('//h4')
150
156
  end
151
157
  end
152
158
 
153
- context "on a page or node" do
159
+ context 'on a page or node' do
154
160
  before do
155
- visit('/with_html')
161
+ session.visit('/with_html')
156
162
  end
157
163
 
158
- context "with should" do
159
- it "passes if has_xpath? returns true" do
160
- expect(page).to have_xpath('//h1')
164
+ context 'with should' do
165
+ it 'passes if has_xpath? returns true' do
166
+ expect(session).to have_xpath('//h1')
161
167
  end
162
168
 
163
- it "fails if has_xpath? returns false" do
169
+ it 'fails if has_xpath? returns false' do
164
170
  expect do
165
- expect(page).to have_xpath("//h1[@id='doesnotexist']")
166
- end.to raise_error(%r{expected to find visible xpath "//h1\[@id='doesnotexist'\]" but there were no matches})
171
+ expect(session).to have_xpath("//h1[@id='doesnotexist']")
172
+ end.to raise_error(%r{expected to find xpath "//h1\[@id='doesnotexist'\]" but there were no matches})
167
173
  end
168
174
  end
169
175
 
170
- context "with should_not" do
171
- it "passes if has_no_xpath? returns true" do
172
- expect(page).not_to have_xpath('//h1[@id="doesnotexist"]')
176
+ context 'with should_not' do
177
+ it 'passes if has_no_xpath? returns true' do
178
+ expect(session).not_to have_xpath('//h1[@id="doesnotexist"]')
173
179
  end
174
180
 
175
- it "fails if has_no_xpath? returns false" do
181
+ it 'fails if has_no_xpath? returns false' do
176
182
  expect do
177
- expect(page).not_to have_xpath('//h1')
183
+ expect(session).not_to have_xpath('//h1')
178
184
  end.to raise_error(%r{expected not to find visible xpath "//h1"})
179
185
  end
180
186
  end
181
187
  end
182
188
  end
183
189
 
184
- describe "have_selector matcher" do
185
- it "gives proper description" do
190
+ describe 'have_selector matcher' do
191
+ it 'gives proper description' do
186
192
  matcher = have_selector('//h1')
187
- expect("<h1>Text</h1>").to matcher
188
- expect(matcher.description).to eq("have visible xpath \"//h1\"")
193
+ expect('<h1>Text</h1>').to matcher
194
+ expect(matcher.description).to eq('have visible xpath "//h1"')
189
195
  end
190
196
 
191
- context "on a string" do
192
- context "with should" do
193
- it "passes if has_selector? returns true" do
194
- expect("<h1>Text</h1>").to have_selector('//h1')
197
+ context 'on a string' do
198
+ context 'with should' do
199
+ it 'passes if has_selector? returns true' do
200
+ expect('<h1>Text</h1>').to have_selector('//h1')
195
201
  end
196
202
 
197
- it "fails if has_selector? returns false" do
203
+ it 'fails if has_selector? returns false' do
198
204
  expect do
199
- expect("<h1>Text</h1>").to have_selector('//h2')
200
- end.to raise_error(%r{expected to find visible xpath "//h2" but there were no matches})
205
+ expect('<h1>Text</h1>').to have_selector('//h2')
206
+ end.to raise_error(%r{expected to find xpath "//h2" but there were no matches})
201
207
  end
202
208
  end
203
209
 
204
- context "with should_not" do
205
- it "passes if has_no_selector? returns true" do
206
- expect("<h1>Text</h1>").not_to have_selector(:css, 'h2')
210
+ context 'with should_not' do
211
+ it 'passes if has_no_selector? returns true' do
212
+ expect('<h1>Text</h1>').not_to have_selector(:css, 'h2')
207
213
  end
208
214
 
209
- it "fails if has_no_selector? returns false" do
215
+ it 'fails if has_no_selector? returns false' do
210
216
  expect do
211
- expect("<h1>Text</h1>").not_to have_selector(:css, 'h1')
212
- end.to raise_error(%r{expected not to find visible css "h1"})
217
+ expect('<h1>Text</h1>').not_to have_selector(:css, 'h1')
218
+ end.to raise_error(/expected not to find visible css "h1"/)
213
219
  end
214
220
  end
215
221
  end
216
222
 
217
- context "on a page or node" do
223
+ context 'on a page or node' do
218
224
  before do
219
- visit('/with_html')
225
+ session.visit('/with_html')
220
226
  end
221
227
 
222
- context "with should" do
223
- it "passes if has_selector? returns true" do
224
- expect(page).to have_selector('//h1', text: 'test')
228
+ context 'with should' do
229
+ it 'passes if has_selector? returns true' do
230
+ expect(session).to have_selector('//h1', text: 'test')
225
231
  end
226
232
 
227
- it "fails if has_selector? returns false" do
233
+ it 'fails if has_selector? returns false' do
228
234
  expect do
229
- expect(page).to have_selector("//h1[@id='doesnotexist']")
230
- end.to raise_error(%r{expected to find visible xpath "//h1\[@id='doesnotexist'\]" but there were no matches})
235
+ expect(session).to have_selector("//h1[@id='doesnotexist']")
236
+ end.to raise_error(%r{expected to find xpath "//h1\[@id='doesnotexist'\]" but there were no matches})
231
237
  end
232
238
 
233
- it "includes text in error message" do
239
+ it 'includes text in error message' do
234
240
  expect do
235
- expect(page).to have_selector("//h1", text: 'wrong text')
241
+ expect(session).to have_selector('//h1', text: 'wrong text')
236
242
  end.to raise_error(%r{expected to find visible xpath "//h1" with text "wrong text" but there were no matches})
237
243
  end
238
244
  end
239
245
 
240
- context "with should_not" do
241
- it "passes if has_no_css? returns true" do
242
- expect(page).not_to have_selector(:css, 'h1#doesnotexist')
246
+ context 'with should_not' do
247
+ it 'passes if has_no_css? returns true' do
248
+ expect(session).not_to have_selector(:css, 'h1#doesnotexist')
243
249
  end
244
250
 
245
- it "fails if has_no_selector? returns false" do
251
+ it 'fails if has_no_selector? returns false' do
246
252
  expect do
247
- expect(page).not_to have_selector(:css, 'h1', text: 'test')
248
- end.to raise_error(%r{expected not to find visible css "h1" with text "test"})
253
+ expect(session).not_to have_selector(:css, 'h1', text: 'test')
254
+ end.to raise_error(/expected not to find visible css "h1" with text "test"/)
249
255
  end
250
256
  end
251
257
  end
252
258
 
253
- it "supports compounding" do
254
- expect("<h1>Text</h1><h2>Text</h2>").to have_selector('//h1').and have_selector('//h2')
255
- expect("<h1>Text</h1><h2>Text</h2>").to have_selector('//h3').or have_selector('//h1')
259
+ it 'supports compounding' do
260
+ expect('<h1>Text</h1><h2>Text</h2>').to have_selector('//h1').and have_selector('//h2')
261
+ expect('<h1>Text</h1><h2>Text</h2>').to have_selector('//h3').or have_selector('//h1')
262
+ expect('<h1>Text</h1><h2>Text</h2>').to have_no_selector('//h3').and have_selector('//h1')
256
263
  end
257
264
  end
258
265
 
259
- describe "have_content matcher" do
260
- it "gives proper description" do
261
- expect(have_content('Text').description).to eq("text \"Text\"")
266
+ describe 'have_content matcher' do
267
+ it 'gives proper description' do
268
+ expect(have_content('Text').description).to eq('have text "Text"')
262
269
  end
263
270
 
264
- context "on a string" do
265
- context "with should" do
266
- it "passes if has_content? returns true" do
267
- expect("<h1>Text</h1>").to have_content('Text')
271
+ context 'on a string' do
272
+ context 'with should' do
273
+ it 'passes if has_content? returns true' do
274
+ expect('<h1>Text</h1>').to have_content('Text')
268
275
  end
269
276
 
270
- it "passes if has_content? returns true using regexp" do
271
- expect("<h1>Text</h1>").to have_content(/ext/)
277
+ it 'passes if has_content? returns true using regexp' do
278
+ expect('<h1>Text</h1>').to have_content(/ext/)
272
279
  end
273
280
 
274
- it "fails if has_content? returns false" do
281
+ it 'fails if has_content? returns false' do
275
282
  expect do
276
- expect("<h1>Text</h1>").to have_content('No such Text')
283
+ expect('<h1>Text</h1>').to have_content('No such Text')
277
284
  end.to raise_error(/expected to find text "No such Text" in "Text"/)
278
285
  end
279
286
  end
280
287
 
281
- context "with should_not" do
282
- it "passes if has_no_content? returns true" do
283
- expect("<h1>Text</h1>").not_to have_content('No such Text')
288
+ context 'with should_not' do
289
+ it 'passes if has_no_content? returns true' do
290
+ expect('<h1>Text</h1>').not_to have_content('No such Text')
284
291
  end
285
292
 
286
- it "passes because escapes any characters that would have special meaning in a regexp" do
287
- expect("<h1>Text</h1>").not_to have_content('.')
293
+ it 'passes because escapes any characters that would have special meaning in a regexp' do
294
+ expect('<h1>Text</h1>').not_to have_content('.')
288
295
  end
289
296
 
290
- it "fails if has_no_content? returns false" do
297
+ it 'fails if has_no_content? returns false' do
291
298
  expect do
292
- expect("<h1>Text</h1>").not_to have_content('Text')
299
+ expect('<h1>Text</h1>').not_to have_content('Text')
293
300
  end.to raise_error(/expected not to find text "Text" in "Text"/)
294
301
  end
295
302
  end
296
303
  end
297
304
 
298
- context "on a page or node" do
305
+ context 'on a page or node' do
299
306
  before do
300
- visit('/with_html')
307
+ session.visit('/with_html')
301
308
  end
302
309
 
303
- context "with should" do
304
- it "passes if has_content? returns true" do
305
- expect(page).to have_content('This is a test')
310
+ context 'with should' do
311
+ it 'passes if has_content? returns true' do
312
+ expect(session).to have_content('This is a test')
306
313
  end
307
314
 
308
- it "passes if has_content? returns true using regexp" do
309
- expect(page).to have_content(/test/)
315
+ it 'passes if has_content? returns true using regexp' do
316
+ expect(session).to have_content(/test/)
310
317
  end
311
318
 
312
- it "fails if has_content? returns false" do
319
+ it 'fails if has_content? returns false' do
313
320
  expect do
314
- expect(page).to have_content('No such Text')
321
+ expect(session).to have_content('No such Text')
315
322
  end.to raise_error(/expected to find text "No such Text" in "(.*)This is a test(.*)"/)
316
323
  end
317
324
 
318
- context "with default selector CSS" do
325
+ context 'with default selector CSS' do
319
326
  before { Capybara.default_selector = :css }
320
- it "fails if has_content? returns false" do
327
+
328
+ after { Capybara.default_selector = :xpath }
329
+
330
+ it 'fails if has_content? returns false' do
321
331
  expect do
322
- expect(page).to have_content('No such Text')
332
+ expect(session).to have_content('No such Text')
323
333
  end.to raise_error(/expected to find text "No such Text" in "(.*)This is a test(.*)"/)
324
334
  end
325
- after { Capybara.default_selector = :xpath }
326
335
  end
327
336
  end
328
337
 
329
- context "with should_not" do
330
- it "passes if has_no_content? returns true" do
331
- expect(page).not_to have_content('No such Text')
338
+ context 'with should_not' do
339
+ it 'passes if has_no_content? returns true' do
340
+ expect(session).not_to have_content('No such Text')
332
341
  end
333
342
 
334
- it "fails if has_no_content? returns false" do
343
+ it 'fails if has_no_content? returns false' do
335
344
  expect do
336
- expect(page).not_to have_content('This is a test')
345
+ expect(session).not_to have_content('This is a test')
337
346
  end.to raise_error(/expected not to find text "This is a test"/)
338
347
  end
348
+
349
+ it 'not_to have_content behaves the same as to have_no_content' do
350
+ Capybara.using_wait_time(5) do
351
+ expect(session).to have_content('This is a test')
352
+ start = Time.now
353
+ expect(session).to have_no_content('No such Text')
354
+ to_time = Time.now
355
+ expect(session).not_to have_content('No such Text')
356
+ not_to_time = Time.now
357
+ expect(not_to_time - to_time).to be_within(0.5).of(to_time - start)
358
+ end
359
+ end
339
360
  end
340
361
  end
341
362
 
342
- it "supports compounding" do
343
- expect("<h1>Text</h1><h2>And</h2>").to have_content('Text').and have_content('And')
344
- expect("<h1>Text</h1><h2>Or</h2>").to have_content('XYZ').or have_content('Or')
363
+ it 'supports compounding' do
364
+ expect('<h1>Text</h1><h2>And</h2>').to have_content('Text').and have_content('And')
365
+ expect('<h1>Text</h1><h2>Or</h2>').to have_content('XYZ').or have_content('Or')
366
+ expect('<h1>Text</h1><h2>Or</h2>').to have_no_content('XYZ').and have_content('Or')
345
367
  end
346
368
  end
347
369
 
348
- describe "have_text matcher" do
349
- it "gives proper description" do
350
- expect(have_text('Text').description).to eq("text \"Text\"")
370
+ describe 'have_text matcher' do
371
+ it 'gives proper description' do
372
+ expect(have_text('Text').description).to eq('have text "Text"')
351
373
  end
352
374
 
353
- context "on a string" do
354
- context "with should" do
355
- it "passes if text contains given string" do
356
- expect("<h1>Text</h1>").to have_text('Text')
375
+ context 'on a string' do
376
+ context 'with should' do
377
+ it 'passes if text contains given string' do
378
+ expect('<h1>Text</h1>').to have_text('Text')
357
379
  end
358
380
 
359
- it "passes if text matches given regexp" do
360
- expect("<h1>Text</h1>").to have_text(/ext/)
381
+ it 'passes if text matches given regexp' do
382
+ expect('<h1>Text</h1>').to have_text(/ext/)
361
383
  end
362
384
 
363
385
  it "fails if text doesn't contain given string" do
364
386
  expect do
365
- expect("<h1>Text</h1>").to have_text('No such Text')
387
+ expect('<h1>Text</h1>').to have_text('No such Text')
366
388
  end.to raise_error(/expected to find text "No such Text" in "Text"/)
367
389
  end
368
390
 
369
391
  it "fails if text doesn't match given regexp" do
370
392
  expect do
371
- expect("<h1>Text</h1>").to have_text(/No such Text/)
393
+ expect('<h1>Text</h1>').to have_text(/No such Text/)
372
394
  end.to raise_error('expected to find text matching /No such Text/ in "Text"')
373
395
  end
374
396
 
375
- it "casts Integer to string" do
397
+ it 'casts Integer to string' do
376
398
  expect do
377
- expect("<h1>Text</h1>").to have_text(3)
399
+ expect('<h1>Text</h1>').to have_text(3)
378
400
  end.to raise_error(/expected to find text "3" in "Text"/)
379
401
  end
380
402
 
381
- it "fails if matched text count does not equal to expected count" do
403
+ it 'fails if matched text count does not equal to expected count' do
382
404
  expect do
383
- expect("<h1>Text</h1>").to have_text('Text', count: 2)
405
+ expect('<h1>Text</h1>').to have_text('Text', count: 2)
384
406
  end.to raise_error('expected to find text "Text" 2 times but found 1 time in "Text"')
385
407
  end
386
408
 
387
- it "fails if matched text count is less than expected minimum count" do
409
+ it 'fails if matched text count is less than expected minimum count' do
388
410
  expect do
389
- expect("<h1>Text</h1>").to have_text('Lorem', minimum: 1)
411
+ expect('<h1>Text</h1>').to have_text('Lorem', minimum: 1)
390
412
  end.to raise_error('expected to find text "Lorem" at least 1 time but found 0 times in "Text"')
391
413
  end
392
414
 
393
- it "fails if matched text count is more than expected maximum count" do
415
+ it 'fails if matched text count is more than expected maximum count' do
394
416
  expect do
395
- expect("<h1>Text TextText</h1>").to have_text('Text', maximum: 2)
417
+ expect('<h1>Text TextText</h1>').to have_text('Text', maximum: 2)
396
418
  end.to raise_error('expected to find text "Text" at most 2 times but found 3 times in "Text TextText"')
397
419
  end
398
420
 
399
- it "fails if matched text count does not belong to expected range" do
421
+ it 'fails if matched text count does not belong to expected range' do
400
422
  expect do
401
- expect("<h1>Text</h1>").to have_text('Text', between: 2..3)
423
+ expect('<h1>Text</h1>').to have_text('Text', between: 2..3)
402
424
  end.to raise_error('expected to find text "Text" between 2 and 3 times but found 1 time in "Text"')
403
425
  end
404
426
  end
405
427
 
406
- context "with should_not" do
428
+ context 'with should_not' do
407
429
  it "passes if text doesn't contain a string" do
408
- expect("<h1>Text</h1>").not_to have_text('No such Text')
430
+ expect('<h1>Text</h1>').not_to have_text('No such Text')
409
431
  end
410
432
 
411
- it "passes because escapes any characters that would have special meaning in a regexp" do
412
- expect("<h1>Text</h1>").not_to have_text('.')
433
+ it 'passes because escapes any characters that would have special meaning in a regexp' do
434
+ expect('<h1>Text</h1>').not_to have_text('.')
413
435
  end
414
436
 
415
- it "fails if text contains a string" do
437
+ it 'fails if text contains a string' do
416
438
  expect do
417
- expect("<h1>Text</h1>").not_to have_text('Text')
439
+ expect('<h1>Text</h1>').not_to have_text('Text')
418
440
  end.to raise_error(/expected not to find text "Text" in "Text"/)
419
441
  end
420
442
  end
421
443
  end
422
444
 
423
- context "on a page or node" do
445
+ context 'on a page or node' do
424
446
  before do
425
- visit('/with_html')
447
+ session.visit('/with_html')
426
448
  end
427
449
 
428
- context "with should" do
429
- it "passes if has_text? returns true" do
430
- expect(page).to have_text('This is a test')
450
+ context 'with should' do
451
+ it 'passes if has_text? returns true' do
452
+ expect(session).to have_text('This is a test')
431
453
  end
432
454
 
433
- it "passes if has_text? returns true using regexp" do
434
- expect(page).to have_text(/test/)
455
+ it 'passes if has_text? returns true using regexp' do
456
+ expect(session).to have_text(/test/)
435
457
  end
436
458
 
437
- it "can check for all text" do
438
- expect(page).to have_text(:all, 'Some of this text is hidden!')
459
+ it 'can check for all text' do
460
+ expect(session).to have_text(:all, 'Some of this text is hidden!')
439
461
  end
440
462
 
441
- it "can check for visible text" do
442
- expect(page).to have_text(:visible, 'Some of this text is')
443
- expect(page).not_to have_text(:visible, 'Some of this text is hidden!')
463
+ it 'can check for visible text' do
464
+ expect(session).to have_text(:visible, 'Some of this text is')
465
+ expect(session).not_to have_text(:visible, 'Some of this text is hidden!')
444
466
  end
445
467
 
446
- it "fails if has_text? returns false" do
468
+ it 'fails if has_text? returns false' do
447
469
  expect do
448
- expect(page).to have_text('No such Text')
470
+ expect(session).to have_text('No such Text')
449
471
  end.to raise_error(/expected to find text "No such Text" in "(.*)This is a test(.*)"/)
450
472
  end
451
473
 
452
- context "with default selector CSS" do
474
+ context 'with default selector CSS' do
453
475
  before { Capybara.default_selector = :css }
454
- it "fails if has_text? returns false" do
476
+
477
+ after { Capybara.default_selector = :xpath }
478
+
479
+ it 'fails if has_text? returns false' do
455
480
  expect do
456
- expect(page).to have_text('No such Text')
481
+ expect(session).to have_text('No such Text')
457
482
  end.to raise_error(/expected to find text "No such Text" in "(.*)This is a test(.*)"/)
458
483
  end
459
- after { Capybara.default_selector = :xpath }
460
484
  end
461
485
  end
462
486
 
463
- context "with should_not" do
464
- it "passes if has_no_text? returns true" do
465
- expect(page).not_to have_text('No such Text')
487
+ context 'with should_not' do
488
+ it 'passes if has_no_text? returns true' do
489
+ expect(session).not_to have_text('No such Text')
466
490
  end
467
491
 
468
- it "fails if has_no_text? returns false" do
492
+ it 'fails if has_no_text? returns false' do
469
493
  expect do
470
- expect(page).not_to have_text('This is a test')
494
+ expect(session).not_to have_text('This is a test')
471
495
  end.to raise_error(/expected not to find text "This is a test"/)
472
496
  end
473
497
  end
474
498
  end
475
499
 
476
- it "supports compounding" do
477
- expect("<h1>Text</h1><h2>And</h2>").to have_text('Text').and have_text('And')
478
- expect("<h1>Text</h1><h2>Or</h2>").to have_text('Not here').or have_text('Or')
500
+ it 'supports compounding' do
501
+ expect('<h1>Text</h1><h2>And</h2>').to have_text('Text').and have_text('And')
502
+ expect('<h1>Text</h1><h2>Or</h2>').to have_text('Not here').or have_text('Or')
503
+ end
504
+ end
505
+
506
+ describe 'have_element matcher' do
507
+ let(:html) { '<img src="/img.jpg" alt="a JPEG"><img src="/img.png" alt="a PNG">' }
508
+
509
+ it 'gives proper description' do
510
+ expect(have_element('img').description).to eq('have visible element "img"')
511
+ end
512
+
513
+ it 'passes if there is such a element' do
514
+ expect(html).to have_element('img', src: '/img.jpg')
515
+ end
516
+
517
+ it 'fails if there is no such element' do
518
+ expect do
519
+ expect(html).to have_element('photo')
520
+ end.to raise_error(/expected to find element "photo"/)
521
+ end
522
+
523
+ it 'supports compounding' do
524
+ expect(html).to have_element('img', alt: 'a JPEG').and have_element('img', src: '/img.png')
525
+ expect(html).to have_element('photo').or have_element('img', src: '/img.jpg')
526
+ expect(html).to have_no_element('photo').and have_element('img', alt: 'a PNG')
479
527
  end
480
528
  end
481
529
 
482
- describe "have_link matcher" do
530
+ describe 'have_link matcher' do
483
531
  let(:html) { '<a href="#">Just a link</a><a href="#">Another link</a>' }
484
532
 
485
- it "gives proper description" do
486
- expect(have_link('Just a link').description).to eq("have visible link \"Just a link\"")
533
+ it 'gives proper description' do
534
+ expect(have_link('Just a link').description).to eq('have visible link "Just a link"')
487
535
  end
488
536
 
489
- it "passes if there is such a button" do
537
+ it 'passes if there is such a link' do
490
538
  expect(html).to have_link('Just a link')
491
539
  end
492
540
 
493
- it "fails if there is no such button" do
541
+ it 'fails if there is no such link' do
494
542
  expect do
495
543
  expect(html).to have_link('No such Link')
496
- end.to raise_error(/expected to find visible link "No such Link"/)
544
+ end.to raise_error(/expected to find link "No such Link"/)
497
545
  end
498
546
 
499
- it "supports compounding" do
547
+ it 'supports compounding' do
500
548
  expect(html).to have_link('Just a link').and have_link('Another link')
501
549
  expect(html).to have_link('Not a link').or have_link('Another link')
550
+ expect(html).to have_no_link('Not a link').and have_link('Another link')
502
551
  end
503
552
  end
504
553
 
505
- describe "have_title matcher" do
506
- it "gives proper description" do
507
- expect(have_title('Just a title').description).to eq("have title \"Just a title\"")
554
+ describe 'have_title matcher' do
555
+ it 'gives proper description' do
556
+ expect(have_title('Just a title').description).to eq('have title "Just a title"')
508
557
  end
509
558
 
510
- context "on a string" do
559
+ context 'on a string' do
511
560
  let(:html) { '<title>Just a title</title>' }
512
561
 
513
- it "passes if there is such a title" do
562
+ it 'passes if there is such a title' do
514
563
  expect(html).to have_title('Just a title')
515
564
  end
516
565
 
517
- it "fails if there is no such title" do
566
+ it 'fails if there is no such title' do
518
567
  expect do
519
568
  expect(html).to have_title('No such title')
520
569
  end.to raise_error('expected "Just a title" to include "No such title"')
@@ -527,403 +576,408 @@ RSpec.shared_examples Capybara::RSpecMatchers do |session, _mode|
527
576
  end
528
577
  end
529
578
 
530
- context "on a page or node" do
531
- it "passes if there is such a title" do
532
- visit('/with_js')
533
- expect(page).to have_title('with_js')
579
+ context 'on a page or node' do
580
+ it 'passes if there is such a title' do
581
+ session.visit('/with_js')
582
+ expect(session).to have_title('with_js')
534
583
  end
535
584
 
536
- it "fails if there is no such title" do
537
- visit('/with_js')
585
+ it 'fails if there is no such title' do
586
+ session.visit('/with_js')
538
587
  expect do
539
- expect(page).to have_title('No such title')
540
- end.to raise_error('expected "with_js" to include "No such title"')
588
+ expect(session).to have_title('No such title')
589
+ end.to raise_error(/ to include "No such title"/)
541
590
  end
542
591
 
543
592
  context 'with wait' do
544
- before(:each) do
545
- @session = session
546
- @session.visit('/with_js')
593
+ before do
594
+ session.visit('/with_js')
547
595
  end
548
596
 
549
597
  it 'waits if wait time is more than timeout' do
550
- @session.click_link("Change title")
551
- using_wait_time 0 do
552
- expect(@session).to have_title('changed title', wait: 0.5)
598
+ session.click_link('Change title')
599
+ session.using_wait_time 0 do
600
+ expect(session).to have_title('changed title', wait: 2)
553
601
  end
554
602
  end
555
603
 
556
604
  it "doesn't wait if wait time is less than timeout" do
557
- @session.click_link("Change title")
558
- using_wait_time 3 do
559
- expect(@session).not_to have_title('changed title', wait: 0)
605
+ session.click_link('Change title')
606
+ session.using_wait_time 3 do
607
+ expect(session).not_to have_title('changed title', wait: 0)
560
608
  end
561
609
  end
562
610
  end
563
611
  end
564
612
 
565
- it "supports compounding" do
566
- expect("<title>I compound</title>").to have_title('I dont compound').or have_title('I compound')
613
+ it 'supports compounding' do
614
+ expect('<title>I compound</title>').to have_title('I dont compound').or have_title('I compound')
567
615
  end
568
616
  end
569
617
 
570
- describe "have_current_path matcher" do
571
- it "gives proper description" do
572
- expect(have_current_path('http://www.example.com').description).to eq("have current path \"http://www.example.com\"")
618
+ describe 'have_current_path matcher' do
619
+ it 'gives proper description' do
620
+ expect(have_current_path('http://www.example.com').description).to eq('have current path "http://www.example.com"')
573
621
  end
574
622
 
575
- context "on a page or node" do
576
- it "passes if there is such a current path" do
577
- visit('/with_js')
578
- expect(page).to have_current_path('/with_js')
623
+ context 'on a page or node' do
624
+ it 'passes if there is such a current path' do
625
+ session.visit('/with_js')
626
+ expect(session).to have_current_path('/with_js')
579
627
  end
580
628
 
581
- it "fails if there is no such current_path" do
629
+ it 'fails if there is no such current_path' do
582
630
  visit('/with_js')
583
631
  expect do
584
- expect(page).to have_current_path('/not_with_js')
585
- end.to raise_error('expected "/with_js" to equal "/not_with_js"')
632
+ expect(session).to have_current_path('/not_with_js')
633
+ end.to raise_error(%r{to equal "/not_with_js"})
586
634
  end
587
635
 
588
636
  context 'with wait' do
589
- before(:each) do
590
- @session = session
591
- @session.visit('/with_js')
637
+ before do
638
+ session.visit('/with_js')
592
639
  end
593
640
 
594
641
  it 'waits if wait time is more than timeout' do
595
- @session.click_link("Change page")
596
- using_wait_time 0 do
597
- expect(@session).to have_current_path('/with_html', wait: 1)
642
+ session.click_link('Change page')
643
+ session.using_wait_time 0 do
644
+ expect(session).to have_current_path('/with_html', wait: 2)
598
645
  end
599
646
  end
600
647
 
601
648
  it "doesn't wait if wait time is less than timeout" do
602
- @session.click_link("Change page")
603
- using_wait_time 0 do
604
- expect(@session).not_to have_current_path('/with_html')
649
+ session.click_link('Change page')
650
+ session.using_wait_time 0 do
651
+ expect(session).not_to have_current_path('/with_html')
605
652
  end
606
653
  end
607
654
  end
608
655
  end
609
656
 
610
- it "supports compounding" do
611
- visit('/with_html')
612
- expect(page).to have_current_path('/not_with_html').or have_current_path('/with_html')
657
+ it 'supports compounding' do
658
+ session.visit('/with_html')
659
+ expect(session).to have_current_path('/not_with_html').or have_current_path('/with_html')
613
660
  end
614
661
  end
615
662
 
616
- describe "have_button matcher" do
663
+ describe 'have_button matcher' do
617
664
  let(:html) { '<button>A button</button><input type="submit" value="Another button"/>' }
618
665
 
619
- it "gives proper description" do
620
- expect(have_button('A button').description).to eq("have visible button \"A button\"")
666
+ it 'gives proper description with no options' do
667
+ expect(have_button('A button').description).to eq('have visible button "A button" that is not disabled')
621
668
  end
622
669
 
623
- it "passes if there is such a button" do
670
+ it 'gives proper description with disabled :any option' do
671
+ expect(have_button('A button', disabled: :all).description).to eq('have visible button "A button"')
672
+ end
673
+
674
+ it 'passes if there is such a button' do
624
675
  expect(html).to have_button('A button')
625
676
  end
626
677
 
627
- it "fails if there is no such button" do
678
+ it 'fails if there is no such button' do
628
679
  expect do
629
680
  expect(html).to have_button('No such Button')
630
- end.to raise_error(/expected to find visible button "No such Button"/)
681
+ end.to raise_error(/expected to find button "No such Button"/)
631
682
  end
632
683
 
633
- it "supports compounding" do
684
+ it 'supports compounding' do
634
685
  expect(html).to have_button('Not this button').or have_button('A button')
635
686
  end
636
687
  end
637
688
 
638
- describe "have_field matcher" do
689
+ describe 'have_field matcher' do
639
690
  let(:html) { '<p><label>Text field<input type="text" value="some value"/></label></p>' }
640
691
 
641
- it "gives proper description" do
642
- expect(have_field('Text field').description).to eq("have visible field \"Text field\" that is not disabled")
692
+ it 'gives proper description' do
693
+ expect(have_field('Text field').description).to eq('have visible field "Text field" that is not disabled')
643
694
  end
644
695
 
645
- it "gives proper description for a given value" do
646
- expect(have_field('Text field', with: 'some value').description).to eq("have visible field \"Text field\" that is not disabled with value \"some value\"")
696
+ it 'gives proper description for a given value' do
697
+ expect(have_field('Text field', with: 'some value').description).to eq('have visible field "Text field" that is not disabled with value "some value"')
647
698
  end
648
699
 
649
- it "passes if there is such a field" do
700
+ it 'passes if there is such a field' do
650
701
  expect(html).to have_field('Text field')
651
702
  end
652
703
 
653
- it "passes if there is such a field with value" do
704
+ it 'passes if there is such a field with value' do
654
705
  expect(html).to have_field('Text field', with: 'some value')
655
706
  end
656
707
 
657
- it "fails if there is no such field" do
708
+ it 'fails if there is no such field' do
658
709
  expect do
659
710
  expect(html).to have_field('No such Field')
660
- end.to raise_error(/expected to find visible field "No such Field"/)
711
+ end.to raise_error(/expected to find field "No such Field"/)
661
712
  end
662
713
 
663
- it "fails if there is such field but with false value" do
714
+ it 'fails if there is such field but with false value' do
664
715
  expect do
665
716
  expect(html).to have_field('Text field', with: 'false value')
666
717
  end.to raise_error(/expected to find visible field "Text field"/)
667
718
  end
668
719
 
669
- it "treats a given value as a string" do
670
- class Foo
720
+ it 'treats a given value as a string' do
721
+ foo = Class.new do
671
722
  def to_s
672
- "some value"
723
+ 'some value'
673
724
  end
674
725
  end
675
- expect(html).to have_field('Text field', with: Foo.new)
726
+ expect(html).to have_field('Text field', with: foo.new)
676
727
  end
677
728
 
678
- it "supports compounding" do
729
+ it 'supports compounding' do
679
730
  expect(html).to have_field('Not this one').or have_field('Text field')
680
731
  end
681
732
  end
682
733
 
683
- describe "have_checked_field matcher" do
734
+ describe 'have_checked_field matcher' do
684
735
  let(:html) do
685
736
  '<label>it is checked<input type="checkbox" checked="checked"/></label>
686
737
  <label>unchecked field<input type="checkbox"/></label>'
687
738
  end
688
739
 
689
- it "gives proper description" do
690
- expect(have_checked_field('it is checked').description).to eq("have visible field \"it is checked\" that is checked and not disabled")
740
+ it 'gives proper description' do
741
+ expect(have_checked_field('it is checked').description).to eq('have visible field "it is checked" that is not disabled that is checked')
691
742
  end
692
743
 
693
- context "with should" do
694
- it "passes if there is such a field and it is checked" do
744
+ context 'with should' do
745
+ it 'passes if there is such a field and it is checked' do
695
746
  expect(html).to have_checked_field('it is checked')
696
747
  end
697
748
 
698
- it "fails if there is such a field but it is not checked" do
749
+ it 'fails if there is such a field but it is not checked' do
699
750
  expect do
700
751
  expect(html).to have_checked_field('unchecked field')
701
752
  end.to raise_error(/expected to find visible field "unchecked field"/)
702
753
  end
703
754
 
704
- it "fails if there is no such field" do
755
+ it 'fails if there is no such field' do
705
756
  expect do
706
757
  expect(html).to have_checked_field('no such field')
707
- end.to raise_error(/expected to find visible field "no such field"/)
758
+ end.to raise_error(/expected to find field "no such field"/)
708
759
  end
709
760
  end
710
761
 
711
- context "with should not" do
712
- it "fails if there is such a field and it is checked" do
762
+ context 'with should not' do
763
+ it 'fails if there is such a field and it is checked' do
713
764
  expect do
714
765
  expect(html).not_to have_checked_field('it is checked')
715
766
  end.to raise_error(/expected not to find visible field "it is checked"/)
716
767
  end
717
768
 
718
- it "passes if there is such a field but it is not checked" do
769
+ it 'passes if there is such a field but it is not checked' do
719
770
  expect(html).not_to have_checked_field('unchecked field')
720
771
  end
721
772
 
722
- it "passes if there is no such field" do
773
+ it 'passes if there is no such field' do
723
774
  expect(html).not_to have_checked_field('no such field')
724
775
  end
725
776
  end
726
777
 
727
- it "supports compounding" do
778
+ it 'supports compounding' do
728
779
  expect(html).to have_checked_field('not this one').or have_checked_field('it is checked')
729
780
  end
730
781
  end
731
782
 
732
- describe "have_unchecked_field matcher" do
783
+ describe 'have_unchecked_field matcher' do
733
784
  let(:html) do
734
785
  '<label>it is checked<input type="checkbox" checked="checked"/></label>
735
786
  <label>unchecked field<input type="checkbox"/></label>'
736
787
  end
737
788
 
738
- it "gives proper description" do
739
- expect(have_unchecked_field('unchecked field').description).to eq("have visible field \"unchecked field\" that is not checked and not disabled")
789
+ it 'gives proper description' do
790
+ expect(have_unchecked_field('unchecked field').description).to eq('have visible field "unchecked field" that is not disabled that is not checked')
740
791
  end
741
792
 
742
- context "with should" do
743
- it "passes if there is such a field and it is not checked" do
793
+ context 'with should' do
794
+ it 'passes if there is such a field and it is not checked' do
744
795
  expect(html).to have_unchecked_field('unchecked field')
745
796
  end
746
797
 
747
- it "fails if there is such a field but it is checked" do
798
+ it 'fails if there is such a field but it is checked' do
748
799
  expect do
749
800
  expect(html).to have_unchecked_field('it is checked')
750
801
  end.to raise_error(/expected to find visible field "it is checked"/)
751
802
  end
752
803
 
753
- it "fails if there is no such field" do
804
+ it 'fails if there is no such field' do
754
805
  expect do
755
806
  expect(html).to have_unchecked_field('no such field')
756
- end.to raise_error(/expected to find visible field "no such field"/)
807
+ end.to raise_error(/expected to find field "no such field"/)
757
808
  end
758
809
  end
759
810
 
760
- context "with should not" do
761
- it "fails if there is such a field and it is not checked" do
811
+ context 'with should not' do
812
+ it 'fails if there is such a field and it is not checked' do
762
813
  expect do
763
814
  expect(html).not_to have_unchecked_field('unchecked field')
764
815
  end.to raise_error(/expected not to find visible field "unchecked field"/)
765
816
  end
766
817
 
767
- it "passes if there is such a field but it is checked" do
818
+ it 'passes if there is such a field but it is checked' do
768
819
  expect(html).not_to have_unchecked_field('it is checked')
769
820
  end
770
821
 
771
- it "passes if there is no such field" do
822
+ it 'passes if there is no such field' do
772
823
  expect(html).not_to have_unchecked_field('no such field')
773
824
  end
774
825
  end
775
826
 
776
- it "supports compounding" do
827
+ it 'supports compounding' do
777
828
  expect(html).to have_unchecked_field('it is checked').or have_unchecked_field('unchecked field')
778
829
  end
779
830
  end
780
831
 
781
- describe "have_select matcher" do
832
+ describe 'have_select matcher' do
782
833
  let(:html) { '<label>Select Box<select></select></label>' }
783
834
 
784
- it "gives proper description" do
785
- expect(have_select('Select Box').description).to eq("have visible select box \"Select Box\" that is not disabled")
835
+ it 'gives proper description' do
836
+ expect(have_select('Select Box').description).to eq('have visible select box "Select Box" that is not disabled')
786
837
  end
787
838
 
788
- it "gives proper description for a given selected value" do
839
+ it 'gives proper description for a given selected value' do
789
840
  expect(have_select('Select Box', selected: 'some value').description).to eq('have visible select box "Select Box" that is not disabled with "some value" selected')
790
841
  end
791
842
 
792
- it "passes if there is such a select" do
843
+ it 'passes if there is such a select' do
793
844
  expect(html).to have_select('Select Box')
794
845
  end
795
846
 
796
- it "fails if there is no such select" do
847
+ it 'fails if there is no such select' do
797
848
  expect do
798
849
  expect(html).to have_select('No such Select box')
799
- end.to raise_error(/expected to find visible select box "No such Select box"/)
850
+ end.to raise_error(/expected to find select box "No such Select box"/)
800
851
  end
801
852
 
802
- it "supports compounding" do
853
+ it 'supports compounding' do
803
854
  expect(html).to have_select('Not this one').or have_select('Select Box')
804
855
  end
805
856
  end
806
857
 
807
- describe "have_table matcher" do
858
+ describe 'have_table matcher' do
808
859
  let(:html) { '<table><caption>Lovely table</caption></table>' }
809
860
 
810
- it "gives proper description" do
811
- expect(have_table('Lovely table').description).to eq("have visible table \"Lovely table\"")
861
+ it 'gives proper description' do
862
+ expect(have_table('Lovely table').description).to eq('have visible table "Lovely table"')
863
+ expect(have_table('Lovely table', caption: 'my caption').description).to eq('have visible table "Lovely table" with caption "my caption"')
812
864
  end
813
865
 
814
- it "gives proper description when :visible option passed" do
815
- expect(have_table('Lovely table', visible: true).description).to eq("have visible table \"Lovely table\"")
816
- expect(have_table('Lovely table', visible: :hidden).description).to eq("have non-visible table \"Lovely table\"")
817
- expect(have_table('Lovely table', visible: :all).description).to eq("have table \"Lovely table\"")
818
- expect(have_table('Lovely table', visible: false).description).to eq("have table \"Lovely table\"")
866
+ it 'gives proper description when :visible option passed' do
867
+ expect(have_table('Lovely table', visible: true).description).to eq('have visible table "Lovely table"') # rubocop:disable Capybara/VisibilityMatcher
868
+ expect(have_table('Lovely table', visible: :hidden).description).to eq('have non-visible table "Lovely table"')
869
+ expect(have_table('Lovely table', visible: :all).description).to eq('have table "Lovely table"')
870
+ expect(have_table('Lovely table', visible: false).description).to eq('have table "Lovely table"') # rubocop:disable Capybara/VisibilityMatcher
819
871
  end
820
872
 
821
- it "passes if there is such a select" do
873
+ it 'passes if there is such a table' do
822
874
  expect(html).to have_table('Lovely table')
823
875
  end
824
876
 
825
- it "fails if there is no such select" do
877
+ it 'fails if there is no such table' do
826
878
  expect do
827
879
  expect(html).to have_table('No such Table')
828
- end.to raise_error(/expected to find visible table "No such Table"/)
880
+ end.to raise_error(/expected to find table "No such Table"/)
829
881
  end
830
882
 
831
- it "supports compounding" do
883
+ it 'supports compounding' do
832
884
  expect(html).to have_table('nope').or have_table('Lovely table')
833
885
  end
834
886
  end
835
887
 
836
- context "compounding", requires: [:js] do
837
- before(:each) do
838
- @session = session
839
- @session.visit('/with_js')
840
- @el = @session.find(:css, '#reload-me')
888
+ context 'compounding timing' do
889
+ let(:session) { session }
890
+ let(:el) { session.find(:css, '#reload-me') }
891
+
892
+ before do
893
+ session.visit('/with_js')
841
894
  end
842
895
 
843
- context "#and" do
896
+ describe '#and' do
844
897
  it "should run 'concurrently'" do
845
- Capybara.using_wait_time(2) do
898
+ session.using_wait_time(2) do
846
899
  matcher = have_text('this is not there').and have_text('neither is this')
847
900
  expect(Benchmark.realtime do
848
901
  expect do
849
- expect(@el).to matcher
902
+ expect(el).to matcher
850
903
  end.to raise_error RSpec::Expectations::ExpectationNotMetError
851
904
  end).to be_between(2, 3)
852
905
  end
853
906
  end
854
907
 
855
908
  it "should run 'concurrently' and retry" do
856
- @session.click_link('reload-link')
857
- @session.using_wait_time(2) do
909
+ session.click_link('reload-link')
910
+ session.using_wait_time(2) do
858
911
  expect(Benchmark.realtime do
859
912
  expect do
860
- expect(@el).to have_text('waiting to be reloaded').and(have_text('has been reloaded'))
913
+ expect(el).to have_text('waiting to be reloaded').and(have_text('has been reloaded'))
861
914
  end.to raise_error RSpec::Expectations::ExpectationNotMetError, /expected to find text "waiting to be reloaded" in "has been reloaded"/
862
915
  end).to be_between(2, 3)
863
916
  end
864
917
  end
865
918
 
866
- it "should ignore :wait options" do
867
- @session.using_wait_time(2) do
919
+ it 'should ignore :wait options' do
920
+ session.using_wait_time(2) do
868
921
  matcher = have_text('this is not there', wait: 5).and have_text('neither is this', wait: 6)
869
922
  expect(Benchmark.realtime do
870
923
  expect do
871
- expect(@el).to matcher
924
+ expect(el).to matcher
872
925
  end.to raise_error RSpec::Expectations::ExpectationNotMetError
873
926
  end).to be_between(2, 3)
874
927
  end
875
928
  end
876
929
 
877
- it "should work on the session" do
878
- @session.using_wait_time(2) do
879
- @session.click_link('reload-link')
880
- expect(@session).to have_selector(:css, 'h1', text: 'FooBar').and have_text('has been reloaded')
930
+ it 'should work on the session' do
931
+ session.using_wait_time(2) do
932
+ session.click_link('reload-link')
933
+ expect(session).to have_selector(:css, 'h1', text: 'FooBar').and have_text('has been reloaded')
881
934
  end
882
935
  end
883
936
  end
884
937
 
885
- context "#and_then" do
886
- it "should run sequentially" do
887
- @session.click_link('reload-link')
888
- expect(@el).to have_text('waiting to be reloaded').and_then have_text('has been reloaded')
938
+ describe '#and_then' do
939
+ it 'should run sequentially' do
940
+ session.click_link('reload-link')
941
+ expect(el).to have_text('waiting to be reloaded').and_then have_text('has been reloaded')
889
942
  end
890
943
  end
891
944
 
892
- context "#or" do
945
+ describe '#or' do
893
946
  it "should run 'concurrently'" do
894
- @session.using_wait_time(3) do
947
+ session.using_wait_time(3) do
895
948
  expect(Benchmark.realtime do
896
- expect(@el).to have_text('has been reloaded').or have_text('waiting to be reloaded')
949
+ expect(el).to have_text('has been reloaded').or have_text('waiting to be reloaded')
897
950
  end).to be < 1
898
951
  end
899
952
  end
900
953
 
901
- it "should retry" do
902
- @session.using_wait_time(3) do
954
+ it 'should retry' do
955
+ session.using_wait_time(3) do
903
956
  expect(Benchmark.realtime do
904
957
  expect do
905
- expect(@el).to have_text('has been reloaded').or have_text('random stuff')
958
+ expect(el).to have_text('has been reloaded').or have_text('random stuff')
906
959
  end.to raise_error RSpec::Expectations::ExpectationNotMetError
907
960
  end).to be > 3
908
961
  end
909
962
  end
910
963
 
911
- it "should ignore :wait options" do
912
- @session.using_wait_time(2) do
964
+ it 'should ignore :wait options' do
965
+ session.using_wait_time(2) do
913
966
  expect(Benchmark.realtime do
914
967
  expect do
915
- expect(@el).to have_text('this is not there', wait: 10).or have_text('neither is this', wait: 15)
968
+ expect(el).to have_text('this is not there', wait: 10).or have_text('neither is this', wait: 15)
916
969
  end.to raise_error RSpec::Expectations::ExpectationNotMetError
917
970
  end).to be_between(2, 3)
918
971
  end
919
972
  end
920
973
 
921
- it "should work on the session" do
922
- @session.using_wait_time(2) do
923
- @session.click_link('reload-link')
924
- expect(@session).to have_selector(:css, 'h1', text: 'Not on the page').or have_text('has been reloaded')
974
+ it 'should work on the session' do
975
+ session.using_wait_time(2) do
976
+ session.click_link('reload-link')
977
+ expect(session).to have_selector(:css, 'h1', text: 'Not on the page').or have_text('has been reloaded')
925
978
  end
926
979
  end
927
980
  end
928
981
  end
929
982
  end
983
+ # rubocop:enable RSpec/ExpectActual