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,112 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Capybara do
6
+ describe 'default_max_wait_time' do
7
+ before { @previous_default_time = described_class.default_max_wait_time }
8
+
9
+ after { described_class.default_max_wait_time = @previous_default_time } # rubocop:disable RSpec/InstanceVariable
10
+
11
+ it 'should be changeable' do
12
+ expect(described_class.default_max_wait_time).not_to eq(5)
13
+ described_class.default_max_wait_time = 5
14
+ expect(described_class.default_max_wait_time).to eq(5)
15
+ end
16
+ end
17
+
18
+ describe '.register_driver' do
19
+ it 'should add a new driver' do
20
+ described_class.register_driver :schmoo do |app|
21
+ Capybara::RackTest::Driver.new(app)
22
+ end
23
+ session = Capybara::Session.new(:schmoo, TestApp)
24
+ session.visit('/')
25
+ expect(session.body).to include('Hello world!')
26
+ end
27
+ end
28
+
29
+ describe '.register_server' do
30
+ it 'should add a new server' do
31
+ described_class.register_server :blob do |_app, _port, _host|
32
+ # do nothing
33
+ end
34
+
35
+ expect(described_class.servers).to have_key(:blob)
36
+ end
37
+ end
38
+
39
+ describe '.server' do
40
+ after do
41
+ described_class.server = :default
42
+ end
43
+
44
+ it 'should default to a proc that calls run_default_server' do
45
+ mock_app = Object.new
46
+ allow(described_class).to receive(:run_default_server).and_return(true)
47
+ described_class.server.call(mock_app, 8000)
48
+ expect(described_class).to have_received(:run_default_server).with(mock_app, 8000)
49
+ end
50
+
51
+ it 'should return a custom server proc' do
52
+ server = ->(_app, _port) {}
53
+ described_class.register_server :custom, &server
54
+ described_class.server = :custom
55
+ expect(described_class.server).to eq(server)
56
+ end
57
+
58
+ it 'should have :webrick registered' do
59
+ expect(described_class.servers[:webrick]).not_to be_nil
60
+ end
61
+
62
+ it 'should have :puma registered' do
63
+ expect(described_class.servers[:puma]).not_to be_nil
64
+ end
65
+ end
66
+
67
+ describe 'server=' do
68
+ after do
69
+ described_class.server = :default
70
+ end
71
+
72
+ it 'accepts a proc' do
73
+ server = ->(_app, _port) {}
74
+ described_class.server = server
75
+ expect(described_class.server).to eq server
76
+ end
77
+ end
78
+
79
+ describe 'app_host' do
80
+ after do
81
+ described_class.app_host = nil
82
+ end
83
+
84
+ it 'should warn if not a valid URL' do
85
+ expect { described_class.app_host = 'www.example.com' }.to raise_error(ArgumentError, /Capybara\.app_host should be set to a url/)
86
+ end
87
+
88
+ it 'should not warn if a valid URL' do
89
+ expect { described_class.app_host = 'http://www.example.com' }.not_to raise_error
90
+ end
91
+
92
+ it 'should not warn if nil' do
93
+ expect { described_class.app_host = nil }.not_to raise_error
94
+ end
95
+ end
96
+
97
+ describe 'default_host' do
98
+ around do |test|
99
+ old_default = described_class.default_host
100
+ test.run
101
+ described_class.default_host = old_default
102
+ end
103
+
104
+ it 'should raise if not a valid URL' do
105
+ expect { described_class.default_host = 'www.example.com' }.to raise_error(ArgumentError, /Capybara\.default_host should be set to a url/)
106
+ end
107
+
108
+ it 'should not warn if a valid URL' do
109
+ expect { described_class.default_host = 'http://www.example.com' }.not_to raise_error
110
+ end
111
+ end
112
+ end
@@ -0,0 +1,101 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ # rubocop:disable RSpec/InstanceVariable
6
+ RSpec.describe Capybara::Selector::CSSBuilder do
7
+ let :builder do
8
+ ::Capybara::Selector::CSSBuilder.new(@css)
9
+ end
10
+
11
+ context 'add_attribute_conditions' do
12
+ it 'adds a single string condition to a single selector' do
13
+ @css = 'div'
14
+ selector = builder.add_attribute_conditions(random: 'abc')
15
+ expect(selector).to eq %(div[random='abc'])
16
+ end
17
+
18
+ it 'adds multiple string conditions to a single selector' do
19
+ @css = 'div'
20
+ selector = builder.add_attribute_conditions(random: 'abc', other: 'def')
21
+ expect(selector).to eq %(div[random='abc'][other='def'])
22
+ end
23
+
24
+ it 'adds a single string condition to a multiple selector' do
25
+ @css = 'div, ul'
26
+ selector = builder.add_attribute_conditions(random: 'abc')
27
+ expect(selector).to eq %(div[random='abc'], ul[random='abc'])
28
+ end
29
+
30
+ it 'adds multiple string conditions to a multiple selector' do
31
+ @css = 'div, ul'
32
+ selector = builder.add_attribute_conditions(random: 'abc', other: 'def')
33
+ expect(selector).to eq %(div[random='abc'][other='def'], ul[random='abc'][other='def'])
34
+ end
35
+
36
+ it 'adds simple regexp conditions to a single selector' do
37
+ @css = 'div'
38
+ selector = builder.add_attribute_conditions(random: /abc/, other: /def/)
39
+ expect(selector).to eq %(div[random*='abc'][other*='def'])
40
+ end
41
+
42
+ it 'adds wildcard regexp conditions to a single selector' do
43
+ @css = 'div'
44
+ selector = builder.add_attribute_conditions(random: /abc.*def/, other: /def.*ghi/)
45
+ expect(selector).to eq %(div[random*='abc'][random*='def'][other*='def'][other*='ghi'])
46
+ end
47
+
48
+ it 'adds alternated regexp conditions to a single selector' do
49
+ @css = 'div'
50
+ selector = builder.add_attribute_conditions(random: /abc|def/, other: /def|ghi/)
51
+ expect(selector).to eq %(div[random*='abc'][other*='def'], div[random*='abc'][other*='ghi'], div[random*='def'][other*='def'], div[random*='def'][other*='ghi'])
52
+ end
53
+
54
+ it 'adds alternated regexp conditions to a multiple selector' do
55
+ @css = 'div,ul'
56
+ selector = builder.add_attribute_conditions(other: /def.*ghi|jkl/)
57
+ expect(selector).to eq %(div[other*='def'][other*='ghi'], div[other*='jkl'], ul[other*='def'][other*='ghi'], ul[other*='jkl'])
58
+ end
59
+
60
+ it "returns original selector when regexp can't be substringed" do
61
+ @css = 'div'
62
+ selector = builder.add_attribute_conditions(other: /.+/)
63
+ expect(selector).to eq 'div'
64
+ end
65
+
66
+ context ':class' do
67
+ it 'handles string with CSS .' do
68
+ @css = 'a'
69
+ selector = builder.add_attribute_conditions(class: 'my_class')
70
+ expect(selector).to eq 'a.my_class'
71
+ end
72
+
73
+ it 'handles negated string with CSS .' do
74
+ @css = 'a'
75
+ selector = builder.add_attribute_conditions(class: '!my_class')
76
+ expect(selector).to eq 'a:not(.my_class)'
77
+ end
78
+
79
+ it 'handles array of string with CSS .' do
80
+ @css = 'a'
81
+ selector = builder.add_attribute_conditions(class: %w[my_class my_other_class])
82
+ expect(selector).to eq 'a.my_class.my_other_class'
83
+ end
84
+
85
+ it 'handles array of string with CSS . when negated included' do
86
+ @css = 'a'
87
+ selector = builder.add_attribute_conditions(class: %w[my_class !my_other_class])
88
+ expect(selector).to eq 'a.my_class:not(.my_other_class)'
89
+ end
90
+ end
91
+
92
+ context ':id' do
93
+ it 'handles string with CSS #' do
94
+ @css = 'ul'
95
+ selector = builder.add_attribute_conditions(id: 'my_id')
96
+ expect(selector).to eq 'ul#my_id'
97
+ end
98
+ end
99
+ end
100
+ end
101
+ # rubocop:enable RSpec/InstanceVariable
@@ -0,0 +1,38 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Capybara::Selector::CSS::Splitter do
6
+ let :splitter do
7
+ ::Capybara::Selector::CSS::Splitter.new
8
+ end
9
+
10
+ context 'split not needed' do
11
+ it 'normal CSS selector' do
12
+ css = 'div[id="abc"]'
13
+ expect(splitter.split(css)).to eq [css]
14
+ end
15
+
16
+ it 'comma in strings' do
17
+ css = 'div[id="a,bc"]'
18
+ expect(splitter.split(css)).to eq [css]
19
+ end
20
+
21
+ it 'comma in pseudo-selector' do
22
+ css = 'div.class1:not(.class1, .class2)'
23
+ expect(splitter.split(css)).to eq [css]
24
+ end
25
+ end
26
+
27
+ context 'split needed' do
28
+ it 'root level comma' do
29
+ css = 'div.class1, span, p.class2'
30
+ expect(splitter.split(css)).to eq ['div.class1', 'span', 'p.class2']
31
+ end
32
+
33
+ it 'root level comma when quotes and pseudo selectors' do
34
+ css = 'div.class1[id="abc\\"def,ghi"]:not(.class3, .class4), span[id=\'a"c\\\'de\'], section, #abc\\,def'
35
+ expect(splitter.split(css)).to eq ['div.class1[id="abc\\"def,ghi"]:not(.class3, .class4)', 'span[id=\'a"c\\\'de\']', 'section', '#abc\\,def']
36
+ end
37
+ end
38
+ end
@@ -0,0 +1,276 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+ require 'capybara/dsl'
5
+
6
+ class TestClass
7
+ include Capybara::DSL
8
+ end
9
+
10
+ Capybara::SpecHelper.run_specs TestClass.new, 'DSL', capybara_skip: %i[
11
+ js modals screenshot frames windows send_keys server hover about_scheme psc download css driver scroll spatial
12
+ ] do |example|
13
+ case example.metadata[:full_description]
14
+ when /has_css\? should support case insensitive :class and :id options/
15
+ pending "Nokogiri doesn't support case insensitive CSS attribute matchers"
16
+ when /#click_button should follow permanent redirects that maintain method/
17
+ pending "Rack < 2 doesn't support 308" if Gem.loaded_specs['rack'].version < Gem::Version.new('2.0.0')
18
+ end
19
+ end
20
+
21
+ RSpec.describe Capybara::DSL do
22
+ after do
23
+ Capybara.session_name = nil
24
+ Capybara.default_driver = nil
25
+ Capybara.javascript_driver = nil
26
+ Capybara.use_default_driver
27
+ Capybara.app = TestApp
28
+ end
29
+
30
+ describe '#default_driver' do
31
+ it 'should default to rack_test' do
32
+ expect(Capybara.default_driver).to eq(:rack_test)
33
+ end
34
+
35
+ it 'should be changeable' do
36
+ Capybara.default_driver = :culerity
37
+ expect(Capybara.default_driver).to eq(:culerity)
38
+ end
39
+ end
40
+
41
+ describe '#current_driver' do
42
+ it 'should default to the default driver' do
43
+ expect(Capybara.current_driver).to eq(:rack_test)
44
+ Capybara.default_driver = :culerity
45
+ expect(Capybara.current_driver).to eq(:culerity)
46
+ end
47
+
48
+ it 'should be changeable' do
49
+ Capybara.current_driver = :culerity
50
+ expect(Capybara.current_driver).to eq(:culerity)
51
+ end
52
+ end
53
+
54
+ describe '#javascript_driver' do
55
+ it 'should default to selenium' do
56
+ expect(Capybara.javascript_driver).to eq(:selenium)
57
+ end
58
+
59
+ it 'should be changeable' do
60
+ Capybara.javascript_driver = :culerity
61
+ expect(Capybara.javascript_driver).to eq(:culerity)
62
+ end
63
+ end
64
+
65
+ describe '#use_default_driver' do
66
+ it 'should restore the default driver' do
67
+ Capybara.current_driver = :culerity
68
+ Capybara.use_default_driver
69
+ expect(Capybara.current_driver).to eq(:rack_test)
70
+ end
71
+ end
72
+
73
+ describe '#using_driver' do
74
+ before do
75
+ expect(Capybara.current_driver).not_to eq(:selenium) # rubocop:disable RSpec/ExpectInHook
76
+ end
77
+
78
+ it 'should set the driver using Capybara.current_driver=' do
79
+ driver = nil
80
+ Capybara.using_driver(:selenium) { driver = Capybara.current_driver }
81
+ expect(driver).to eq(:selenium)
82
+ end
83
+
84
+ it 'should return the driver to default if it has not been changed' do
85
+ Capybara.using_driver(:selenium) do
86
+ expect(Capybara.current_driver).to eq(:selenium)
87
+ end
88
+ expect(Capybara.current_driver).to eq(Capybara.default_driver)
89
+ end
90
+
91
+ it 'should reset the driver even if an exception occurs' do
92
+ driver_before_block = Capybara.current_driver
93
+ begin
94
+ Capybara.using_driver(:selenium) { raise 'ohnoes!' }
95
+ rescue Exception # rubocop:disable Lint/RescueException,Lint/SuppressedException
96
+ end
97
+ expect(Capybara.current_driver).to eq(driver_before_block)
98
+ end
99
+
100
+ it 'should return the driver to what it was previously' do
101
+ Capybara.current_driver = :selenium
102
+ Capybara.using_driver(:culerity) do
103
+ Capybara.using_driver(:rack_test) do
104
+ expect(Capybara.current_driver).to eq(:rack_test)
105
+ end
106
+ expect(Capybara.current_driver).to eq(:culerity)
107
+ end
108
+ expect(Capybara.current_driver).to eq(:selenium)
109
+ end
110
+
111
+ it 'should yield the passed block' do
112
+ called = false
113
+ Capybara.using_driver(:selenium) { called = true }
114
+ expect(called).to eq(true)
115
+ end
116
+ end
117
+
118
+ # rubocop:disable RSpec/InstanceVariable
119
+ describe '#using_wait_time' do
120
+ before { @previous_wait_time = Capybara.default_max_wait_time }
121
+
122
+ after { Capybara.default_max_wait_time = @previous_wait_time }
123
+
124
+ it 'should switch the wait time and switch it back' do
125
+ in_block = nil
126
+ Capybara.using_wait_time 6 do
127
+ in_block = Capybara.default_max_wait_time
128
+ end
129
+ expect(in_block).to eq(6)
130
+ expect(Capybara.default_max_wait_time).to eq(@previous_wait_time)
131
+ end
132
+
133
+ it 'should ensure wait time is reset' do
134
+ expect do
135
+ Capybara.using_wait_time 6 do
136
+ raise 'hell'
137
+ end
138
+ end.to raise_error(RuntimeError, 'hell')
139
+ expect(Capybara.default_max_wait_time).to eq(@previous_wait_time)
140
+ end
141
+ end
142
+ # rubocop:enable RSpec/InstanceVariable
143
+
144
+ describe '#app' do
145
+ it 'should be changeable' do
146
+ Capybara.app = 'foobar'
147
+ expect(Capybara.app).to eq('foobar')
148
+ end
149
+ end
150
+
151
+ describe '#current_session' do
152
+ it 'should choose a session object of the current driver type' do
153
+ expect(Capybara.current_session).to be_a(Capybara::Session)
154
+ end
155
+
156
+ it 'should use #app as the application' do
157
+ Capybara.app = proc {}
158
+ expect(Capybara.current_session.app).to eq(Capybara.app)
159
+ end
160
+
161
+ it 'should change with the current driver' do
162
+ expect(Capybara.current_session.mode).to eq(:rack_test)
163
+ Capybara.current_driver = :selenium
164
+ expect(Capybara.current_session.mode).to eq(:selenium)
165
+ end
166
+
167
+ it 'should be persistent even across driver changes' do
168
+ object_id = Capybara.current_session.object_id
169
+ expect(Capybara.current_session.object_id).to eq(object_id)
170
+ Capybara.current_driver = :selenium
171
+ expect(Capybara.current_session.mode).to eq(:selenium)
172
+ expect(Capybara.current_session.object_id).not_to eq(object_id)
173
+
174
+ Capybara.current_driver = :rack_test
175
+ expect(Capybara.current_session.object_id).to eq(object_id)
176
+ end
177
+
178
+ it 'should change when changing application' do
179
+ object_id = Capybara.current_session.object_id
180
+ expect(Capybara.current_session.object_id).to eq(object_id)
181
+ Capybara.app = proc {}
182
+ expect(Capybara.current_session.object_id).not_to eq(object_id)
183
+ expect(Capybara.current_session.app).to eq(Capybara.app)
184
+ end
185
+
186
+ it 'should change when the session name changes' do
187
+ object_id = Capybara.current_session.object_id
188
+ Capybara.session_name = :administrator
189
+ expect(Capybara.session_name).to eq(:administrator)
190
+ expect(Capybara.current_session.object_id).not_to eq(object_id)
191
+ Capybara.session_name = :default
192
+ expect(Capybara.session_name).to eq(:default)
193
+ expect(Capybara.current_session.object_id).to eq(object_id)
194
+ end
195
+ end
196
+
197
+ describe '#using_session' do
198
+ it 'should change the session name for the duration of the block' do
199
+ expect(Capybara.session_name).to eq(:default)
200
+ Capybara.using_session(:administrator) do
201
+ expect(Capybara.session_name).to eq(:administrator)
202
+ end
203
+ expect(Capybara.session_name).to eq(:default)
204
+ end
205
+
206
+ it 'should reset the session to the default, even if an exception occurs' do
207
+ begin
208
+ Capybara.using_session(:raise) do
209
+ raise
210
+ end
211
+ rescue Exception # rubocop:disable Lint/RescueException,Lint/SuppressedException
212
+ end
213
+ expect(Capybara.session_name).to eq(:default)
214
+ end
215
+
216
+ it 'should yield the passed block' do
217
+ called = false
218
+ Capybara.using_session(:administrator) { called = true }
219
+ expect(called).to eq(true)
220
+ end
221
+
222
+ it 'should be nestable' do
223
+ Capybara.using_session(:outer) do
224
+ expect(Capybara.session_name).to eq(:outer)
225
+ Capybara.using_session(:inner) do
226
+ expect(Capybara.session_name).to eq(:inner)
227
+ end
228
+ expect(Capybara.session_name).to eq(:outer)
229
+ end
230
+ expect(Capybara.session_name).to eq(:default)
231
+ end
232
+
233
+ it 'should allow a session object' do
234
+ original_session = Capybara.current_session
235
+ new_session = Capybara::Session.new(:rack_test, proc {})
236
+ Capybara.using_session(new_session) do
237
+ expect(Capybara.current_session).to eq(new_session)
238
+ end
239
+ expect(Capybara.current_session).to eq(original_session)
240
+ end
241
+ end
242
+
243
+ describe '#session_name' do
244
+ it 'should default to :default' do
245
+ expect(Capybara.session_name).to eq(:default)
246
+ end
247
+ end
248
+
249
+ describe 'the DSL' do
250
+ let(:session) { Class.new { include Capybara::DSL }.new }
251
+
252
+ it 'should be possible to include it in another class' do
253
+ session.visit('/with_html')
254
+ session.click_link('ullamco')
255
+ expect(session.body).to include('Another World')
256
+ end
257
+
258
+ it "should provide a 'page' shortcut for more expressive tests" do
259
+ session.page.visit('/with_html')
260
+ session.page.click_link('ullamco')
261
+ expect(session.page.body).to include('Another World')
262
+ end
263
+
264
+ it "should provide an 'using_session' shortcut" do
265
+ allow(Capybara).to receive(:using_session)
266
+ session.using_session(:name)
267
+ expect(Capybara).to have_received(:using_session).with(:name)
268
+ end
269
+
270
+ it "should provide a 'using_wait_time' shortcut" do
271
+ allow(Capybara).to receive(:using_wait_time)
272
+ session.using_wait_time(6)
273
+ expect(Capybara).to have_received(:using_wait_time).with(6)
274
+ end
275
+ end
276
+ end