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,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#sibling' do
4
+ before do
5
+ @session.visit('/with_html')
6
+ end
7
+
8
+ after do
9
+ Capybara::Selector.remove(:monkey)
10
+ end
11
+
12
+ it 'should find a prior sibling element using the given locator' do
13
+ el = @session.find(:css, '#mid_sibling')
14
+ expect(el.sibling('//div[@data-pre]')[:id]).to eq('pre_sibling')
15
+ end
16
+
17
+ it 'should find a following sibling element using the given locator' do
18
+ el = @session.find(:css, '#mid_sibling')
19
+ expect(el.sibling('//div[@data-post]')[:id]).to eq('post_sibling')
20
+ end
21
+
22
+ it 'should raise an error if there are multiple matches' do
23
+ el = @session.find(:css, '#mid_sibling')
24
+ expect { el.sibling('//div') }.to raise_error(Capybara::Ambiguous)
25
+ end
26
+
27
+ context 'with css selectors' do
28
+ it 'should find the first element using the given locator' do
29
+ el = @session.find(:css, '#mid_sibling')
30
+ expect(el.sibling(:css, '#pre_sibling')).to have_text('Pre Sibling')
31
+ expect(el.sibling(:css, '#post_sibling')).to have_text('Post Sibling')
32
+ end
33
+ end
34
+
35
+ context 'with custom selector' do
36
+ it 'should use the custom selector' do
37
+ Capybara.add_selector(:data_attribute) do
38
+ xpath { |attr| ".//*[@data-#{attr}]" }
39
+ end
40
+ el = @session.find(:css, '#mid_sibling')
41
+ expect(el.sibling(:data_attribute, 'pre').text).to eq('Pre Sibling')
42
+ expect(el.sibling(:data_attribute, 'post').text).to eq('Post Sibling')
43
+ end
44
+ end
45
+
46
+ it 'should raise ElementNotFound with a useful default message if nothing was found' do
47
+ el = @session.find(:css, '#child')
48
+ expect do
49
+ el.sibling(:xpath, '//div[@id="nosuchthing"]')
50
+ end.to raise_error(Capybara::ElementNotFound, 'Unable to find xpath "//div[@id=\\"nosuchthing\\"]" that is a sibling of visible css "#child"')
51
+ end
52
+ end
@@ -0,0 +1,74 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#text' do
4
+ it 'should print the text of the page' do
5
+ @session.visit('/with_simple_html')
6
+ expect(@session.text).to eq('Bar')
7
+ end
8
+
9
+ it 'ignores invisible text by default' do
10
+ @session.visit('/with_html')
11
+ expect(@session.find(:id, 'hidden-text').text).to eq('Some of this text is')
12
+ end
13
+
14
+ it 'shows invisible text if `:all` given' do
15
+ @session.visit('/with_html')
16
+ expect(@session.find(:id, 'hidden-text').text(:all)).to eq('Some of this text is hidden!')
17
+ end
18
+
19
+ it 'ignores invisible text if `:visible` given' do
20
+ Capybara.ignore_hidden_elements = false
21
+ @session.visit('/with_html')
22
+ expect(@session.find(:id, 'hidden-text').text(:visible)).to eq('Some of this text is')
23
+ end
24
+
25
+ it 'ignores invisible text if `Capybara.ignore_hidden_elements = true`' do
26
+ @session.visit('/with_html')
27
+ expect(@session.find(:id, 'hidden-text').text).to eq('Some of this text is')
28
+ Capybara.ignore_hidden_elements = false
29
+ expect(@session.find(:id, 'hidden-text').text).to eq('Some of this text is hidden!')
30
+ end
31
+
32
+ it 'ignores invisible text if `Capybara.visible_text_only = true`' do
33
+ @session.visit('/with_html')
34
+ Capybara.visible_text_only = true
35
+ expect(@session.find(:id, 'hidden-text').text).to eq('Some of this text is')
36
+ Capybara.ignore_hidden_elements = false
37
+ expect(@session.find(:id, 'hidden-text').text).to eq('Some of this text is')
38
+ end
39
+
40
+ it 'ignores invisible text if ancestor is invisible' do
41
+ @session.visit('/with_html')
42
+ expect(@session.find(:id, 'hidden_via_ancestor', visible: false).text).to eq('')
43
+ end
44
+
45
+ context 'with css as default selector' do
46
+ before { Capybara.default_selector = :css }
47
+
48
+ after { Capybara.default_selector = :xpath }
49
+
50
+ it 'should print the text of the page' do
51
+ @session.visit('/with_simple_html')
52
+ expect(@session.text).to eq('Bar')
53
+ end
54
+ end
55
+
56
+ it 'should be correctly normalized when visible' do
57
+ @session.visit('/with_html')
58
+ el = @session.find(:css, '#normalized')
59
+ expect(el.text).to eq "Some text\nMore text\nAnd more text\nEven more text on multiple lines"
60
+ end
61
+
62
+ it 'should be a textContent with irrelevant whitespace collapsed when non-visible' do
63
+ @session.visit('/with_html')
64
+ el = @session.find(:css, '#non_visible_normalized', visible: false)
65
+ expect(el.text(:all)).to eq 'Some textMore text And more text Even more text on multiple lines'
66
+ end
67
+
68
+ it 'should strip correctly' do
69
+ @session.visit('/with_html')
70
+ el = @session.find(:css, '#ws')
71
+ expect(el.text).to eq ' '
72
+ expect(el.text(:all)).to eq ' '
73
+ end
74
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#title' do
4
+ it 'should get the title of the page' do
5
+ @session.visit('/with_title')
6
+ expect(@session.title).to eq('Test Title')
7
+ end
8
+
9
+ context 'with css as default selector' do
10
+ before { Capybara.default_selector = :css }
11
+
12
+ after { Capybara.default_selector = :xpath }
13
+
14
+ it 'should get the title of the page' do
15
+ @session.visit('/with_title')
16
+ expect(@session.title).to eq('Test Title')
17
+ end
18
+ end
19
+
20
+ context 'within iframe', requires: [:frames] do
21
+ it 'should get the title of the top level browsing context' do
22
+ @session.visit('/within_frames')
23
+ expect(@session.title).to eq('With Frames')
24
+ @session.within_frame('frameOne') do
25
+ expect(@session.title).to eq('With Frames')
26
+ end
27
+ end
28
+ end
29
+ end
@@ -0,0 +1,100 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#uncheck' do
4
+ before do
5
+ @session.visit('/form')
6
+ end
7
+
8
+ it 'should uncheck a checkbox by id' do
9
+ @session.uncheck('form_pets_hamster')
10
+ @session.click_button('awesome')
11
+ expect(extract_results(@session)['pets']).to include('dog')
12
+ expect(extract_results(@session)['pets']).not_to include('hamster')
13
+ end
14
+
15
+ it 'should uncheck a checkbox by label' do
16
+ @session.uncheck('Hamster')
17
+ @session.click_button('awesome')
18
+ expect(extract_results(@session)['pets']).to include('dog')
19
+ expect(extract_results(@session)['pets']).not_to include('hamster')
20
+ end
21
+
22
+ it 'should work without a locator string' do
23
+ @session.uncheck(id: 'form_pets_hamster')
24
+ @session.click_button('awesome')
25
+ expect(extract_results(@session)['pets']).to include('dog')
26
+ expect(extract_results(@session)['pets']).not_to include('hamster')
27
+ end
28
+
29
+ it 'should be able to uncheck itself if no locator specified' do
30
+ cb = @session.find(:id, 'form_pets_hamster')
31
+ cb.uncheck
32
+ @session.click_button('awesome')
33
+ expect(extract_results(@session)['pets']).to include('dog')
34
+ expect(extract_results(@session)['pets']).not_to include('hamster')
35
+ end
36
+
37
+ it 'casts to string' do
38
+ @session.uncheck(:form_pets_hamster)
39
+ @session.click_button('awesome')
40
+ expect(extract_results(@session)['pets']).to include('dog')
41
+ expect(extract_results(@session)['pets']).not_to include('hamster')
42
+ end
43
+
44
+ context 'with :exact option' do
45
+ it 'should accept partial matches when false' do
46
+ @session.uncheck('Ham', exact: false)
47
+ @session.click_button('awesome')
48
+ expect(extract_results(@session)['pets']).not_to include('hamster')
49
+ end
50
+
51
+ it 'should not accept partial matches when true' do
52
+ expect do
53
+ @session.uncheck('Ham', exact: true)
54
+ end.to raise_error(Capybara::ElementNotFound)
55
+ end
56
+ end
57
+
58
+ context 'when checkbox hidden' do
59
+ context 'with Capybara.automatic_label_click == true' do
60
+ around do |spec|
61
+ old_click_label, Capybara.automatic_label_click = Capybara.automatic_label_click, true
62
+ spec.run
63
+ Capybara.automatic_label_click = old_click_label
64
+ end
65
+
66
+ it 'should uncheck via clicking the label with :for attribute if possible' do
67
+ expect(@session.find(:checkbox, 'form_cars_jaguar', checked: true, visible: :hidden)).to be_truthy
68
+ @session.uncheck('form_cars_jaguar')
69
+ @session.click_button('awesome')
70
+ expect(extract_results(@session)['cars']).not_to include('jaguar')
71
+ end
72
+
73
+ it 'should uncheck via clicking the wrapping label if possible' do
74
+ expect(@session.find(:checkbox, 'form_cars_koenigsegg', checked: true, visible: :hidden)).to be_truthy
75
+ @session.uncheck('form_cars_koenigsegg')
76
+ @session.click_button('awesome')
77
+ expect(extract_results(@session)['cars']).not_to include('koenigsegg')
78
+ end
79
+
80
+ it 'should not click the label if unneeded' do
81
+ expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be_truthy
82
+ @session.uncheck('form_cars_tesla')
83
+ @session.click_button('awesome')
84
+ expect(extract_results(@session)['cars']).not_to include('tesla')
85
+ end
86
+
87
+ it 'should raise original error when no label available' do
88
+ expect { @session.uncheck('form_cars_porsche') }.to raise_error(Capybara::ElementNotFound, /Unable to find visible checkbox "form_cars_porsche"/)
89
+ end
90
+
91
+ it 'should raise error if not allowed to click label' do
92
+ expect { @session.uncheck('form_cars_jaguar', allow_label_click: false) }.to raise_error(Capybara::ElementNotFound, /Unable to find visible checkbox "form_cars_jaguar"/)
93
+ end
94
+
95
+ it 'should include node filter description in error if necessary' do
96
+ expect { @session.uncheck('form_cars_maserati', allow_label_click: false) }.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_maserati" that is not disabled')
97
+ end
98
+ end
99
+ end
100
+ end
@@ -0,0 +1,116 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#unselect' do
4
+ before do
5
+ @session.visit('/form')
6
+ end
7
+
8
+ context 'with multiple select' do
9
+ it 'should unselect an option from a select box by id' do
10
+ @session.unselect('Commando', from: 'form_underwear')
11
+ @session.click_button('awesome')
12
+ expect(extract_results(@session)['underwear']).to include('Briefs', 'Boxerbriefs')
13
+ expect(extract_results(@session)['underwear']).not_to include('Commando')
14
+ end
15
+
16
+ it 'should unselect an option without a select box' do
17
+ @session.unselect('Commando')
18
+ @session.click_button('awesome')
19
+ expect(extract_results(@session)['underwear']).to include('Briefs', 'Boxerbriefs')
20
+ expect(extract_results(@session)['underwear']).not_to include('Commando')
21
+ end
22
+
23
+ it 'should unselect an option from a select box by label' do
24
+ @session.unselect('Commando', from: 'Underwear')
25
+ @session.click_button('awesome')
26
+ expect(extract_results(@session)['underwear']).to include('Briefs', 'Boxerbriefs')
27
+ expect(extract_results(@session)['underwear']).not_to include('Commando')
28
+ end
29
+
30
+ it 'should favour exact matches to option labels' do
31
+ @session.unselect('Briefs', from: 'Underwear')
32
+ @session.click_button('awesome')
33
+ expect(extract_results(@session)['underwear']).to include('Commando', 'Boxerbriefs')
34
+ expect(extract_results(@session)['underwear']).not_to include('Briefs')
35
+ end
36
+
37
+ it 'should escape quotes' do
38
+ @session.unselect("Frenchman's Pantalons", from: 'Underwear')
39
+ @session.click_button('awesome')
40
+ expect(extract_results(@session)['underwear']).not_to include("Frenchman's Pantalons")
41
+ end
42
+
43
+ it 'casts to string' do
44
+ @session.unselect(:Briefs, from: :Underwear)
45
+ @session.click_button('awesome')
46
+ expect(extract_results(@session)['underwear']).to include('Commando', 'Boxerbriefs')
47
+ expect(extract_results(@session)['underwear']).not_to include('Briefs')
48
+ end
49
+ end
50
+
51
+ context 'with single select' do
52
+ it 'should raise an error' do
53
+ expect { @session.unselect('English', from: 'form_locale') }.to raise_error(Capybara::UnselectNotAllowed)
54
+ end
55
+ end
56
+
57
+ context "with a locator that doesn't exist" do
58
+ it 'should raise an error' do
59
+ msg = /Unable to find select box "does not exist"/
60
+ expect do
61
+ @session.unselect('foo', from: 'does not exist')
62
+ end.to raise_error(Capybara::ElementNotFound, msg)
63
+ end
64
+ end
65
+
66
+ context "with an option that doesn't exist" do
67
+ it 'should raise an error' do
68
+ msg = /^Unable to find option "Does not Exist" within/
69
+ expect do
70
+ @session.unselect('Does not Exist', from: 'form_underwear')
71
+ end.to raise_error(Capybara::ElementNotFound, msg)
72
+ end
73
+ end
74
+
75
+ context 'with :exact option' do
76
+ context 'when `false`' do
77
+ it 'can match select box approximately' do
78
+ @session.unselect('Boxerbriefs', from: 'Under', exact: false)
79
+ @session.click_button('awesome')
80
+ expect(extract_results(@session)['underwear']).not_to include('Boxerbriefs')
81
+ end
82
+
83
+ it 'can match option approximately' do
84
+ @session.unselect('Boxerbr', from: 'Underwear', exact: false)
85
+ @session.click_button('awesome')
86
+ expect(extract_results(@session)['underwear']).not_to include('Boxerbriefs')
87
+ end
88
+
89
+ it 'can match option approximately when :from not given' do
90
+ @session.unselect('Boxerbr', exact: false)
91
+ @session.click_button('awesome')
92
+ expect(extract_results(@session)['underwear']).not_to include('Boxerbriefs')
93
+ end
94
+ end
95
+
96
+ context 'when `true`' do
97
+ it 'can match select box approximately' do
98
+ expect do
99
+ @session.unselect('Boxerbriefs', from: 'Under', exact: true)
100
+ end.to raise_error(Capybara::ElementNotFound)
101
+ end
102
+
103
+ it 'can match option approximately' do
104
+ expect do
105
+ @session.unselect('Boxerbr', from: 'Underwear', exact: true)
106
+ end.to raise_error(Capybara::ElementNotFound)
107
+ end
108
+
109
+ it 'can match option approximately when :from not given' do
110
+ expect do
111
+ @session.unselect('Boxerbr', exact: true)
112
+ end.to raise_error(Capybara::ElementNotFound)
113
+ end
114
+ end
115
+ end
116
+ end
@@ -0,0 +1,204 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#visit' do
4
+ it 'should fetch a response from the driver with a relative url' do
5
+ @session.visit('/')
6
+ expect(@session).to have_content('Hello world!')
7
+ @session.visit('/foo')
8
+ expect(@session).to have_content('Another World')
9
+ end
10
+
11
+ it 'should fetch a response from the driver with an absolute url with a port' do
12
+ # Preparation
13
+ @session.visit('/')
14
+ root_uri = URI.parse(@session.current_url)
15
+
16
+ @session.visit("http://#{root_uri.host}:#{root_uri.port}/")
17
+ expect(@session).to have_content('Hello world!')
18
+ @session.visit("http://#{root_uri.host}:#{root_uri.port}/foo")
19
+ expect(@session).to have_content('Another World')
20
+ end
21
+
22
+ it "should fetch a response when absolute URI doesn't have a trailing slash" do
23
+ # Preparation
24
+ @session.visit('/foo/bar')
25
+ root_uri = URI.parse(@session.current_url)
26
+
27
+ @session.visit("http://#{root_uri.host}:#{root_uri.port}")
28
+ expect(@session).to have_content('Hello world!')
29
+ end
30
+
31
+ it 'should fetch a response when sequentially visiting same destination with a target' do
32
+ @session.visit('/form')
33
+ expect(@session).to have_css('#form_title')
34
+ @session.visit('/form#form_title')
35
+ expect(@session).to have_css('#form_title')
36
+ end
37
+
38
+ it 'raises any errors caught inside the server', requires: [:server] do
39
+ quietly { @session.visit('/error') }
40
+ expect do
41
+ @session.visit('/')
42
+ end.to raise_error(TestApp::TestAppError)
43
+ end
44
+
45
+ it 'should be able to open non-http url', requires: [:about_scheme] do
46
+ @session.visit('about:blank')
47
+ @session.assert_no_selector :xpath, '/html/body/*'
48
+ end
49
+
50
+ context 'when Capybara.always_include_port is true' do
51
+ let(:root_uri) do
52
+ @session.visit('/')
53
+ URI.parse(@session.current_url)
54
+ end
55
+
56
+ before do
57
+ Capybara.always_include_port = true
58
+ end
59
+
60
+ after do
61
+ Capybara.always_include_port = false
62
+ end
63
+
64
+ it 'should fetch a response from the driver with an absolute url without a port' do
65
+ @session.visit("http://#{root_uri.host}/")
66
+ expect(URI.parse(@session.current_url).port).to eq(root_uri.port)
67
+ expect(@session).to have_content('Hello world!')
68
+
69
+ @session.visit("http://#{root_uri.host}/foo")
70
+ expect(URI.parse(@session.current_url).port).to eq(root_uri.port)
71
+ expect(@session).to have_content('Another World')
72
+ end
73
+
74
+ it 'should add the server port to a visited url if no port specified', requires: [:server] do
75
+ allow(@session.driver).to receive(:visit)
76
+ @session.visit('http://www.example.com')
77
+ expect(@session.driver).to have_received(:visit).with("http://www.example.com:#{@session.server.port}")
78
+ end
79
+
80
+ it 'should not override the visit specified port even if default for scheme', requires: [:server] do
81
+ allow(@session.driver).to receive(:visit)
82
+ @session.visit('http://www.example.com:80')
83
+ expect(@session.driver).to have_received(:visit).with('http://www.example.com:80')
84
+ end
85
+
86
+ it 'should give preference to app_host port if specified', requires: [:server] do
87
+ allow(@session.driver).to receive(:visit)
88
+ Capybara.app_host = 'http://www.example.com:6666'
89
+ @session.visit('/random')
90
+ expect(@session.driver).to have_received(:visit).with('http://www.example.com:6666/random')
91
+ end
92
+
93
+ it "shouldn't override port if no server", requires: [:server] do
94
+ session = Capybara::Session.new(@session.mode, nil)
95
+ allow(session.driver).to receive(:visit)
96
+ session.visit('http://www.google.com')
97
+ expect(session.driver).to have_received(:visit).with('http://www.google.com')
98
+ end
99
+
100
+ it "shouldn't override port if no server but app_host is set", requires: [:server] do
101
+ session = Capybara::Session.new(@session.mode, nil)
102
+ Capybara.app_host = 'http://www.example.com:6666'
103
+ allow(session.driver).to receive(:visit)
104
+ session.visit('http://www.google.com')
105
+ expect(session.driver).to have_received(:visit).with('http://www.google.com')
106
+ end
107
+ end
108
+
109
+ context 'when Capybara.always_include_port is false' do
110
+ before do
111
+ Capybara.always_include_port = false
112
+ end
113
+
114
+ it "shouldn't overwrite port if app_host is set", requires: [:server] do
115
+ session = Capybara::Session.new(@session.mode, nil)
116
+ Capybara.app_host = 'http://www.example.com:6666'
117
+ allow(session.driver).to receive(:visit)
118
+ session.visit('http://www.google.com')
119
+ expect(session.driver).to have_received(:visit).with('http://www.google.com')
120
+ end
121
+
122
+ it "shouldn't overwrite port if port specfified", requires: [:server] do
123
+ session = Capybara::Session.new(@session.mode, nil)
124
+ Capybara.app_host = 'http://www.example.com:6666'
125
+ allow(session.driver).to receive(:visit)
126
+ session.visit('http://www.google.com:99')
127
+ expect(session.driver).to have_received(:visit).with('http://www.google.com:99')
128
+ end
129
+ end
130
+
131
+ context 'without a server', requires: [:server] do
132
+ it 'should respect `app_host`' do
133
+ serverless_session = Capybara::Session.new(@session.mode, nil)
134
+ Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}"
135
+ serverless_session.visit('/foo')
136
+ expect(serverless_session).to have_content('Another World')
137
+ end
138
+
139
+ it 'should visit a fully qualified URL' do
140
+ serverless_session = Capybara::Session.new(@session.mode, nil)
141
+ serverless_session.visit("http://#{@session.server.host}:#{@session.server.port}/foo")
142
+ expect(serverless_session).to have_content('Another World')
143
+ end
144
+ end
145
+
146
+ context 'with Capybara.app_host set' do
147
+ it 'should override server', requires: [:server] do
148
+ another_session = Capybara::Session.new(@session.mode, @session.app.dup)
149
+ Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}"
150
+ another_session.visit('/foo')
151
+ expect(another_session).to have_content('Another World')
152
+ expect(another_session.current_url).to start_with(Capybara.app_host)
153
+ expect(URI.parse(another_session.current_url).port).not_to eq another_session.server.port
154
+ expect(URI.parse(another_session.current_url).port).to eq @session.server.port
155
+ end
156
+
157
+ it 'should append relative path', requires: [:server] do
158
+ Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}/redirect/0"
159
+ @session.visit('/times')
160
+ expect(@session).to have_content('redirection complete')
161
+ end
162
+
163
+ it 'should work if `app_host` has a trailing /', requires: [:server] do
164
+ Capybara.app_host = "http://#{@session.server.host}:#{@session.server.port}/"
165
+ @session.visit('/')
166
+ expect(@session).to have_content('Hello world!')
167
+ end
168
+ end
169
+
170
+ it 'should send no referer when visiting a page' do
171
+ @session.visit '/get_referer'
172
+ expect(@session).to have_content 'No referer'
173
+ end
174
+
175
+ it 'should send no referer when visiting a second page' do
176
+ @session.visit '/get_referer'
177
+ @session.visit '/get_referer'
178
+ expect(@session).to have_content 'No referer'
179
+ end
180
+
181
+ it 'should send a referer when following a link' do
182
+ @session.visit '/referer_base'
183
+ @session.find('//a[@href="/get_referer"]').click
184
+ expect(@session).to have_content %r{http://.*/referer_base}
185
+ end
186
+
187
+ it 'should preserve the original referer URL when following a redirect' do
188
+ @session.visit('/referer_base')
189
+ @session.find('//a[@href="/redirect_to_get_referer"]').click
190
+ expect(@session).to have_content %r{http://.*/referer_base}
191
+ end
192
+
193
+ it 'should send a referer when submitting a form' do
194
+ @session.visit '/referer_base'
195
+ @session.find('//input').click
196
+ expect(@session).to have_content %r{http://.*/referer_base}
197
+ end
198
+
199
+ it 'can set cookie if a blank path is specified' do
200
+ @session.visit('')
201
+ @session.visit('/get_cookie')
202
+ expect(@session).to have_content('root cookie')
203
+ end
204
+ end