capybara 3.32.2

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 (313) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +1 -0
  3. data/History.md +1813 -0
  4. data/License.txt +22 -0
  5. data/README.md +1099 -0
  6. data/lib/capybara.rb +511 -0
  7. data/lib/capybara/config.rb +94 -0
  8. data/lib/capybara/cucumber.rb +27 -0
  9. data/lib/capybara/driver/base.rb +170 -0
  10. data/lib/capybara/driver/node.rb +139 -0
  11. data/lib/capybara/dsl.rb +65 -0
  12. data/lib/capybara/helpers.rb +108 -0
  13. data/lib/capybara/minitest.rb +386 -0
  14. data/lib/capybara/minitest/spec.rb +264 -0
  15. data/lib/capybara/node/actions.rb +420 -0
  16. data/lib/capybara/node/base.rb +143 -0
  17. data/lib/capybara/node/document.rb +48 -0
  18. data/lib/capybara/node/document_matchers.rb +67 -0
  19. data/lib/capybara/node/element.rb +606 -0
  20. data/lib/capybara/node/finders.rb +325 -0
  21. data/lib/capybara/node/matchers.rb +883 -0
  22. data/lib/capybara/node/simple.rb +208 -0
  23. data/lib/capybara/queries/ancestor_query.rb +27 -0
  24. data/lib/capybara/queries/base_query.rb +106 -0
  25. data/lib/capybara/queries/current_path_query.rb +51 -0
  26. data/lib/capybara/queries/match_query.rb +26 -0
  27. data/lib/capybara/queries/selector_query.rb +710 -0
  28. data/lib/capybara/queries/sibling_query.rb +26 -0
  29. data/lib/capybara/queries/style_query.rb +45 -0
  30. data/lib/capybara/queries/text_query.rb +110 -0
  31. data/lib/capybara/queries/title_query.rb +39 -0
  32. data/lib/capybara/rack_test/browser.rb +140 -0
  33. data/lib/capybara/rack_test/css_handlers.rb +13 -0
  34. data/lib/capybara/rack_test/driver.rb +109 -0
  35. data/lib/capybara/rack_test/errors.rb +6 -0
  36. data/lib/capybara/rack_test/form.rb +127 -0
  37. data/lib/capybara/rack_test/node.rb +325 -0
  38. data/lib/capybara/rails.rb +16 -0
  39. data/lib/capybara/registrations/drivers.rb +36 -0
  40. data/lib/capybara/registrations/patches/puma_ssl.rb +27 -0
  41. data/lib/capybara/registrations/servers.rb +44 -0
  42. data/lib/capybara/result.rb +190 -0
  43. data/lib/capybara/rspec.rb +29 -0
  44. data/lib/capybara/rspec/features.rb +23 -0
  45. data/lib/capybara/rspec/matcher_proxies.rb +82 -0
  46. data/lib/capybara/rspec/matchers.rb +201 -0
  47. data/lib/capybara/rspec/matchers/base.rb +111 -0
  48. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  49. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  50. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  51. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  52. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  53. data/lib/capybara/rspec/matchers/have_selector.rb +77 -0
  54. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  55. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  56. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  57. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  58. data/lib/capybara/rspec/matchers/match_style.rb +38 -0
  59. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  60. data/lib/capybara/selector.rb +233 -0
  61. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  62. data/lib/capybara/selector/builders/xpath_builder.rb +69 -0
  63. data/lib/capybara/selector/css.rb +102 -0
  64. data/lib/capybara/selector/definition.rb +276 -0
  65. data/lib/capybara/selector/definition/button.rb +51 -0
  66. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  67. data/lib/capybara/selector/definition/css.rb +10 -0
  68. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  69. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  70. data/lib/capybara/selector/definition/element.rb +27 -0
  71. data/lib/capybara/selector/definition/field.rb +40 -0
  72. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  73. data/lib/capybara/selector/definition/file_field.rb +13 -0
  74. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  75. data/lib/capybara/selector/definition/frame.rb +17 -0
  76. data/lib/capybara/selector/definition/id.rb +6 -0
  77. data/lib/capybara/selector/definition/label.rb +62 -0
  78. data/lib/capybara/selector/definition/link.rb +46 -0
  79. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  80. data/lib/capybara/selector/definition/option.rb +27 -0
  81. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  82. data/lib/capybara/selector/definition/select.rb +81 -0
  83. data/lib/capybara/selector/definition/table.rb +109 -0
  84. data/lib/capybara/selector/definition/table_row.rb +21 -0
  85. data/lib/capybara/selector/definition/xpath.rb +5 -0
  86. data/lib/capybara/selector/filter.rb +5 -0
  87. data/lib/capybara/selector/filter_set.rb +124 -0
  88. data/lib/capybara/selector/filters/base.rb +77 -0
  89. data/lib/capybara/selector/filters/expression_filter.rb +22 -0
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +31 -0
  92. data/lib/capybara/selector/regexp_disassembler.rb +214 -0
  93. data/lib/capybara/selector/selector.rb +147 -0
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  96. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  97. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  98. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  99. data/lib/capybara/selenium/driver.rb +496 -0
  100. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +119 -0
  101. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +126 -0
  102. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +89 -0
  103. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  104. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  105. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  106. data/lib/capybara/selenium/extensions/find.rb +110 -0
  107. data/lib/capybara/selenium/extensions/html5_drag.rb +228 -0
  108. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  109. data/lib/capybara/selenium/extensions/scroll.rb +78 -0
  110. data/lib/capybara/selenium/logger_suppressor.rb +34 -0
  111. data/lib/capybara/selenium/node.rb +610 -0
  112. data/lib/capybara/selenium/nodes/chrome_node.rb +119 -0
  113. data/lib/capybara/selenium/nodes/edge_node.rb +104 -0
  114. data/lib/capybara/selenium/nodes/firefox_node.rb +131 -0
  115. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  116. data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
  117. data/lib/capybara/selenium/patches/action_pauser.rb +26 -0
  118. data/lib/capybara/selenium/patches/atoms.rb +18 -0
  119. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  120. data/lib/capybara/selenium/patches/logs.rb +47 -0
  121. data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
  122. data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  123. data/lib/capybara/server.rb +126 -0
  124. data/lib/capybara/server/animation_disabler.rb +58 -0
  125. data/lib/capybara/server/checker.rb +44 -0
  126. data/lib/capybara/server/middleware.rb +69 -0
  127. data/lib/capybara/session.rb +942 -0
  128. data/lib/capybara/session/config.rb +124 -0
  129. data/lib/capybara/session/matchers.rb +87 -0
  130. data/lib/capybara/spec/fixtures/another_test_file.txt +1 -0
  131. data/lib/capybara/spec/fixtures/capybara.jpg +3 -0
  132. data/lib/capybara/spec/fixtures/no_extension +1 -0
  133. data/lib/capybara/spec/fixtures/test_file.txt +1 -0
  134. data/lib/capybara/spec/public/jquery-ui.js +13 -0
  135. data/lib/capybara/spec/public/jquery.js +5 -0
  136. data/lib/capybara/spec/public/offset.js +6 -0
  137. data/lib/capybara/spec/public/test.js +268 -0
  138. data/lib/capybara/spec/session/accept_alert_spec.rb +81 -0
  139. data/lib/capybara/spec/session/accept_confirm_spec.rb +32 -0
  140. data/lib/capybara/spec/session/accept_prompt_spec.rb +78 -0
  141. data/lib/capybara/spec/session/all_spec.rb +278 -0
  142. data/lib/capybara/spec/session/ancestor_spec.rb +88 -0
  143. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +140 -0
  144. data/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
  145. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  146. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  147. data/lib/capybara/spec/session/assert_text_spec.rb +258 -0
  148. data/lib/capybara/spec/session/assert_title_spec.rb +93 -0
  149. data/lib/capybara/spec/session/attach_file_spec.rb +216 -0
  150. data/lib/capybara/spec/session/body_spec.rb +23 -0
  151. data/lib/capybara/spec/session/check_spec.rb +235 -0
  152. data/lib/capybara/spec/session/choose_spec.rb +121 -0
  153. data/lib/capybara/spec/session/click_button_spec.rb +506 -0
  154. data/lib/capybara/spec/session/click_link_or_button_spec.rb +129 -0
  155. data/lib/capybara/spec/session/click_link_spec.rb +229 -0
  156. data/lib/capybara/spec/session/current_scope_spec.rb +31 -0
  157. data/lib/capybara/spec/session/current_url_spec.rb +115 -0
  158. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +36 -0
  159. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +21 -0
  160. data/lib/capybara/spec/session/element/assert_match_selector_spec.rb +38 -0
  161. data/lib/capybara/spec/session/element/match_css_spec.rb +31 -0
  162. data/lib/capybara/spec/session/element/match_xpath_spec.rb +25 -0
  163. data/lib/capybara/spec/session/element/matches_selector_spec.rb +120 -0
  164. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
  165. data/lib/capybara/spec/session/evaluate_script_spec.rb +49 -0
  166. data/lib/capybara/spec/session/execute_script_spec.rb +28 -0
  167. data/lib/capybara/spec/session/fill_in_spec.rb +286 -0
  168. data/lib/capybara/spec/session/find_button_spec.rb +74 -0
  169. data/lib/capybara/spec/session/find_by_id_spec.rb +33 -0
  170. data/lib/capybara/spec/session/find_field_spec.rb +113 -0
  171. data/lib/capybara/spec/session/find_link_spec.rb +70 -0
  172. data/lib/capybara/spec/session/find_spec.rb +531 -0
  173. data/lib/capybara/spec/session/first_spec.rb +156 -0
  174. data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
  175. data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
  176. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +116 -0
  177. data/lib/capybara/spec/session/frame/within_frame_spec.rb +112 -0
  178. data/lib/capybara/spec/session/go_back_spec.rb +12 -0
  179. data/lib/capybara/spec/session/go_forward_spec.rb +14 -0
  180. data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
  181. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  182. data/lib/capybara/spec/session/has_any_selectors_spec.rb +25 -0
  183. data/lib/capybara/spec/session/has_button_spec.rb +69 -0
  184. data/lib/capybara/spec/session/has_css_spec.rb +374 -0
  185. data/lib/capybara/spec/session/has_current_path_spec.rb +138 -0
  186. data/lib/capybara/spec/session/has_field_spec.rb +349 -0
  187. data/lib/capybara/spec/session/has_link_spec.rb +39 -0
  188. data/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
  189. data/lib/capybara/spec/session/has_select_spec.rb +310 -0
  190. data/lib/capybara/spec/session/has_selector_spec.rb +202 -0
  191. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  192. data/lib/capybara/spec/session/has_table_spec.rb +198 -0
  193. data/lib/capybara/spec/session/has_text_spec.rb +394 -0
  194. data/lib/capybara/spec/session/has_title_spec.rb +71 -0
  195. data/lib/capybara/spec/session/has_xpath_spec.rb +149 -0
  196. data/lib/capybara/spec/session/headers_spec.rb +8 -0
  197. data/lib/capybara/spec/session/html_spec.rb +47 -0
  198. data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
  199. data/lib/capybara/spec/session/node_spec.rb +1292 -0
  200. data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  201. data/lib/capybara/spec/session/refresh_spec.rb +33 -0
  202. data/lib/capybara/spec/session/reset_session_spec.rb +148 -0
  203. data/lib/capybara/spec/session/response_code_spec.rb +8 -0
  204. data/lib/capybara/spec/session/save_and_open_page_spec.rb +21 -0
  205. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +43 -0
  206. data/lib/capybara/spec/session/save_page_spec.rb +110 -0
  207. data/lib/capybara/spec/session/save_screenshot_spec.rb +55 -0
  208. data/lib/capybara/spec/session/screenshot_spec.rb +18 -0
  209. data/lib/capybara/spec/session/scroll_spec.rb +117 -0
  210. data/lib/capybara/spec/session/select_spec.rb +229 -0
  211. data/lib/capybara/spec/session/selectors_spec.rb +98 -0
  212. data/lib/capybara/spec/session/sibling_spec.rb +52 -0
  213. data/lib/capybara/spec/session/source_spec.rb +0 -0
  214. data/lib/capybara/spec/session/text_spec.rb +74 -0
  215. data/lib/capybara/spec/session/title_spec.rb +29 -0
  216. data/lib/capybara/spec/session/uncheck_spec.rb +100 -0
  217. data/lib/capybara/spec/session/unselect_spec.rb +116 -0
  218. data/lib/capybara/spec/session/visit_spec.rb +204 -0
  219. data/lib/capybara/spec/session/window/become_closed_spec.rb +89 -0
  220. data/lib/capybara/spec/session/window/current_window_spec.rb +28 -0
  221. data/lib/capybara/spec/session/window/open_new_window_spec.rb +31 -0
  222. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +132 -0
  223. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +99 -0
  224. data/lib/capybara/spec/session/window/window_spec.rb +203 -0
  225. data/lib/capybara/spec/session/window/windows_spec.rb +34 -0
  226. data/lib/capybara/spec/session/window/within_window_spec.rb +157 -0
  227. data/lib/capybara/spec/session/within_spec.rb +199 -0
  228. data/lib/capybara/spec/spec_helper.rb +134 -0
  229. data/lib/capybara/spec/test_app.rb +226 -0
  230. data/lib/capybara/spec/views/animated.erb +49 -0
  231. data/lib/capybara/spec/views/buttons.erb +5 -0
  232. data/lib/capybara/spec/views/fieldsets.erb +30 -0
  233. data/lib/capybara/spec/views/form.erb +685 -0
  234. data/lib/capybara/spec/views/frame_child.erb +18 -0
  235. data/lib/capybara/spec/views/frame_one.erb +10 -0
  236. data/lib/capybara/spec/views/frame_parent.erb +9 -0
  237. data/lib/capybara/spec/views/frame_two.erb +9 -0
  238. data/lib/capybara/spec/views/header_links.erb +8 -0
  239. data/lib/capybara/spec/views/host_links.erb +13 -0
  240. data/lib/capybara/spec/views/initial_alert.erb +10 -0
  241. data/lib/capybara/spec/views/obscured.erb +47 -0
  242. data/lib/capybara/spec/views/offset.erb +32 -0
  243. data/lib/capybara/spec/views/path.erb +13 -0
  244. data/lib/capybara/spec/views/popup_one.erb +9 -0
  245. data/lib/capybara/spec/views/popup_two.erb +9 -0
  246. data/lib/capybara/spec/views/postback.erb +14 -0
  247. data/lib/capybara/spec/views/react.erb +45 -0
  248. data/lib/capybara/spec/views/scroll.erb +20 -0
  249. data/lib/capybara/spec/views/spatial.erb +31 -0
  250. data/lib/capybara/spec/views/tables.erb +130 -0
  251. data/lib/capybara/spec/views/with_animation.erb +74 -0
  252. data/lib/capybara/spec/views/with_base_tag.erb +11 -0
  253. data/lib/capybara/spec/views/with_count.erb +8 -0
  254. data/lib/capybara/spec/views/with_dragula.erb +22 -0
  255. data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
  256. data/lib/capybara/spec/views/with_hover.erb +24 -0
  257. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  258. data/lib/capybara/spec/views/with_html.erb +208 -0
  259. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  260. data/lib/capybara/spec/views/with_html_entities.erb +2 -0
  261. data/lib/capybara/spec/views/with_js.erb +160 -0
  262. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  263. data/lib/capybara/spec/views/with_namespace.erb +20 -0
  264. data/lib/capybara/spec/views/with_scope.erb +42 -0
  265. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  266. data/lib/capybara/spec/views/with_simple_html.erb +2 -0
  267. data/lib/capybara/spec/views/with_slow_unload.erb +17 -0
  268. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  269. data/lib/capybara/spec/views/with_title.erb +5 -0
  270. data/lib/capybara/spec/views/with_unload_alert.erb +14 -0
  271. data/lib/capybara/spec/views/with_windows.erb +54 -0
  272. data/lib/capybara/spec/views/within_frames.erb +15 -0
  273. data/lib/capybara/version.rb +5 -0
  274. data/lib/capybara/window.rb +146 -0
  275. data/spec/basic_node_spec.rb +154 -0
  276. data/spec/capybara_spec.rb +112 -0
  277. data/spec/css_builder_spec.rb +101 -0
  278. data/spec/css_splitter_spec.rb +38 -0
  279. data/spec/dsl_spec.rb +276 -0
  280. data/spec/filter_set_spec.rb +46 -0
  281. data/spec/fixtures/capybara.csv +1 -0
  282. data/spec/fixtures/certificate.pem +25 -0
  283. data/spec/fixtures/key.pem +27 -0
  284. data/spec/fixtures/selenium_driver_rspec_failure.rb +13 -0
  285. data/spec/fixtures/selenium_driver_rspec_success.rb +13 -0
  286. data/spec/minitest_spec.rb +163 -0
  287. data/spec/minitest_spec_spec.rb +162 -0
  288. data/spec/per_session_config_spec.rb +68 -0
  289. data/spec/rack_test_spec.rb +268 -0
  290. data/spec/regexp_dissassembler_spec.rb +250 -0
  291. data/spec/result_spec.rb +196 -0
  292. data/spec/rspec/features_spec.rb +99 -0
  293. data/spec/rspec/scenarios_spec.rb +19 -0
  294. data/spec/rspec/shared_spec_matchers.rb +947 -0
  295. data/spec/rspec/views_spec.rb +14 -0
  296. data/spec/rspec_matchers_spec.rb +62 -0
  297. data/spec/rspec_spec.rb +145 -0
  298. data/spec/sauce_spec_chrome.rb +43 -0
  299. data/spec/selector_spec.rb +513 -0
  300. data/spec/selenium_spec_chrome.rb +188 -0
  301. data/spec/selenium_spec_chrome_remote.rb +96 -0
  302. data/spec/selenium_spec_edge.rb +47 -0
  303. data/spec/selenium_spec_firefox.rb +208 -0
  304. data/spec/selenium_spec_firefox_remote.rb +80 -0
  305. data/spec/selenium_spec_ie.rb +150 -0
  306. data/spec/selenium_spec_safari.rb +148 -0
  307. data/spec/server_spec.rb +292 -0
  308. data/spec/session_spec.rb +91 -0
  309. data/spec/shared_selenium_node.rb +83 -0
  310. data/spec/shared_selenium_session.rb +476 -0
  311. data/spec/spec_helper.rb +100 -0
  312. data/spec/xpath_builder_spec.rb +93 -0
  313. metadata +753 -0
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#has_link?' do
4
+ before do
5
+ @session.visit('/with_html')
6
+ end
7
+
8
+ it 'should be true if the given link is on the page' do
9
+ expect(@session).to have_link('foo')
10
+ expect(@session).to have_link('awesome title')
11
+ expect(@session).to have_link('A link', href: '/with_simple_html')
12
+ expect(@session).to have_link(:'A link', href: :'/with_simple_html')
13
+ expect(@session).to have_link('A link', href: %r{/with_simple_html})
14
+ end
15
+
16
+ it 'should be false if the given link is not on the page' do
17
+ expect(@session).not_to have_link('monkey')
18
+ expect(@session).not_to have_link('A link', href: '/nonexistent-href')
19
+ expect(@session).not_to have_link('A link', href: /nonexistent/)
20
+ end
21
+ end
22
+
23
+ Capybara::SpecHelper.spec '#has_no_link?' do
24
+ before do
25
+ @session.visit('/with_html')
26
+ end
27
+
28
+ it 'should be false if the given link is on the page' do
29
+ expect(@session).not_to have_no_link('foo')
30
+ expect(@session).not_to have_no_link('awesome title')
31
+ expect(@session).not_to have_no_link('A link', href: '/with_simple_html')
32
+ end
33
+
34
+ it 'should be true if the given link is not on the page' do
35
+ expect(@session).to have_no_link('monkey')
36
+ expect(@session).to have_no_link('A link', href: '/nonexistent-href')
37
+ expect(@session).to have_no_link('A link', href: %r{/nonexistent-href})
38
+ end
39
+ end
@@ -0,0 +1,78 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#have_none_of_selectors' do
4
+ before do
5
+ @session.visit('/with_html')
6
+ end
7
+
8
+ it 'should be false if any of the given locators are on the page' do
9
+ expect do
10
+ expect(@session).to have_none_of_selectors(:xpath, '//p', '//a')
11
+ end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
12
+ expect do
13
+ expect(@session).to have_none_of_selectors(:css, 'p a#foo')
14
+ end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
15
+ end
16
+
17
+ it 'should be true if none of the given locators are on the page' do
18
+ expect(@session).to have_none_of_selectors(:xpath, '//abbr', '//td')
19
+ expect(@session).to have_none_of_selectors(:css, 'p a#doesnotexist', 'abbr')
20
+ end
21
+
22
+ it 'should use default selector' do
23
+ Capybara.default_selector = :css
24
+ expect(@session).to have_none_of_selectors('p a#doesnotexist', 'abbr')
25
+ expect do
26
+ expect(@session).to have_none_of_selectors('abbr', 'p a#foo')
27
+ end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
28
+ end
29
+
30
+ context 'should respect scopes' do
31
+ it 'when used with `within`' do
32
+ @session.within "//p[@id='first']" do
33
+ expect do
34
+ expect(@session).to have_none_of_selectors(".//a[@id='foo']")
35
+ end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
36
+ expect(@session).to have_none_of_selectors(".//a[@id='red']")
37
+ end
38
+ end
39
+
40
+ it 'when called on an element' do
41
+ el = @session.find "//p[@id='first']"
42
+ expect do
43
+ expect(el).to have_none_of_selectors(".//a[@id='foo']")
44
+ end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
45
+ expect(el).to have_none_of_selectors(".//a[@id='red']")
46
+ end
47
+ end
48
+
49
+ context 'with options' do
50
+ it 'should apply the options to all locators' do
51
+ expect do
52
+ expect(@session).to have_none_of_selectors('//p//a', text: 'Redirect')
53
+ end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
54
+ expect(@session).to have_none_of_selectors('//p', text: 'Doesnotexist')
55
+ end
56
+
57
+ it 'should discard all matches where the given regexp is matched' do
58
+ expect do
59
+ expect(@session).to have_none_of_selectors('//p//a', text: /re[dab]i/i, count: 1)
60
+ end.to raise_error ::RSpec::Expectations::ExpectationNotMetError
61
+ expect(@session).to have_none_of_selectors('//p//a', text: /Red$/)
62
+ end
63
+ end
64
+
65
+ context 'with wait', requires: [:js] do
66
+ it 'should not find elements if they appear after given wait duration' do
67
+ @session.visit('/with_js')
68
+ @session.click_link('Click me')
69
+ expect(@session).to have_none_of_selectors(:css, '#new_field', 'a#has-been-clicked', wait: 0.1)
70
+ end
71
+ end
72
+
73
+ it 'cannot be negated' do
74
+ expect do
75
+ expect(@session).not_to have_none_of_selectors(:css, 'p a#foo', 'h2#h2one', 'h2#h2two')
76
+ end.to raise_error ArgumentError
77
+ end
78
+ end
@@ -0,0 +1,310 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#has_select?' do
4
+ before { @session.visit('/form') }
5
+
6
+ it 'should be true if the field is on the page' do
7
+ expect(@session).to have_select('Locale')
8
+ expect(@session).to have_select('form_region')
9
+ expect(@session).to have_select('Languages')
10
+ expect(@session).to have_select(:Languages)
11
+ end
12
+
13
+ it 'should be false if the field is not on the page' do
14
+ expect(@session).not_to have_select('Monkey')
15
+ end
16
+
17
+ context 'with selected value' do
18
+ it 'should be true if a field with the given value is on the page' do
19
+ expect(@session).to have_select('form_locale', selected: 'English')
20
+ expect(@session).to have_select('Region', selected: 'Norway')
21
+ expect(@session).to have_select('Underwear', selected: [
22
+ 'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns'
23
+ ])
24
+ end
25
+
26
+ it 'should be false if the given field is not on the page' do
27
+ expect(@session).not_to have_select('Locale', selected: 'Swedish')
28
+ expect(@session).not_to have_select('Does not exist', selected: 'John')
29
+ expect(@session).not_to have_select('City', selected: 'Not there')
30
+ expect(@session).not_to have_select('Underwear', selected: [
31
+ 'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns', 'Nonexistent'
32
+ ])
33
+ expect(@session).not_to have_select('Underwear', selected: [
34
+ 'Boxerbriefs', 'Briefs', 'Boxers', 'Commando', "Frenchman's Pantalons", 'Long Johns'
35
+ ])
36
+ expect(@session).not_to have_select('Underwear', selected: [
37
+ 'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons"
38
+ ])
39
+ end
40
+
41
+ it 'should be true after the given value is selected' do
42
+ @session.select('Swedish', from: 'Locale')
43
+ expect(@session).to have_select('Locale', selected: 'Swedish')
44
+ end
45
+
46
+ it 'should be false after a different value is selected' do
47
+ @session.select('Swedish', from: 'Locale')
48
+ expect(@session).not_to have_select('Locale', selected: 'English')
49
+ end
50
+
51
+ it 'should be true after the given values are selected' do
52
+ @session.select('Boxers', from: 'Underwear')
53
+ expect(@session).to have_select('Underwear', selected: [
54
+ 'Boxerbriefs', 'Briefs', 'Boxers', 'Commando', "Frenchman's Pantalons", 'Long Johns'
55
+ ])
56
+ end
57
+
58
+ it 'should be false after one of the values is unselected' do
59
+ @session.unselect('Briefs', from: 'Underwear')
60
+ expect(@session).not_to have_select('Underwear', selected: [
61
+ 'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns'
62
+ ])
63
+ end
64
+
65
+ it "should be true even when the selected option invisible, regardless of the select's visibility" do
66
+ expect(@session).to have_select('Icecream', visible: false, selected: 'Chocolate')
67
+ expect(@session).to have_select('Sorbet', selected: 'Vanilla')
68
+ end
69
+ end
70
+
71
+ context 'with partial select' do
72
+ it 'should be true if a field with the given partial values is on the page' do
73
+ expect(@session).to have_select('Underwear', with_selected: %w[Boxerbriefs Briefs])
74
+ end
75
+
76
+ it 'should be false if a field with the given partial values is not on the page' do
77
+ expect(@session).not_to have_select('Underwear', with_selected: %w[Boxerbriefs Boxers])
78
+ end
79
+
80
+ it 'should be true after the given partial value is selected' do
81
+ @session.select('Boxers', from: 'Underwear')
82
+ expect(@session).to have_select('Underwear', with_selected: %w[Boxerbriefs Boxers])
83
+ end
84
+
85
+ it 'should be false after one of the given partial values is unselected' do
86
+ @session.unselect('Briefs', from: 'Underwear')
87
+ expect(@session).not_to have_select('Underwear', with_selected: %w[Boxerbriefs Briefs])
88
+ end
89
+
90
+ it "should be true even when the selected values are invisible, regardless of the select's visibility" do
91
+ expect(@session).to have_select('Dessert', visible: false, with_options: %w[Pudding Tiramisu])
92
+ expect(@session).to have_select('Cake', with_selected: ['Chocolate Cake', 'Sponge Cake'])
93
+ end
94
+
95
+ it 'should support non array partial values' do
96
+ expect(@session).to have_select('Underwear', with_selected: 'Briefs')
97
+ expect(@session).not_to have_select('Underwear', with_selected: 'Boxers')
98
+ end
99
+ end
100
+
101
+ context 'with exact options' do
102
+ it 'should be true if a field with the given options is on the page' do
103
+ expect(@session).to have_select('Region', options: %w[Norway Sweden Finland])
104
+ expect(@session).to have_select('Tendency', options: [])
105
+ end
106
+
107
+ it 'should be false if the given field is not on the page' do
108
+ expect(@session).not_to have_select('Locale', options: ['Swedish'])
109
+ expect(@session).not_to have_select('Does not exist', options: ['John'])
110
+ expect(@session).not_to have_select('City', options: ['London', 'Made up city'])
111
+ expect(@session).not_to have_select('Region', options: %w[Norway Sweden])
112
+ expect(@session).not_to have_select('Region', options: %w[Norway Norway Norway])
113
+ end
114
+
115
+ it 'should be true even when the options are invisible, if the select itself is invisible' do
116
+ expect(@session).to have_select('Icecream', visible: false, options: %w[Chocolate Vanilla Strawberry])
117
+ end
118
+ end
119
+
120
+ context 'with enabled options' do
121
+ it 'should be true if the listed options exist and are enabled' do
122
+ expect(@session).to have_select('form_title', enabled_options: %w[Mr Mrs Miss])
123
+ end
124
+
125
+ it 'should be false if the listed options do not exist' do
126
+ expect(@session).not_to have_select('form_title', enabled_options: ['Not there'])
127
+ end
128
+
129
+ it 'should be false if the listed option exists but is not enabled' do
130
+ expect(@session).not_to have_select('form_title', enabled_options: %w[Mr Mrs Miss Other])
131
+ end
132
+ end
133
+
134
+ context 'with disabled options' do
135
+ it 'should be true if the listed options exist and are disabled' do
136
+ expect(@session).to have_select('form_title', disabled_options: ['Other'])
137
+ end
138
+
139
+ it 'should be false if the listed options do not exist' do
140
+ expect(@session).not_to have_select('form_title', disabled_options: ['Not there'])
141
+ end
142
+
143
+ it 'should be false if the listed option exists but is not disabled' do
144
+ expect(@session).not_to have_select('form_title', disabled_options: %w[Other Mrs])
145
+ end
146
+ end
147
+
148
+ context 'with partial options' do
149
+ it 'should be true if a field with the given partial options is on the page' do
150
+ expect(@session).to have_select('Region', with_options: %w[Norway Sweden])
151
+ expect(@session).to have_select('City', with_options: ['London'])
152
+ end
153
+
154
+ it 'should be false if a field with the given partial options is not on the page' do
155
+ expect(@session).not_to have_select('Locale', with_options: ['Uruguayan'])
156
+ expect(@session).not_to have_select('Does not exist', with_options: ['John'])
157
+ expect(@session).not_to have_select('Region', with_options: %w[Norway Sweden Finland Latvia])
158
+ end
159
+
160
+ it 'should be true even when the options are invisible, if the select itself is invisible' do
161
+ expect(@session).to have_select('Icecream', visible: false, with_options: %w[Vanilla Strawberry])
162
+ end
163
+ end
164
+
165
+ context 'with multiple option' do
166
+ it 'should find multiple selects if true' do
167
+ expect(@session).to have_select('form_languages', multiple: true)
168
+ expect(@session).not_to have_select('form_other_title', multiple: true)
169
+ end
170
+
171
+ it 'should not find multiple selects if false' do
172
+ expect(@session).not_to have_select('form_languages', multiple: false)
173
+ expect(@session).to have_select('form_other_title', multiple: false)
174
+ end
175
+
176
+ it 'should find both if not specified' do
177
+ expect(@session).to have_select('form_languages')
178
+ expect(@session).to have_select('form_other_title')
179
+ end
180
+ end
181
+
182
+ it 'should support locator-less usage' do
183
+ expect(@session.has_select?(with_options: %w[Norway Sweden])).to eq true
184
+ expect(@session).to have_select(with_options: ['London'])
185
+ expect(@session.has_select?(with_selected: %w[Commando Boxerbriefs])).to eq true
186
+ expect(@session).to have_select(with_selected: ['Briefs'])
187
+ end
188
+ end
189
+
190
+ Capybara::SpecHelper.spec '#has_no_select?' do
191
+ before { @session.visit('/form') }
192
+
193
+ it 'should be false if the field is on the page' do
194
+ expect(@session).not_to have_no_select('Locale')
195
+ expect(@session).not_to have_no_select('form_region')
196
+ expect(@session).not_to have_no_select('Languages')
197
+ end
198
+
199
+ it 'should be true if the field is not on the page' do
200
+ expect(@session).to have_no_select('Monkey')
201
+ end
202
+
203
+ context 'with selected value' do
204
+ it 'should be false if a field with the given value is on the page' do
205
+ expect(@session).not_to have_no_select('form_locale', selected: 'English')
206
+ expect(@session).not_to have_no_select('Region', selected: 'Norway')
207
+ expect(@session).not_to have_no_select('Underwear', selected: [
208
+ 'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns'
209
+ ])
210
+ end
211
+
212
+ it 'should be true if the given field is not on the page' do
213
+ expect(@session).to have_no_select('Locale', selected: 'Swedish')
214
+ expect(@session).to have_no_select('Does not exist', selected: 'John')
215
+ expect(@session).to have_no_select('City', selected: 'Not there')
216
+ expect(@session).to have_no_select('Underwear', selected: [
217
+ 'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns', 'Nonexistent'
218
+ ])
219
+ expect(@session).to have_no_select('Underwear', selected: [
220
+ 'Boxerbriefs', 'Briefs', 'Boxers', 'Commando', "Frenchman's Pantalons", 'Long Johns'
221
+ ])
222
+ expect(@session).to have_no_select('Underwear', selected: [
223
+ 'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons"
224
+ ])
225
+ end
226
+
227
+ it 'should be false after the given value is selected' do
228
+ @session.select('Swedish', from: 'Locale')
229
+ expect(@session).not_to have_no_select('Locale', selected: 'Swedish')
230
+ end
231
+
232
+ it 'should be true after a different value is selected' do
233
+ @session.select('Swedish', from: 'Locale')
234
+ expect(@session).to have_no_select('Locale', selected: 'English')
235
+ end
236
+
237
+ it 'should be false after the given values are selected' do
238
+ @session.select('Boxers', from: 'Underwear')
239
+ expect(@session).not_to have_no_select('Underwear', selected: [
240
+ 'Boxerbriefs', 'Briefs', 'Boxers', 'Commando', "Frenchman's Pantalons", 'Long Johns'
241
+ ])
242
+ end
243
+
244
+ it 'should be true after one of the values is unselected' do
245
+ @session.unselect('Briefs', from: 'Underwear')
246
+ expect(@session).to have_no_select('Underwear', selected: [
247
+ 'Boxerbriefs', 'Briefs', 'Commando', "Frenchman's Pantalons", 'Long Johns'
248
+ ])
249
+ end
250
+ end
251
+
252
+ context 'with partial select' do
253
+ it 'should be false if a field with the given partial values is on the page' do
254
+ expect(@session).not_to have_no_select('Underwear', with_selected: %w[Boxerbriefs Briefs])
255
+ end
256
+
257
+ it 'should be true if a field with the given partial values is not on the page' do
258
+ expect(@session).to have_no_select('Underwear', with_selected: %w[Boxerbriefs Boxers])
259
+ end
260
+
261
+ it 'should be false after the given partial value is selected' do
262
+ @session.select('Boxers', from: 'Underwear')
263
+ expect(@session).not_to have_no_select('Underwear', with_selected: %w[Boxerbriefs Boxers])
264
+ end
265
+
266
+ it 'should be true after one of the given partial values is unselected' do
267
+ @session.unselect('Briefs', from: 'Underwear')
268
+ expect(@session).to have_no_select('Underwear', with_selected: %w[Boxerbriefs Briefs])
269
+ end
270
+
271
+ it 'should support non array partial values' do
272
+ expect(@session).not_to have_no_select('Underwear', with_selected: 'Briefs')
273
+ expect(@session).to have_no_select('Underwear', with_selected: 'Boxers')
274
+ end
275
+ end
276
+
277
+ context 'with exact options' do
278
+ it 'should be false if a field with the given options is on the page' do
279
+ expect(@session).not_to have_no_select('Region', options: %w[Norway Sweden Finland])
280
+ end
281
+
282
+ it 'should be true if the given field is not on the page' do
283
+ expect(@session).to have_no_select('Locale', options: ['Swedish'])
284
+ expect(@session).to have_no_select('Does not exist', options: ['John'])
285
+ expect(@session).to have_no_select('City', options: ['London', 'Made up city'])
286
+ expect(@session).to have_no_select('Region', options: %w[Norway Sweden])
287
+ expect(@session).to have_no_select('Region', options: %w[Norway Norway Norway])
288
+ end
289
+ end
290
+
291
+ context 'with partial options' do
292
+ it 'should be false if a field with the given partial options is on the page' do
293
+ expect(@session).not_to have_no_select('Region', with_options: %w[Norway Sweden])
294
+ expect(@session).not_to have_no_select('City', with_options: ['London'])
295
+ end
296
+
297
+ it 'should be true if a field with the given partial options is not on the page' do
298
+ expect(@session).to have_no_select('Locale', with_options: ['Uruguayan'])
299
+ expect(@session).to have_no_select('Does not exist', with_options: ['John'])
300
+ expect(@session).to have_no_select('Region', with_options: %w[Norway Sweden Finland Latvia])
301
+ end
302
+ end
303
+
304
+ it 'should support locator-less usage' do
305
+ expect(@session.has_no_select?(with_options: %w[Norway Sweden Finland Latvia])).to eq true
306
+ expect(@session).to have_no_select(with_options: ['New London'])
307
+ expect(@session.has_no_select?(id: 'form_underwear', with_selected: ['Boxers'])).to eq true
308
+ expect(@session).to have_no_select(id: 'form_underwear', with_selected: %w[Commando Boxers])
309
+ end
310
+ end
@@ -0,0 +1,202 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#has_selector?' do
4
+ before do
5
+ @session.visit('/with_html')
6
+ end
7
+
8
+ it 'should be true if the given selector is on the page' do
9
+ expect(@session).to have_selector(:xpath, '//p')
10
+ expect(@session).to have_selector(:css, 'p a#foo')
11
+ expect(@session).to have_selector("//p[contains(.,'est')]")
12
+ end
13
+
14
+ it 'should be false if the given selector is not on the page' do
15
+ expect(@session).not_to have_selector(:xpath, '//abbr')
16
+ expect(@session).not_to have_selector(:css, 'p a#doesnotexist')
17
+ expect(@session).not_to have_selector("//p[contains(.,'thisstringisnotonpage')]")
18
+ end
19
+
20
+ it 'should use default selector' do
21
+ Capybara.default_selector = :css
22
+ expect(@session).not_to have_selector('p a#doesnotexist')
23
+ expect(@session).to have_selector('p a#foo')
24
+ end
25
+
26
+ it 'should respect scopes' do
27
+ @session.within "//p[@id='first']" do
28
+ expect(@session).to have_selector(".//a[@id='foo']")
29
+ expect(@session).not_to have_selector(".//a[@id='red']")
30
+ end
31
+ end
32
+
33
+ it 'should accept a filter block' do
34
+ expect(@session).to have_selector(:css, 'a', count: 1) { |el| el[:id] == 'foo' }
35
+ end
36
+
37
+ context 'with count' do
38
+ it 'should be true if the content is on the page the given number of times' do
39
+ expect(@session).to have_selector('//p', count: 3)
40
+ expect(@session).to have_selector("//p//a[@id='foo']", count: 1)
41
+ expect(@session).to have_selector("//p[contains(.,'est')]", count: 1)
42
+ end
43
+
44
+ it 'should be false if the content is on the page the given number of times' do
45
+ expect(@session).not_to have_selector('//p', count: 6)
46
+ expect(@session).not_to have_selector("//p//a[@id='foo']", count: 2)
47
+ expect(@session).not_to have_selector("//p[contains(.,'est')]", count: 5)
48
+ end
49
+
50
+ it "should be false if the content isn't on the page at all" do
51
+ expect(@session).not_to have_selector('//abbr', count: 2)
52
+ expect(@session).not_to have_selector("//p//a[@id='doesnotexist']", count: 1)
53
+ end
54
+ end
55
+
56
+ context 'with text' do
57
+ it 'should discard all matches where the given string is not contained' do
58
+ expect(@session).to have_selector('//p//a', text: 'Redirect', count: 1)
59
+ expect(@session).to have_selector(:css, 'p a', text: 'Redirect', count: 1)
60
+ expect(@session).not_to have_selector('//p', text: 'Doesnotexist')
61
+ end
62
+
63
+ it 'should respect visibility setting' do
64
+ expect(@session).to have_selector(:id, 'hidden-text', text: 'Some of this text is hidden!', visible: false)
65
+ expect(@session).not_to have_selector(:id, 'hidden-text', text: 'Some of this text is hidden!', visible: true)
66
+ Capybara.ignore_hidden_elements = false
67
+ expect(@session).to have_selector(:id, 'hidden-text', text: 'Some of this text is hidden!', visible: false)
68
+ Capybara.visible_text_only = true
69
+ expect(@session).not_to have_selector(:id, 'hidden-text', text: 'Some of this text is hidden!', visible: true)
70
+ end
71
+
72
+ it 'should discard all matches where the given regexp is not matched' do
73
+ expect(@session).to have_selector('//p//a', text: /re[dab]i/i, count: 1)
74
+ expect(@session).not_to have_selector('//p//a', text: /Red$/)
75
+ end
76
+
77
+ it 'should raise when extra parameters passed' do
78
+ expect do
79
+ expect(@session).to have_selector(:css, 'p a#foo', 'extra')
80
+ end.to raise_error ArgumentError, /extra/
81
+ end
82
+
83
+ context 'with whitespace normalization' do
84
+ context 'Capybara.default_normalize_ws = false' do
85
+ it 'should support normalize_ws option' do
86
+ Capybara.default_normalize_ws = false
87
+ expect(@session).not_to have_selector(:id, 'second', text: 'text with whitespace')
88
+ expect(@session).to have_selector(:id, 'second', text: 'text with whitespace', normalize_ws: true)
89
+ end
90
+ end
91
+
92
+ context 'Capybara.default_normalize_ws = true' do
93
+ it 'should support normalize_ws option' do
94
+ Capybara.default_normalize_ws = true
95
+ expect(@session).to have_selector(:id, 'second', text: 'text with whitespace')
96
+ expect(@session).not_to have_selector(:id, 'second', text: 'text with whitespace', normalize_ws: false)
97
+ end
98
+ end
99
+ end
100
+ end
101
+
102
+ context 'with exact_text' do
103
+ context 'string' do
104
+ it 'should only match elements that match exactly' do
105
+ expect(@session).to have_selector(:id, 'h2one', exact_text: 'Header Class Test One')
106
+ expect(@session).to have_no_selector(:id, 'h2one', exact_text: 'Header Class Test')
107
+ end
108
+ end
109
+
110
+ context 'boolean' do
111
+ it 'should only match elements that match exactly when true' do
112
+ expect(@session).to have_selector(:id, 'h2one', text: 'Header Class Test One', exact_text: true)
113
+ expect(@session).to have_no_selector(:id, 'h2one', text: 'Header Class Test', exact_text: true)
114
+ end
115
+
116
+ it 'should match substrings when false' do
117
+ expect(@session).to have_selector(:id, 'h2one', text: 'Header Class Test One', exact_text: false)
118
+ expect(@session).to have_selector(:id, 'h2one', text: 'Header Class Test', exact_text: false)
119
+ end
120
+ end
121
+ end
122
+
123
+ context 'datalist' do
124
+ it 'should match options' do
125
+ @session.visit('/form')
126
+ expect(@session).to have_selector(:datalist_input, with_options: %w[Jaguar Audi Mercedes])
127
+ expect(@session).not_to have_selector(:datalist_input, with_options: %w[Ford Chevy])
128
+ end
129
+ end
130
+ end
131
+
132
+ Capybara::SpecHelper.spec '#has_no_selector?' do
133
+ before do
134
+ @session.visit('/with_html')
135
+ end
136
+
137
+ it 'should be false if the given selector is on the page' do
138
+ expect(@session).not_to have_no_selector(:xpath, '//p')
139
+ expect(@session).not_to have_no_selector(:css, 'p a#foo')
140
+ expect(@session).not_to have_no_selector("//p[contains(.,'est')]")
141
+ end
142
+
143
+ it 'should be true if the given selector is not on the page' do
144
+ expect(@session).to have_no_selector(:xpath, '//abbr')
145
+ expect(@session).to have_no_selector(:css, 'p a#doesnotexist')
146
+ expect(@session).to have_no_selector("//p[contains(.,'thisstringisnotonpage')]")
147
+ end
148
+
149
+ it 'should use default selector' do
150
+ Capybara.default_selector = :css
151
+ expect(@session).to have_no_selector('p a#doesnotexist')
152
+ expect(@session).not_to have_no_selector('p a#foo')
153
+ end
154
+
155
+ it 'should respect scopes' do
156
+ @session.within "//p[@id='first']" do
157
+ expect(@session).not_to have_no_selector(".//a[@id='foo']")
158
+ expect(@session).to have_no_selector(".//a[@id='red']")
159
+ end
160
+ end
161
+
162
+ it 'should accept a filter block' do
163
+ expect(@session).to have_no_selector(:css, 'a#foo') { |el| el[:id] != 'foo' }
164
+ end
165
+
166
+ context 'with count' do
167
+ it 'should be false if the content is on the page the given number of times' do
168
+ expect(@session).not_to have_no_selector('//p', count: 3)
169
+ expect(@session).not_to have_no_selector("//p//a[@id='foo']", count: 1)
170
+ expect(@session).not_to have_no_selector("//p[contains(.,'est')]", count: 1)
171
+ end
172
+
173
+ it 'should be true if the content is on the page the wrong number of times' do
174
+ expect(@session).to have_no_selector('//p', count: 6)
175
+ expect(@session).to have_no_selector("//p//a[@id='foo']", count: 2)
176
+ expect(@session).to have_no_selector("//p[contains(.,'est')]", count: 5)
177
+ end
178
+
179
+ it "should be true if the content isn't on the page at all" do
180
+ expect(@session).to have_no_selector('//abbr', count: 2)
181
+ expect(@session).to have_no_selector("//p//a[@id='doesnotexist']", count: 1)
182
+ end
183
+ end
184
+
185
+ context 'with text' do
186
+ it 'should discard all matches where the given string is contained' do
187
+ expect(@session).not_to have_no_selector('//p//a', text: 'Redirect', count: 1)
188
+ expect(@session).to have_no_selector('//p', text: 'Doesnotexist')
189
+ end
190
+
191
+ it 'should discard all matches where the given regexp is matched' do
192
+ expect(@session).not_to have_no_selector('//p//a', text: /re[dab]i/i, count: 1)
193
+ expect(@session).to have_no_selector('//p//a', text: /Red$/)
194
+ end
195
+
196
+ it 'should error when matching element exists' do
197
+ expect do
198
+ expect(@session).to have_no_selector('//h2', text: 'Header Class Test Five')
199
+ end.to raise_error RSpec::Expectations::ExpectationNotMetError
200
+ end
201
+ end
202
+ end