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
@@ -0,0 +1,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#have_sibling' do
4
+ before do
5
+ @session.visit('/with_html')
6
+ end
7
+
8
+ it 'should assert a prior sibling element using the given locator' do
9
+ el = @session.find(:css, '#mid_sibling')
10
+ expect(el).to have_sibling(:css, '#pre_sibling')
11
+ end
12
+
13
+ it 'should assert a following sibling element using the given locator' do
14
+ el = @session.find(:css, '#mid_sibling')
15
+ expect(el).to have_sibling(:css, '#post_sibling')
16
+ end
17
+
18
+ it 'should not raise an error if there are multiple matches' do
19
+ el = @session.find(:css, '#mid_sibling')
20
+ expect(el).to have_sibling(:css, 'div')
21
+ end
22
+
23
+ it 'should allow counts to be specified' do
24
+ el = @session.find(:css, '#mid_sibling')
25
+
26
+ expect(el).to have_sibling(:css, 'div').exactly(2).times
27
+ expect do
28
+ expect(el).to have_sibling(:css, 'div').once
29
+ end.to raise_error(RSpec::Expectations::ExpectationNotMetError)
30
+ end
31
+ end
32
+
33
+ Capybara::SpecHelper.spec '#have_no_sibling' do
34
+ before do
35
+ @session.visit('/with_html')
36
+ end
37
+
38
+ it 'should assert no matching sibling' do
39
+ el = @session.find(:css, '#mid_sibling')
40
+ expect(el).to have_no_sibling(:css, '#not_a_sibling')
41
+ expect(el).not_to have_sibling(:css, '#not_a_sibling')
42
+ end
43
+
44
+ it 'should raise if there are matching siblings' do
45
+ el = @session.find(:css, '#mid_sibling')
46
+ expect do
47
+ expect(el).to have_no_sibling(:css, '#pre_sibling')
48
+ end.to raise_error(RSpec::Expectations::ExpectationNotMetError)
49
+ end
50
+ end
@@ -5,15 +5,132 @@ Capybara::SpecHelper.spec '#has_table?' do
5
5
  @session.visit('/tables')
6
6
  end
7
7
 
8
- it "should be true if the table is on the page" do
8
+ it 'should be true if the table is on the page' do
9
9
  expect(@session).to have_table('Villain')
10
10
  expect(@session).to have_table('villain_table')
11
11
  expect(@session).to have_table(:villain_table)
12
12
  end
13
13
 
14
- it "should be false if the table is not on the page" do
14
+ it 'should accept rows with column header hashes' do
15
+ expect(@session).to have_table('Horizontal Headers', with_rows:
16
+ [
17
+ { 'First Name' => 'Vern', 'Last Name' => 'Konopelski', 'City' => 'Everette' },
18
+ { 'First Name' => 'Palmer', 'Last Name' => 'Sawayn', 'City' => 'West Trinidad' }
19
+ ])
20
+ end
21
+
22
+ it 'should accept rows with partial column header hashes' do
23
+ expect(@session).to have_table('Horizontal Headers', with_rows:
24
+ [
25
+ { 'First Name' => 'Thomas' },
26
+ { 'Last Name' => 'Sawayn', 'City' => 'West Trinidad' }
27
+ ])
28
+
29
+ expect(@session).not_to have_table('Horizontal Headers', with_rows:
30
+ [
31
+ { 'Unmatched Header' => 'Thomas' }
32
+ ])
33
+ end
34
+
35
+ it 'should accept rows with array of cell values' do
36
+ expect(@session).to have_table('Horizontal Headers', with_rows:
37
+ [
38
+ %w[Thomas Walpole Oceanside],
39
+ ['Ratke', 'Lawrence', 'East Sorayashire']
40
+ ])
41
+ end
42
+
43
+ it 'should consider order of cells in each row' do
44
+ expect(@session).not_to have_table('Horizontal Headers', with_rows:
45
+ [
46
+ %w[Thomas Walpole Oceanside],
47
+ ['Lawrence', 'Ratke', 'East Sorayashire']
48
+ ])
49
+ end
50
+
51
+ it 'should accept all rows with array of cell values' do
52
+ expect(@session).to have_table('Horizontal Headers', rows:
53
+ [
54
+ %w[Thomas Walpole Oceanside],
55
+ %w[Danilo Wilkinson Johnsonville],
56
+ %w[Vern Konopelski Everette],
57
+ ['Ratke', 'Lawrence', 'East Sorayashire'],
58
+ ['Palmer', 'Sawayn', 'West Trinidad']
59
+ ])
60
+ end
61
+
62
+ it 'should match with vertical headers' do
63
+ expect(@session).to have_table('Vertical Headers', with_cols:
64
+ [
65
+ { 'First Name' => 'Thomas' },
66
+ { 'First Name' => 'Danilo', 'Last Name' => 'Wilkinson', 'City' => 'Johnsonville' },
67
+ { 'Last Name' => 'Sawayn', 'City' => 'West Trinidad' }
68
+ ])
69
+ end
70
+
71
+ it 'should match col with array of cell values' do
72
+ expect(@session).to have_table('Vertical Headers', with_cols:
73
+ [
74
+ %w[Vern Konopelski Everette]
75
+ ])
76
+ end
77
+
78
+ it 'should match cols with array of cell values' do
79
+ expect(@session).to have_table('Vertical Headers', with_cols:
80
+ [
81
+ %w[Danilo Wilkinson Johnsonville],
82
+ %w[Vern Konopelski Everette]
83
+ ])
84
+ end
85
+
86
+ it 'should match all cols with array of cell values' do
87
+ expect(@session).to have_table('Vertical Headers', cols:
88
+ [
89
+ %w[Thomas Walpole Oceanside],
90
+ %w[Danilo Wilkinson Johnsonville],
91
+ %w[Vern Konopelski Everette],
92
+ ['Ratke', 'Lawrence', 'East Sorayashire'],
93
+ ['Palmer', 'Sawayn', 'West Trinidad']
94
+ ])
95
+ end
96
+
97
+ it "should not match if the order of cell values doesn't match" do
98
+ expect(@session).not_to have_table('Vertical Headers', with_cols:
99
+ [
100
+ %w[Vern Everette Konopelski]
101
+ ])
102
+ end
103
+
104
+ it "should not match with vertical headers if the columns don't match" do
105
+ expect(@session).not_to have_table('Vertical Headers', with_cols:
106
+ [
107
+ { 'First Name' => 'Thomas' },
108
+ { 'First Name' => 'Danilo', 'Last Name' => 'Walpole', 'City' => 'Johnsonville' },
109
+ { 'Last Name' => 'Sawayn', 'City' => 'West Trinidad' }
110
+ ])
111
+
112
+ expect(@session).not_to have_table('Vertical Headers', with_cols:
113
+ [
114
+ { 'Unmatched Header' => 'Thomas' }
115
+ ])
116
+ end
117
+
118
+ it 'should be false if the table is not on the page' do
15
119
  expect(@session).not_to have_table('Monkey')
16
120
  end
121
+
122
+ it 'should find row by header and cell values' do
123
+ expect(@session.find(:table, 'Horizontal Headers')).to have_selector(:table_row, 'First Name' => 'Thomas', 'Last Name' => 'Walpole')
124
+ expect(@session.find(:table, 'Horizontal Headers')).to have_selector(:table_row, 'Last Name' => 'Walpole')
125
+ expect(@session.find(:table, 'Horizontal Headers')).not_to have_selector(:table_row, 'First Name' => 'Walpole')
126
+ expect(@session.find(:table, 'Horizontal Headers')).not_to have_selector(:table_row, 'Unmatched Header' => 'Thomas')
127
+ end
128
+
129
+ it 'should find row by cell values' do
130
+ expect(@session.find(:table, 'Horizontal Headers')).to have_selector(:table_row, %w[Thomas Walpole Oceanside])
131
+ expect(@session.find(:table, 'Horizontal Headers')).not_to have_selector(:table_row, %w[Walpole Thomas])
132
+ expect(@session.find(:table, 'Horizontal Headers')).not_to have_selector(:table_row, %w[Other])
133
+ end
17
134
  end
18
135
 
19
136
  Capybara::SpecHelper.spec '#has_no_table?' do
@@ -21,12 +138,72 @@ Capybara::SpecHelper.spec '#has_no_table?' do
21
138
  @session.visit('/tables')
22
139
  end
23
140
 
24
- it "should be false if the table is on the page" do
141
+ it 'should be false if the table is on the page' do
25
142
  expect(@session).not_to have_no_table('Villain')
26
143
  expect(@session).not_to have_no_table('villain_table')
27
144
  end
28
145
 
29
- it "should be true if the table is not on the page" do
146
+ it 'should be true if the table is not on the page' do
30
147
  expect(@session).to have_no_table('Monkey')
31
148
  end
149
+
150
+ it 'should consider rows' do
151
+ expect(@session).to have_no_table('Horizontal Headers', with_rows:
152
+ [
153
+ { 'First Name' => 'Thomas', 'City' => 'Los Angeles' }
154
+ ])
155
+ end
156
+
157
+ context 'using :with_cols' do
158
+ it 'should consider a single column' do
159
+ expect(@session).to have_no_table('Vertical Headers', with_cols:
160
+ [
161
+ { 'First Name' => 'Joe' }
162
+ ])
163
+ end
164
+
165
+ it 'should be true even if the last column does exist' do
166
+ expect(@session).to have_no_table('Vertical Headers', with_cols:
167
+ [
168
+ {
169
+ 'First Name' => 'What?',
170
+ 'What?' => 'Walpole',
171
+ 'City' => 'Oceanside' # This line makes the example fail
172
+ }
173
+ ])
174
+ end
175
+
176
+ it 'should be true if none of the columns exist' do
177
+ expect(@session).to have_no_table('Vertical Headers', with_cols:
178
+ [
179
+ {
180
+ 'First Name' => 'What?',
181
+ 'What?' => 'Walpole',
182
+ 'City' => 'What?'
183
+ }
184
+ ])
185
+ end
186
+
187
+ it 'should be true if the first column does match' do
188
+ expect(@session).to have_no_table('Vertical Headers', with_cols:
189
+ [
190
+ {
191
+ 'First Name' => 'Thomas',
192
+ 'Last Name' => 'What',
193
+ 'City' => 'What'
194
+ }
195
+ ])
196
+ end
197
+
198
+ it 'should be true if none of the columns match' do
199
+ expect(@session).to have_no_table('Vertical Headers', with_cols:
200
+ [
201
+ {
202
+ 'First Name' => 'What',
203
+ 'Last Name' => 'What',
204
+ 'City' => 'What'
205
+ }
206
+ ])
207
+ end
208
+ end
32
209
  end
@@ -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,72 @@ 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
+ expect(@session).to have_text(:visible, with_to_hash, **{})
131
+ end
132
+ end
133
+
134
+ context 'with exact: true option' do
135
+ it 'should be true if text matches exactly' do
136
+ @session.visit('/with_html')
137
+ expect(@session.find(:id, 'h2one')).to have_text('Header Class Test One', exact: true)
99
138
  end
100
139
 
101
140
  it "should be false if text doesn't match exactly" do
102
141
  @session.visit('/with_html')
103
- expect(@session.find(:id, "h2one")).not_to have_text("Header Class Test On", exact: true)
142
+ expect(@session.find(:id, 'h2one')).not_to have_text('Header Class Test On', exact: true)
104
143
  end
105
144
  end
106
145
 
107
- it "should escape any characters that would have special meaning in a regexp" do
146
+ it 'should escape any characters that would have special meaning in a regexp' do
108
147
  @session.visit('/with_html')
109
148
  expect(@session).not_to have_text('.orem')
110
149
  end
111
150
 
112
- it "should accept non-string parameters" do
151
+ it 'should accept non-string parameters' do
113
152
  @session.visit('/with_html')
114
153
  expect(@session).to have_text(42)
115
154
  end
116
155
 
117
- it "should be true when passed nil" do
156
+ it 'should be true when passed nil, and warn about it' do
118
157
  # nil is converted to '' when to_s is invoked
119
158
  @session.visit('/with_html')
120
- expect(@session).to have_text(nil)
159
+ expect do
160
+ expect(@session).to have_text(nil)
161
+ end.to output(/Checking for expected text of nil is confusing/).to_stderr
121
162
  end
122
163
 
123
- it "should wait for text to appear", requires: [:js] do
164
+ it 'should wait for text to appear', requires: [:js] do
124
165
  Capybara.using_wait_time(3) do
125
166
  @session.visit('/with_js')
126
167
  @session.click_link('Click me')
127
- expect(@session).to have_text("Has been clicked")
168
+ expect(@session).to have_text('Has been clicked')
128
169
  end
129
170
  end
130
171
 
131
- context "with between" do
132
- it "should be true if the text occurs within the range given" do
172
+ context 'with between' do
173
+ it 'should be true if the text occurs within the range given' do
133
174
  @session.visit('/with_count')
134
175
  expect(@session).to have_text('count', between: 1..3)
135
176
  expect(@session).to have_text(/count/, between: 2..2)
136
177
  end
137
178
 
138
- it "should be false if the text occurs more or fewer times than range" do
179
+ it 'should be false if the text occurs more or fewer times than range' do
139
180
  @session.visit('/with_count')
140
181
  expect(@session).not_to have_text('count', between: 0..1)
141
182
  expect(@session).not_to have_text('count', between: 3..10)
@@ -143,76 +184,82 @@ Capybara::SpecHelper.spec '#has_text?' do
143
184
  end
144
185
  end
145
186
 
146
- context "with count" do
147
- it "should be true if the text occurs the given number of times" do
187
+ context 'with count' do
188
+ it 'should be true if the text occurs the given number of times' do
148
189
  @session.visit('/with_count')
149
190
  expect(@session).to have_text('count', count: 2)
191
+ expect(@session).to have_text('count').exactly(2).times
150
192
  end
151
193
 
152
- it "should be false if the text occurs a different number of times than the given" do
194
+ it 'should be false if the text occurs a different number of times than the given' do
153
195
  @session.visit('/with_count')
154
196
  expect(@session).not_to have_text('count', count: 0)
155
197
  expect(@session).not_to have_text('count', count: 1)
198
+ expect(@session).not_to have_text('count').once
156
199
  expect(@session).not_to have_text(/count/, count: 3)
157
200
  end
158
201
 
159
- it "should coerce count to an integer" do
202
+ it 'should coerce count to an integer' do
160
203
  @session.visit('/with_count')
161
204
  expect(@session).to have_text('count', count: '2')
162
205
  expect(@session).not_to have_text('count', count: '3')
163
206
  end
164
207
  end
165
208
 
166
- context "with maximum" do
167
- it "should be true when text occurs same or fewer times than given" do
209
+ context 'with maximum' do
210
+ it 'should be true when text occurs same or fewer times than given' do
168
211
  @session.visit('/with_count')
169
212
  expect(@session).to have_text('count', maximum: 2)
213
+ expect(@session).to have_text('count').at_most(2).times
170
214
  expect(@session).to have_text(/count/, maximum: 3)
171
215
  end
172
216
 
173
- it "should be false when text occurs more times than given" do
217
+ it 'should be false when text occurs more times than given' do
174
218
  @session.visit('/with_count')
175
219
  expect(@session).not_to have_text('count', maximum: 1)
220
+ expect(@session).not_to have_text('count').at_most(1).times
176
221
  expect(@session).not_to have_text('count', maximum: 0)
177
222
  end
178
223
 
179
- it "should coerce maximum to an integer" do
224
+ it 'should coerce maximum to an integer' do
180
225
  @session.visit('/with_count')
181
226
  expect(@session).to have_text('count', maximum: '2')
182
227
  expect(@session).not_to have_text('count', maximum: '1')
183
228
  end
184
229
  end
185
230
 
186
- context "with minimum" do
187
- it "should be true when text occurs same or more times than given" do
231
+ context 'with minimum' do
232
+ it 'should be true when text occurs same or more times than given' do
188
233
  @session.visit('/with_count')
189
234
  expect(@session).to have_text('count', minimum: 2)
235
+ expect(@session).to have_text('count').at_least(2).times
190
236
  expect(@session).to have_text(/count/, minimum: 0)
191
237
  end
192
238
 
193
- it "should be false when text occurs fewer times than given" do
239
+ it 'should be false when text occurs fewer times than given' do
194
240
  @session.visit('/with_count')
195
241
  expect(@session).not_to have_text('count', minimum: 3)
242
+ expect(@session).not_to have_text('count').at_least(3).times
196
243
  end
197
244
 
198
- it "should coerce minimum to an integer" do
245
+ it 'should coerce minimum to an integer' do
199
246
  @session.visit('/with_count')
200
247
  expect(@session).to have_text('count', minimum: '2')
201
248
  expect(@session).not_to have_text('count', minimum: '3')
202
249
  end
203
250
  end
204
251
 
205
- context "with wait", requires: [:js] do
206
- it "should find element if it appears before given wait duration" do
252
+ context 'with wait', requires: [:js] do
253
+ it 'should find element if it appears before given wait duration' do
207
254
  Capybara.using_wait_time(0.1) do
208
255
  @session.visit('/with_js')
209
256
  @session.click_link('Click me')
210
- expect(@session).to have_text('Has been clicked', wait: 0.9)
257
+ expect(@session).to have_text('Has been clicked', wait: 3)
211
258
  end
212
259
  end
213
260
  end
214
261
 
215
- it "should raise an error if an invalid option is passed" do
262
+ it 'should raise an error if an invalid option is passed' do
216
263
  @session.visit('/with_html')
217
264
  expect do
218
265
  expect(@session).to have_text('Lorem', invalid: true)
@@ -221,34 +268,34 @@ Capybara::SpecHelper.spec '#has_text?' do
221
268
  end
222
269
 
223
270
  Capybara::SpecHelper.spec '#has_no_text?' do
224
- it "should be false if the given text is on the page at least once" do
271
+ it 'should be false if the given text is on the page at least once' do
225
272
  @session.visit('/with_html')
226
273
  expect(@session).not_to have_no_text('est')
227
274
  expect(@session).not_to have_no_text('Lorem')
228
275
  expect(@session).not_to have_no_text('Redirect')
229
276
  end
230
277
 
231
- it "should be false if scoped to an element which has the text" do
278
+ it 'should be false if scoped to an element which has the text' do
232
279
  @session.visit('/with_html')
233
280
  @session.within("//a[@title='awesome title']") do
234
281
  expect(@session).not_to have_no_text('labore')
235
282
  end
236
283
  end
237
284
 
238
- it "should be true if scoped to an element which does not have the text" do
285
+ it 'should be true if scoped to an element which does not have the text' do
239
286
  @session.visit('/with_html')
240
287
  @session.within("//a[@title='awesome title']") do
241
288
  expect(@session).to have_no_text('monkey')
242
289
  end
243
290
  end
244
291
 
245
- it "should ignore tags" do
292
+ it 'should ignore tags' do
246
293
  @session.visit('/with_html')
247
294
  expect(@session).to have_no_text('exercitation <a href="/foo" id="foo">ullamco</a> laboris')
248
295
  expect(@session).not_to have_no_text('exercitation ullamco laboris')
249
296
  end
250
297
 
251
- it "should be true if the given text is not on the page" do
298
+ it 'should be true if the given text is not on the page' do
252
299
  @session.visit('/with_html')
253
300
  expect(@session).to have_no_text('xxxxyzzz')
254
301
  expect(@session).to have_no_text('monkey')
@@ -280,17 +327,17 @@ Capybara::SpecHelper.spec '#has_no_text?' do
280
327
  expect(@session).to have_no_text('aVar')
281
328
  end
282
329
 
283
- it "should be true if the given text is on the page but not visible" do
330
+ it 'should be true if the given text is on the page but not visible' do
284
331
  @session.visit('/with_html')
285
332
  expect(@session).to have_no_text('Inside element with hidden ancestor')
286
333
  end
287
334
 
288
- it "should be false if :all given and text is invisible." do
335
+ it 'should be false if :all given and text is invisible.' do
289
336
  @session.visit('/with_html')
290
337
  expect(@session).not_to have_no_text(:all, 'Some of this text is hidden!')
291
338
  end
292
339
 
293
- it "should be false if `Capybara.ignore_hidden_elements = false` and text is invisible." do
340
+ it 'should be false if `Capybara.ignore_hidden_elements = false` and text is invisible.' do
294
341
  Capybara.ignore_hidden_elements = false
295
342
  @session.visit('/with_html')
296
343
  expect(@session).not_to have_no_text('Some of this text is hidden!')
@@ -301,24 +348,25 @@ Capybara::SpecHelper.spec '#has_no_text?' do
301
348
  expect(@session).to have_no_text(/xxxxyzzz/)
302
349
  end
303
350
 
304
- it "should be false if the text in the page matches given regexp" do
351
+ it 'should be false if the text in the page matches given regexp' do
305
352
  @session.visit('/with_html')
306
353
  expect(@session).not_to have_no_text(/Lorem/)
307
354
  end
308
355
 
309
- it "should escape any characters that would have special meaning in a regexp" do
356
+ it 'should escape any characters that would have special meaning in a regexp' do
310
357
  @session.visit('/with_html')
311
358
  expect(@session).to have_no_text('.orem')
312
359
  end
313
360
 
314
- it "should wait for text to disappear", requires: [:js] do
361
+ it 'should wait for text to disappear', requires: [:js] do
362
+ Capybara.default_max_wait_time = 2
315
363
  @session.visit('/with_js')
316
364
  @session.click_link('Click me')
317
- expect(@session).to have_no_text("I changed it")
365
+ expect(@session).to have_no_text('I changed it')
318
366
  end
319
367
 
320
- context "with wait", requires: [:js] do
321
- it "should not find element if it appears after given wait duration" do
368
+ context 'with wait', requires: [:js] do
369
+ it 'should not find element if it appears after given wait duration' do
322
370
  @session.visit('/with_js')
323
371
  @session.click_link('Click me')
324
372
  expect(@session).to have_no_text('Has been clicked', wait: 0.05)