capybara 2.7.0 → 3.35.3

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 (318) hide show
  1. checksums.yaml +5 -5
  2. data/.yardopts +1 -0
  3. data/History.md +1147 -11
  4. data/License.txt +1 -1
  5. data/README.md +252 -131
  6. data/lib/capybara/config.rb +92 -0
  7. data/lib/capybara/cucumber.rb +3 -3
  8. data/lib/capybara/driver/base.rb +52 -21
  9. data/lib/capybara/driver/node.rb +48 -14
  10. data/lib/capybara/dsl.rb +16 -9
  11. data/lib/capybara/helpers.rb +72 -81
  12. data/lib/capybara/minitest/spec.rb +267 -0
  13. data/lib/capybara/minitest.rb +385 -0
  14. data/lib/capybara/node/actions.rb +337 -89
  15. data/lib/capybara/node/base.rb +50 -32
  16. data/lib/capybara/node/document.rb +19 -3
  17. data/lib/capybara/node/document_matchers.rb +22 -24
  18. data/lib/capybara/node/element.rb +388 -125
  19. data/lib/capybara/node/finders.rb +231 -121
  20. data/lib/capybara/node/matchers.rb +503 -217
  21. data/lib/capybara/node/simple.rb +64 -27
  22. data/lib/capybara/queries/ancestor_query.rb +27 -0
  23. data/lib/capybara/queries/base_query.rb +87 -11
  24. data/lib/capybara/queries/current_path_query.rb +24 -24
  25. data/lib/capybara/queries/match_query.rb +15 -10
  26. data/lib/capybara/queries/selector_query.rb +675 -81
  27. data/lib/capybara/queries/sibling_query.rb +26 -0
  28. data/lib/capybara/queries/style_query.rb +45 -0
  29. data/lib/capybara/queries/text_query.rb +88 -20
  30. data/lib/capybara/queries/title_query.rb +9 -11
  31. data/lib/capybara/rack_test/browser.rb +63 -39
  32. data/lib/capybara/rack_test/css_handlers.rb +6 -4
  33. data/lib/capybara/rack_test/driver.rb +26 -16
  34. data/lib/capybara/rack_test/errors.rb +6 -0
  35. data/lib/capybara/rack_test/form.rb +73 -58
  36. data/lib/capybara/rack_test/node.rb +187 -67
  37. data/lib/capybara/rails.rb +4 -8
  38. data/lib/capybara/registration_container.rb +44 -0
  39. data/lib/capybara/registrations/drivers.rb +42 -0
  40. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  41. data/lib/capybara/registrations/servers.rb +45 -0
  42. data/lib/capybara/result.rb +142 -14
  43. data/lib/capybara/rspec/features.rb +17 -42
  44. data/lib/capybara/rspec/matcher_proxies.rb +82 -0
  45. data/lib/capybara/rspec/matchers/base.rb +111 -0
  46. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  47. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  48. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  49. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  50. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  51. data/lib/capybara/rspec/matchers/have_selector.rb +77 -0
  52. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  53. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  54. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  55. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  56. data/lib/capybara/rspec/matchers/match_style.rb +43 -0
  57. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  58. data/lib/capybara/rspec/matchers.rb +143 -244
  59. data/lib/capybara/rspec.rb +10 -12
  60. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  61. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  62. data/lib/capybara/selector/css.rb +102 -0
  63. data/lib/capybara/selector/definition/button.rb +63 -0
  64. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  65. data/lib/capybara/selector/definition/css.rb +10 -0
  66. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  67. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  68. data/lib/capybara/selector/definition/element.rb +28 -0
  69. data/lib/capybara/selector/definition/field.rb +40 -0
  70. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  71. data/lib/capybara/selector/definition/file_field.rb +13 -0
  72. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  73. data/lib/capybara/selector/definition/frame.rb +17 -0
  74. data/lib/capybara/selector/definition/id.rb +6 -0
  75. data/lib/capybara/selector/definition/label.rb +62 -0
  76. data/lib/capybara/selector/definition/link.rb +54 -0
  77. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  78. data/lib/capybara/selector/definition/option.rb +27 -0
  79. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  80. data/lib/capybara/selector/definition/select.rb +81 -0
  81. data/lib/capybara/selector/definition/table.rb +109 -0
  82. data/lib/capybara/selector/definition/table_row.rb +21 -0
  83. data/lib/capybara/selector/definition/xpath.rb +5 -0
  84. data/lib/capybara/selector/definition.rb +278 -0
  85. data/lib/capybara/selector/filter.rb +3 -46
  86. data/lib/capybara/selector/filter_set.rb +124 -0
  87. data/lib/capybara/selector/filters/base.rb +77 -0
  88. data/lib/capybara/selector/filters/expression_filter.rb +22 -0
  89. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  90. data/lib/capybara/selector/filters/node_filter.rb +31 -0
  91. data/lib/capybara/selector/regexp_disassembler.rb +214 -0
  92. data/lib/capybara/selector/selector.rb +155 -0
  93. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  94. data/lib/capybara/selector.rb +232 -369
  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 +380 -142
  100. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  101. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +124 -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 +76 -0
  110. data/lib/capybara/selenium/logger_suppressor.rb +40 -0
  111. data/lib/capybara/selenium/node.rb +528 -97
  112. data/lib/capybara/selenium/nodes/chrome_node.rb +137 -0
  113. data/lib/capybara/selenium/nodes/edge_node.rb +104 -0
  114. data/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
  115. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  116. data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
  117. data/lib/capybara/selenium/patches/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 +45 -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/animation_disabler.rb +63 -0
  124. data/lib/capybara/server/checker.rb +44 -0
  125. data/lib/capybara/server/middleware.rb +71 -0
  126. data/lib/capybara/server.rb +74 -71
  127. data/lib/capybara/session/config.rb +126 -0
  128. data/lib/capybara/session/matchers.rb +44 -27
  129. data/lib/capybara/session.rb +500 -297
  130. data/lib/capybara/spec/fixtures/no_extension +1 -0
  131. data/lib/capybara/spec/public/jquery.js +5 -5
  132. data/lib/capybara/spec/public/offset.js +6 -0
  133. data/lib/capybara/spec/public/test.js +168 -14
  134. data/lib/capybara/spec/session/accept_alert_spec.rb +37 -14
  135. data/lib/capybara/spec/session/accept_confirm_spec.rb +7 -6
  136. data/lib/capybara/spec/session/accept_prompt_spec.rb +38 -10
  137. data/lib/capybara/spec/session/all_spec.rb +179 -59
  138. data/lib/capybara/spec/session/ancestor_spec.rb +88 -0
  139. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +140 -0
  140. data/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
  141. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  142. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  143. data/lib/capybara/spec/session/assert_text_spec.rb +258 -0
  144. data/lib/capybara/spec/session/assert_title_spec.rb +93 -0
  145. data/lib/capybara/spec/session/attach_file_spec.rb +154 -48
  146. data/lib/capybara/spec/session/body_spec.rb +12 -13
  147. data/lib/capybara/spec/session/check_spec.rb +168 -41
  148. data/lib/capybara/spec/session/choose_spec.rb +75 -23
  149. data/lib/capybara/spec/session/click_button_spec.rb +243 -175
  150. data/lib/capybara/spec/session/click_link_or_button_spec.rb +57 -32
  151. data/lib/capybara/spec/session/click_link_spec.rb +100 -53
  152. data/lib/capybara/spec/session/current_scope_spec.rb +11 -10
  153. data/lib/capybara/spec/session/current_url_spec.rb +61 -35
  154. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +7 -7
  155. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +5 -4
  156. data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +13 -6
  157. data/lib/capybara/spec/session/element/match_css_spec.rb +21 -7
  158. data/lib/capybara/spec/session/element/match_xpath_spec.rb +9 -7
  159. data/lib/capybara/spec/session/element/matches_selector_spec.rb +91 -34
  160. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
  161. data/lib/capybara/spec/session/evaluate_script_spec.rb +45 -3
  162. data/lib/capybara/spec/session/execute_script_spec.rb +24 -4
  163. data/lib/capybara/spec/session/fill_in_spec.rb +166 -64
  164. data/lib/capybara/spec/session/find_button_spec.rb +37 -18
  165. data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
  166. data/lib/capybara/spec/session/find_field_spec.rb +57 -34
  167. data/lib/capybara/spec/session/find_link_spec.rb +47 -10
  168. data/lib/capybara/spec/session/find_spec.rb +290 -144
  169. data/lib/capybara/spec/session/first_spec.rb +91 -48
  170. data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
  171. data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
  172. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +116 -0
  173. data/lib/capybara/spec/session/frame/within_frame_spec.rb +112 -0
  174. data/lib/capybara/spec/session/go_back_spec.rb +3 -2
  175. data/lib/capybara/spec/session/go_forward_spec.rb +3 -2
  176. data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
  177. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  178. data/lib/capybara/spec/session/has_any_selectors_spec.rb +25 -0
  179. data/lib/capybara/spec/session/has_button_spec.rb +76 -19
  180. data/lib/capybara/spec/session/has_css_spec.rb +277 -131
  181. data/lib/capybara/spec/session/has_current_path_spec.rb +98 -26
  182. data/lib/capybara/spec/session/has_field_spec.rb +177 -107
  183. data/lib/capybara/spec/session/has_link_spec.rb +13 -12
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
  185. data/lib/capybara/spec/session/has_select_spec.rb +191 -95
  186. data/lib/capybara/spec/session/has_selector_spec.rb +128 -64
  187. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  188. data/lib/capybara/spec/session/has_table_spec.rb +172 -5
  189. data/lib/capybara/spec/session/has_text_spec.rb +126 -60
  190. data/lib/capybara/spec/session/has_title_spec.rb +35 -12
  191. data/lib/capybara/spec/session/has_xpath_spec.rb +74 -53
  192. data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +3 -2
  193. data/lib/capybara/spec/session/html_spec.rb +14 -6
  194. data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
  195. data/lib/capybara/spec/session/node_spec.rb +1028 -131
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  197. data/lib/capybara/spec/session/refresh_spec.rb +34 -0
  198. data/lib/capybara/spec/session/reset_session_spec.rb +75 -34
  199. data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +2 -1
  200. data/lib/capybara/spec/session/save_and_open_page_spec.rb +3 -2
  201. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +11 -15
  202. data/lib/capybara/spec/session/save_page_spec.rb +42 -55
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +16 -14
  204. data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
  205. data/lib/capybara/spec/session/scroll_spec.rb +117 -0
  206. data/lib/capybara/spec/session/select_spec.rb +112 -85
  207. data/lib/capybara/spec/session/selectors_spec.rb +71 -8
  208. data/lib/capybara/spec/session/sibling_spec.rb +52 -0
  209. data/lib/capybara/spec/session/text_spec.rb +38 -23
  210. data/lib/capybara/spec/session/title_spec.rb +17 -5
  211. data/lib/capybara/spec/session/uncheck_spec.rb +71 -12
  212. data/lib/capybara/spec/session/unselect_spec.rb +44 -43
  213. data/lib/capybara/spec/session/visit_spec.rb +99 -32
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +33 -29
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +5 -3
  216. data/lib/capybara/spec/session/window/open_new_window_spec.rb +5 -3
  217. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +39 -30
  218. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +17 -10
  219. data/lib/capybara/spec/session/window/window_spec.rb +121 -73
  220. data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
  221. data/lib/capybara/spec/session/window/within_window_spec.rb +52 -82
  222. data/lib/capybara/spec/session/within_spec.rb +76 -43
  223. data/lib/capybara/spec/spec_helper.rb +67 -33
  224. data/lib/capybara/spec/test_app.rb +85 -36
  225. data/lib/capybara/spec/views/animated.erb +49 -0
  226. data/lib/capybara/spec/views/buttons.erb +1 -1
  227. data/lib/capybara/spec/views/fieldsets.erb +1 -1
  228. data/lib/capybara/spec/views/form.erb +227 -20
  229. data/lib/capybara/spec/views/frame_child.erb +10 -2
  230. data/lib/capybara/spec/views/frame_one.erb +2 -1
  231. data/lib/capybara/spec/views/frame_parent.erb +2 -2
  232. data/lib/capybara/spec/views/frame_two.erb +1 -1
  233. data/lib/capybara/spec/views/header_links.erb +1 -1
  234. data/lib/capybara/spec/views/host_links.erb +1 -1
  235. data/lib/capybara/spec/views/initial_alert.erb +10 -0
  236. data/lib/capybara/spec/views/obscured.erb +47 -0
  237. data/lib/capybara/spec/views/offset.erb +32 -0
  238. data/lib/capybara/spec/views/path.erb +1 -1
  239. data/lib/capybara/spec/views/popup_one.erb +1 -1
  240. data/lib/capybara/spec/views/popup_two.erb +1 -1
  241. data/lib/capybara/spec/views/postback.erb +1 -1
  242. data/lib/capybara/spec/views/react.erb +45 -0
  243. data/lib/capybara/spec/views/scroll.erb +20 -0
  244. data/lib/capybara/spec/views/spatial.erb +31 -0
  245. data/lib/capybara/spec/views/tables.erb +69 -2
  246. data/lib/capybara/spec/views/with_animation.erb +82 -0
  247. data/lib/capybara/spec/views/with_base_tag.erb +1 -1
  248. data/lib/capybara/spec/views/with_count.erb +1 -1
  249. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  250. data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
  251. data/lib/capybara/spec/views/with_hover.erb +7 -1
  252. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  253. data/lib/capybara/spec/views/with_html.erb +100 -10
  254. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  255. data/lib/capybara/spec/views/with_html_entities.erb +1 -1
  256. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  257. data/lib/capybara/spec/views/with_js.erb +49 -3
  258. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  259. data/lib/capybara/spec/views/with_namespace.erb +20 -0
  260. data/lib/capybara/spec/views/with_scope.erb +1 -1
  261. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  262. data/lib/capybara/spec/views/with_simple_html.erb +1 -1
  263. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  264. data/lib/capybara/spec/views/with_title.erb +1 -1
  265. data/lib/capybara/spec/views/with_unload_alert.erb +3 -1
  266. data/lib/capybara/spec/views/with_windows.erb +7 -1
  267. data/lib/capybara/spec/views/within_frames.erb +6 -3
  268. data/lib/capybara/version.rb +2 -1
  269. data/lib/capybara/window.rb +39 -21
  270. data/lib/capybara.rb +208 -186
  271. data/spec/basic_node_spec.rb +52 -39
  272. data/spec/capybara_spec.rb +72 -50
  273. data/spec/css_builder_spec.rb +101 -0
  274. data/spec/css_splitter_spec.rb +38 -0
  275. data/spec/dsl_spec.rb +81 -61
  276. data/spec/filter_set_spec.rb +46 -0
  277. data/spec/fixtures/capybara.csv +1 -0
  278. data/spec/fixtures/certificate.pem +25 -0
  279. data/spec/fixtures/key.pem +27 -0
  280. data/spec/fixtures/selenium_driver_rspec_failure.rb +7 -3
  281. data/spec/fixtures/selenium_driver_rspec_success.rb +7 -3
  282. data/spec/minitest_spec.rb +164 -0
  283. data/spec/minitest_spec_spec.rb +162 -0
  284. data/spec/per_session_config_spec.rb +68 -0
  285. data/spec/rack_test_spec.rb +189 -96
  286. data/spec/regexp_dissassembler_spec.rb +250 -0
  287. data/spec/result_spec.rb +143 -13
  288. data/spec/rspec/features_spec.rb +38 -32
  289. data/spec/rspec/scenarios_spec.rb +9 -7
  290. data/spec/rspec/shared_spec_matchers.rb +959 -0
  291. data/spec/rspec/views_spec.rb +9 -3
  292. data/spec/rspec_matchers_spec.rb +62 -0
  293. data/spec/rspec_spec.rb +127 -30
  294. data/spec/sauce_spec_chrome.rb +43 -0
  295. data/spec/selector_spec.rb +458 -37
  296. data/spec/selenium_spec_chrome.rb +196 -9
  297. data/spec/selenium_spec_chrome_remote.rb +100 -0
  298. data/spec/selenium_spec_edge.rb +47 -0
  299. data/spec/selenium_spec_firefox.rb +210 -0
  300. data/spec/selenium_spec_firefox_remote.rb +80 -0
  301. data/spec/selenium_spec_ie.rb +150 -0
  302. data/spec/selenium_spec_safari.rb +148 -0
  303. data/spec/server_spec.rb +200 -101
  304. data/spec/session_spec.rb +91 -0
  305. data/spec/shared_selenium_node.rb +83 -0
  306. data/spec/shared_selenium_session.rb +558 -0
  307. data/spec/spec_helper.rb +94 -2
  308. data/spec/xpath_builder_spec.rb +93 -0
  309. metadata +420 -60
  310. data/lib/capybara/query.rb +0 -7
  311. data/lib/capybara/spec/session/assert_current_path.rb +0 -60
  312. data/lib/capybara/spec/session/assert_selector.rb +0 -148
  313. data/lib/capybara/spec/session/assert_text.rb +0 -196
  314. data/lib/capybara/spec/session/assert_title.rb +0 -70
  315. data/lib/capybara/spec/session/source_spec.rb +0 -0
  316. data/lib/capybara/spec/session/within_frame_spec.rb +0 -53
  317. data/spec/rspec/matchers_spec.rb +0 -827
  318. data/spec/selenium_spec.rb +0 -151
@@ -1,10 +1,12 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
 
4
5
  RSpec.describe Capybara do
6
+ include Capybara::RSpecMatchers
5
7
  describe '.string' do
6
8
  let :string do
7
- Capybara.string <<-STRING
9
+ described_class.string <<-STRING
8
10
  <html>
9
11
  <head>
10
12
  <title>simple_node</title>
@@ -45,97 +47,108 @@ RSpec.describe Capybara do
45
47
  STRING
46
48
  end
47
49
 
48
- it "allows using matchers" do
50
+ it 'allows using matchers' do
49
51
  expect(string).to have_css('#page')
50
52
  expect(string).not_to have_css('#does-not-exist')
51
53
  end
52
54
 
53
- it "allows using custom matchers" do
54
- Capybara.add_selector :lifeform do
55
- xpath { |name| "//option[contains(.,'#{name}')]" }
55
+ it 'allows using custom matchers' do
56
+ described_class.add_selector :lifeform do
57
+ xpath { |name| ".//option[contains(.,'#{name}')]" }
56
58
  end
57
- expect(string).to have_selector(:id, "page")
59
+ expect(string).to have_selector(:id, 'page')
58
60
  expect(string).not_to have_selector(:id, 'does-not-exist')
59
- expect(string).to have_selector(:lifeform, "Monkey")
60
- expect(string).not_to have_selector(:lifeform, "Gorilla")
61
+ expect(string).to have_selector(:lifeform, 'Monkey')
62
+ expect(string).not_to have_selector(:lifeform, 'Gorilla')
61
63
  end
62
64
 
63
65
  it 'allows custom matcher using css' do
64
- Capybara.add_selector :section do
66
+ described_class.add_selector :section do
65
67
  css { |css_class| "section .#{css_class}" }
66
68
  end
67
69
  expect(string).to have_selector(:section, 'subsection')
68
70
  expect(string).not_to have_selector(:section, 'section_8')
69
71
  end
70
72
 
71
- it "allows using matchers with text option" do
72
- expect(string).to have_css('h1', :text => 'Totally awesome')
73
- expect(string).not_to have_css('h1', :text => 'Not so awesome')
73
+ it 'allows using matchers with text option' do
74
+ expect(string).to have_css('h1', text: 'Totally awesome')
75
+ expect(string).not_to have_css('h1', text: 'Not so awesome')
74
76
  end
75
77
 
76
- it "allows finding only visible nodes" do
77
- expect(string.all(:css, '#secret', :visible => true)).to be_empty
78
- expect(string.all(:css, '#secret', :visible => false).size).to eq(1)
78
+ it 'allows finding only visible nodes' do
79
+ expect(string.all(:css, '#secret', visible: true)).to be_empty
80
+ expect(string.all(:css, '#secret', visible: false).size).to eq(1)
79
81
  end
80
82
 
81
- it "allows finding elements and extracting text from them" do
83
+ it 'allows finding elements and extracting text from them' do
82
84
  expect(string.find('//h1').text).to eq('Totally awesome')
83
85
  end
84
86
 
85
- it "allows finding elements and extracting attributes from them" do
87
+ it 'allows finding elements and extracting attributes from them' do
86
88
  expect(string.find('//h1')[:data]).to eq('fantastic')
87
89
  end
88
90
 
89
- it "allows finding elements and extracting the tag name from them" do
91
+ it 'allows finding elements and extracting the tag name from them' do
90
92
  expect(string.find('//h1').tag_name).to eq('h1')
91
93
  end
92
94
 
93
- it "allows finding elements and extracting the path" do
95
+ it 'allows finding elements and extracting the path' do
94
96
  expect(string.find('//h1').path).to eq('/html/body/div/div[1]/h1')
95
97
  end
96
98
 
97
- it "allows finding elements and extracting the path" do
99
+ it 'allows finding elements and extracting the value' do
98
100
  expect(string.find('//div/input').value).to eq('bar')
99
101
  expect(string.find('//select').value).to eq('Capybara')
100
102
  end
101
103
 
102
- it "allows finding elements and checking if they are visible" do
104
+ it 'allows finding elements and checking if they are visible' do
103
105
  expect(string.find('//h1')).to be_visible
104
- expect(string.find(:css, "#secret", :visible => false)).not_to be_visible
106
+ expect(string.find(:css, '#secret', visible: false)).not_to be_visible
105
107
  end
106
108
 
107
- it "allows finding elements and checking if they are disabled" do
109
+ it 'allows finding elements and checking if they are disabled' do
108
110
  expect(string.find('//form/input[@name="bleh"]')).to be_disabled
109
111
  expect(string.find('//form/input[@name="meh"]')).not_to be_disabled
110
112
  end
111
113
 
112
- describe "#title" do
113
- it "returns the page title" do
114
- expect(string.title).to eq("simple_node")
114
+ it 'drops illegal fragments when using gumbo' do
115
+ skip 'libxml is less strict than Gumbo' unless Nokogiri.respond_to?(:HTML5)
116
+ expect(described_class.string('<td>1</td>')).not_to have_css('td')
117
+ end
118
+
119
+ it 'can disable use of gumbo' do
120
+ skip "Test doesn't make sense unlesss nokogumbo is loaded" unless Nokogiri.respond_to?(:HTML5)
121
+ described_class.allow_gumbo = false
122
+ expect(described_class.string('<td>1</td>')).to have_css('td')
123
+ end
124
+
125
+ describe '#title' do
126
+ it 'returns the page title' do
127
+ expect(string.title).to eq('simple_node')
115
128
  end
116
129
  end
117
130
 
118
- describe "#has_title?" do
119
- it "returns whether the page has the given title" do
120
- expect(string.has_title?('simple_node')).to be_truthy
121
- expect(string.has_title?('monkey')).to be_falsey
131
+ describe '#has_title?' do
132
+ it 'returns whether the page has the given title' do
133
+ expect(string.has_title?('simple_node')).to be true
134
+ expect(string.has_title?('monkey')).to be false
122
135
  end
123
136
 
124
- it "allows regexp matches" do
125
- expect(string.has_title?(/s[a-z]+_node/)).to be_truthy
126
- expect(string.has_title?(/monkey/)).to be_falsey
137
+ it 'allows regexp matches' do
138
+ expect(string.has_title?(/s[a-z]+_node/)).to be true
139
+ expect(string.has_title?(/monkey/)).to be false
127
140
  end
128
141
  end
129
142
 
130
143
  describe '#has_no_title?' do
131
- it "returns whether the page does not have the given title" do
132
- expect(string.has_no_title?('simple_node')).to be_falsey
133
- expect(string.has_no_title?('monkey')).to be_truthy
144
+ it 'returns whether the page does not have the given title' do
145
+ expect(string.has_no_title?('simple_node')).to be false
146
+ expect(string.has_no_title?('monkey')).to be true
134
147
  end
135
148
 
136
- it "allows regexp matches" do
137
- expect(string.has_no_title?(/s[a-z]+_node/)).to be_falsey
138
- expect(string.has_no_title?(/monkey/)).to be_truthy
149
+ it 'allows regexp matches' do
150
+ expect(string.has_no_title?(/s[a-z]+_node/)).to be false
151
+ expect(string.has_no_title?(/monkey/)).to be true
139
152
  end
140
153
  end
141
154
  end
@@ -1,90 +1,112 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  require 'spec_helper'
3
4
 
4
5
  RSpec.describe Capybara do
5
6
  describe 'default_max_wait_time' do
6
- after do
7
- Capybara.default_max_wait_time = @previous_default_time
8
- end
7
+ before { @previous_default_time = described_class.default_max_wait_time }
9
8
 
10
- it "should be changeable" do
11
- @previous_default_time = Capybara.default_max_wait_time
12
- Capybara.default_max_wait_time = 5
13
- expect(Capybara.default_max_wait_time).to eq(5)
14
- end
9
+ after { described_class.default_max_wait_time = @previous_default_time } # rubocop:disable RSpec/InstanceVariable
15
10
 
16
- it "should be accesible as the deprecated default_wait_time" do
17
- expect_any_instance_of(Kernel).to receive(:warn).once.with('DEPRECATED: #default_wait_time= is deprecated, please use #default_max_wait_time= instead')
18
- expect_any_instance_of(Kernel).to receive(:warn).once.with('DEPRECATED: #default_wait_time is deprecated, please use #default_max_wait_time instead')
19
- @previous_default_time = Capybara.default_max_wait_time
20
- Capybara.default_wait_time = 5
21
- expect(Capybara.default_wait_time).to eq(5)
22
- expect(Capybara.default_max_wait_time).to eq(5)
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)
23
15
  end
24
16
  end
25
17
 
26
18
  describe '.register_driver' do
27
- it "should add a new driver" do
28
- Capybara.register_driver :schmoo do |app|
19
+ it 'should add a new driver' do
20
+ described_class.register_driver :schmoo do |app|
29
21
  Capybara::RackTest::Driver.new(app)
30
22
  end
31
23
  session = Capybara::Session.new(:schmoo, TestApp)
32
24
  session.visit('/')
33
- expect(session.body).to include("Hello world!")
25
+ expect(session.body).to include('Hello world!')
34
26
  end
35
27
  end
36
28
 
37
29
  describe '.register_server' do
38
- before do
39
- Capybara.reuse_server = false
40
- @old_server = Capybara.server
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[:blob]).to be_truthy
41
36
  end
37
+ end
42
38
 
39
+ describe '.server' do
43
40
  after do
44
- Capybara.server(&@old_server)
45
- Capybara.reuse_server = true
41
+ described_class.server = :default
46
42
  end
47
43
 
48
- it "should add a new server" do
49
- Capybara.register_server :blob do |app, port, host|
50
- Rack::Handler::WEBrick.run(app, :Host => host, :Port => port, :AccessLog => [], :Logger => WEBrick::Log::new(nil, 0))
51
- end
52
- Capybara.server = :blob
53
- session = Capybara::Session.new(:selenium, TestApp.dup)
54
- session.visit('/')
55
- expect(session.body).to include("Hello world!")
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
56
64
  end
57
65
  end
58
66
 
59
- describe ".server" do
60
- before do
61
- @old_server = Capybara.server
67
+ describe 'server=' do
68
+ after do
69
+ described_class.server = :default
62
70
  end
63
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
64
80
  after do
65
- Capybara.server(&@old_server)
81
+ described_class.app_host = nil
66
82
  end
67
83
 
68
- it "should default to a proc that calls run_default_server" do
69
- mock_app = double('app')
70
- expect(Capybara).to receive(:run_default_server).with(mock_app, 8000)
71
- Capybara.server.call(mock_app, 8000)
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/)
72
86
  end
73
87
 
74
- it "should return a custom server proc" do
75
- server = lambda {|app, port|}
76
- Capybara.server(&server)
77
- expect(Capybara.server).to eq(server)
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
78
94
  end
79
95
  end
80
- end
81
96
 
82
- RSpec.describe Capybara::Session do
83
- context 'with non-existant driver' do
84
- it "should raise an error" do
85
- expect {
86
- Capybara::Session.new(:quox, TestApp).driver
87
- }.to raise_error(Capybara::DriverNotFoundError)
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
88
110
  end
89
111
  end
90
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