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,26 @@
1
+ <!doctype html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5
+ <title>with_jstree</title>
6
+ </head>
7
+ <body id="with_jstree">
8
+ <div id="container">
9
+ <ul>
10
+ <li>Child node A</li>
11
+ <li>Child node B</li>
12
+ <li>Child node C</li>
13
+ </ul>
14
+ </div>
15
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.2.1/jquery.min.js"></script>
16
+ <script src="https://cdnjs.cloudflare.com/ajax/libs/jstree/3.3.8/jstree.min.js"></script>
17
+ <script>
18
+ $(function () {
19
+ $('#container').jstree({
20
+ "core" : { "check_callback" : true }, // so that operations work
21
+ "plugins" : ["dnd"]
22
+ });
23
+ });
24
+ </script>
25
+ </body>
26
+ </html>
@@ -0,0 +1,20 @@
1
+ <html xmlns="http://www.w3.org/1999/xhtml">
2
+ <head>
3
+ <title>Namespace</title>
4
+ </head>
5
+ <body id="body">
6
+ <div>
7
+ <svg xmlns="http://www.w3.org/2000/svg" version="1.1"
8
+ viewBox="0 0 100 100" preserveAspectRatio="xMidYMid slice"
9
+ style="width:100%; height:100%; position:absolute; top:0; left:0; z-index:-1;">
10
+ <linearGradient id="gradient">
11
+ <stop class="begin" offset="0%"/>
12
+ <stop class="end" offset="100%"/>
13
+ </linearGradient>
14
+ <rect x="0" y="0" width="100" height="100" style="fill:url(#gradient)" />
15
+ <rect x="150" y="150" width="25" height="25" style="fill:url(#gradient)" />
16
+ <circle cx="50" cy="50" r="30" style="fill:url(#gradient)" />
17
+ </svg>
18
+ <div>
19
+ </body>
20
+ </html>
@@ -0,0 +1,42 @@
1
+
2
+ <h1>This page is used for testing various scopes</h1>
3
+
4
+ <p id="for_foo">
5
+ Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor
6
+ incididunt ut labore et dolore magna aliqua. Ut enim ad minim venia.
7
+ <a href="/redirect">Go</a>
8
+ <input name="disabled" disabled="disabled"/>
9
+ </p>
10
+
11
+ <div id="for_bar">
12
+ <ul>
13
+ <li>With Simple HTML: <a href="/with_simple_html">Go</a>
14
+ <form action="/redirect" method="post" accept-charset="utf-8">
15
+ <p>
16
+ <label for="simple_first_name">First Name</label>
17
+ <input type="text" name="first_name" value="John" id="simple_first_name"/>
18
+ </p>
19
+ <p><input type="submit" value="Go"/></p>
20
+ </form>
21
+ </li>
22
+ <li>Bar: <a href="/foo">Go</a>
23
+ <form action="/form" method="post" accept-charset="utf-8">
24
+ <p>
25
+ <label for="bar_first_name">First Name</label>
26
+ <input type="text" name="form[first_name]" value="Peter" id="bar_first_name"/>
27
+ </p>
28
+ <p>
29
+ <label for="bar_other_name">Other Name</label>
30
+ <input type="text" name="form[other_name]" value="James" id="bar_other_name" disabled="disabled"/>
31
+ </p>
32
+ <p><input type="submit" value="Go"/></p>
33
+ </form>
34
+ </li>
35
+ </ul>
36
+ </div>
37
+
38
+ <div id="another_foo">
39
+ <ul>
40
+ <li>With Simple HTML: <a href="/">Go</a>
41
+ </ul>
42
+ </div>
@@ -0,0 +1,6 @@
1
+
2
+ <h1>This page is used for testing various scopes</h1>
3
+
4
+ <p id="for_foo">
5
+ Different text same wrapper id
6
+ </p>
@@ -0,0 +1,17 @@
1
+ <html>
2
+ <head>
3
+ <script>
4
+ function delay_unload() {
5
+ var start = new Date();
6
+ var i = 0;
7
+ while ((new Date()) - start < 1000){ i = i + 1; };
8
+ return null;
9
+ }
10
+ window.onbeforeunload = delay_unload;
11
+ window.onunload = delay_unload;
12
+ </script>
13
+ </head>
14
+ <body>
15
+ <div>This delays unload by 2 seconds</div>
16
+ </body>
17
+ </html>
@@ -0,0 +1,21 @@
1
+ <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
2
+ <head>
3
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
4
+ <title>with_sortable_js</title>
5
+ <script src="https://sortablejs.github.io/Sortable/Sortable.js" type="text/javascript"></script>
6
+ </head>
7
+
8
+ <body id="with_sortable_js">
9
+ <div id="sortable">
10
+ <div class="item1">Item 1</div>
11
+ <div class="item2">Item 2</div>
12
+ <div class="item3">Item 3</div>
13
+ <div class="item4">Item 4</div>
14
+ <div class="item5">Item 5</div>
15
+ </div>
16
+ <script>
17
+ new Sortable(document.getElementById("sortable"));
18
+ </script>
19
+ </body>
20
+ </html>
21
+
@@ -0,0 +1,5 @@
1
+
2
+ <title>Test Title</title>
3
+ <body>
4
+ <svg><title>abcdefg</title></svg>
5
+ </body>
@@ -0,0 +1,14 @@
1
+ <html>
2
+ <head>
3
+ <script>
4
+ window.onbeforeunload = function(e) {
5
+ return 'Unload?';
6
+ };
7
+ </script>
8
+ </head>
9
+ <body>
10
+ <div>This triggers an alert on unload</div>
11
+
12
+ <a href="/">Go away</a>
13
+ </body>
14
+ </html>
@@ -0,0 +1,54 @@
1
+
2
+ <html>
3
+ <head>
4
+ <title>With Windows</title>
5
+ <script src="/jquery.js" type="text/javascript" charset="utf-8"></script>
6
+ <script language="javascript" type="text/javascript">
7
+ $(document).ready(function(){
8
+ $('#openWindow').click(function(){
9
+ window.open('/popup_one', 'firstPopup');
10
+ return false;
11
+ });
12
+
13
+ $('#openWindowWithTimeout').click(function(){
14
+ setTimeout(function(){
15
+ window.open('/popup_one', 'timeoutPopup');
16
+ }, 600);
17
+ return false;
18
+ });
19
+
20
+ $('#openWindowWithLongerTimeout').click(function(){
21
+ setTimeout(function(){
22
+ window.open('/popup_one', 'longerTimeoutPopup');
23
+ }, 1400);
24
+ return false;
25
+ });
26
+
27
+ $('#openTwoWindows').click(function() {
28
+ window.open('/popup_one', 'firstPopup');
29
+ window.open('/popup_two', 'secondPopup');
30
+ return false;
31
+ });
32
+
33
+ $('body').addClass('loaded');
34
+ });
35
+ </script>
36
+ </head>
37
+ <body>
38
+ <button id="openWindow">Open new window</button>
39
+
40
+ <button id="openWindowWithTimeout">Open new window with timeout</button>
41
+
42
+ <button id="openWindowWithLongerTimeout">Open new window with longer timeout</button>
43
+
44
+ <button id="openTwoWindows">Open two windows</button>
45
+
46
+ <button id="doesNotOpenWindows">Does not open windows</button>
47
+
48
+ <iframe src="/frame_one" id="frameOne"></iframe>
49
+
50
+ <div id="scope">
51
+ <span>My scoped content</span>
52
+ </div>
53
+ </body>
54
+ </html>
@@ -0,0 +1,15 @@
1
+
2
+ <html>
3
+ <head>
4
+ <title>With Frames</title>
5
+ </head>
6
+ <body>
7
+ <div id="divInMainWindow">
8
+ This is the text for divInMainWindow
9
+ <iframe src="/frame_parent" id="innerParentFrame"></iframe>
10
+ </div>
11
+ <iframe src="/frame_one" id="frameOne" name="my frame one"></iframe>
12
+ <iframe src="/frame_two" id="frameTwo"></iframe>
13
+ <iframe src="/frame_parent" id="parentFrame"></iframe>
14
+ </body>
15
+ </html>
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Capybara
4
+ VERSION = '3.32.2'
5
+ end
@@ -0,0 +1,146 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Capybara
4
+ ##
5
+ # The {Window} class represents a browser window.
6
+ #
7
+ # You can get an instance of the class by calling either of:
8
+ #
9
+ # * {Capybara::Session#windows}
10
+ # * {Capybara::Session#current_window}
11
+ # * {Capybara::Session#window_opened_by}
12
+ # * {Capybara::Session#switch_to_window}
13
+ #
14
+ # Note that some drivers (e.g. Selenium) support getting size of/resizing/closing only
15
+ # current window. So if you invoke such method for:
16
+ #
17
+ # * window that is current, Capybara will make 2 Selenium method invocations
18
+ # (get handle of current window + get size/resize/close).
19
+ # * window that is not current, Capybara will make 4 Selenium method invocations
20
+ # (get handle of current window + switch to given handle + get size/resize/close + switch to original handle)
21
+ #
22
+ class Window
23
+ # @return [String] a string that uniquely identifies window within session
24
+ attr_reader :handle
25
+
26
+ # @return [Capybara::Session] session that this window belongs to
27
+ attr_reader :session
28
+
29
+ # @api private
30
+ def initialize(session, handle)
31
+ @session = session
32
+ @driver = session.driver
33
+ @handle = handle
34
+ end
35
+
36
+ ##
37
+ # @return [Boolean] whether the window is not closed
38
+ def exists?
39
+ @driver.window_handles.include?(@handle)
40
+ end
41
+
42
+ ##
43
+ # @return [Boolean] whether the window is closed
44
+ def closed?
45
+ !exists?
46
+ end
47
+
48
+ ##
49
+ # @return [Boolean] whether this window is the window in which commands are being executed
50
+ def current?
51
+ @driver.current_window_handle == @handle
52
+ rescue @driver.no_such_window_error
53
+ false
54
+ end
55
+
56
+ ##
57
+ # Close window.
58
+ #
59
+ # If this method was called for window that is current, then after calling this method
60
+ # future invocations of other Capybara methods should raise
61
+ # {Capybara::Driver::Base#no_such_window_error session.driver.no_such_window_error} until another window will be switched to.
62
+ #
63
+ # @!macro about_current
64
+ # If this method was called for window that is not current, then after calling this method
65
+ # current window should remain the same as it was before calling this method.
66
+ #
67
+ def close
68
+ @driver.close_window(handle)
69
+ end
70
+
71
+ ##
72
+ # Get window size.
73
+ #
74
+ # @macro about_current
75
+ # @return [Array<(Integer, Integer)>] an array with width and height
76
+ #
77
+ def size
78
+ @driver.window_size(handle)
79
+ end
80
+
81
+ ##
82
+ # Resize window.
83
+ #
84
+ # @macro about_current
85
+ # @param width [String] the new window width in pixels
86
+ # @param height [String] the new window height in pixels
87
+ #
88
+ def resize_to(width, height)
89
+ wait_for_stable_size { @driver.resize_window_to(handle, width, height) }
90
+ end
91
+
92
+ ##
93
+ # Maximize window.
94
+ #
95
+ # If a particular driver (e.g. headless driver) doesn't have concept of maximizing it
96
+ # may not support this method.
97
+ #
98
+ # @macro about_current
99
+ #
100
+ def maximize
101
+ wait_for_stable_size { @driver.maximize_window(handle) }
102
+ end
103
+
104
+ ##
105
+ # Fullscreen window.
106
+ #
107
+ # If a particular driver doesn't have concept of fullscreen it may not support this method.
108
+ #
109
+ # @macro about_current
110
+ #
111
+ def fullscreen
112
+ @driver.fullscreen_window(handle)
113
+ end
114
+
115
+ def eql?(other)
116
+ other.is_a?(self.class) && @session == other.session && @handle == other.handle
117
+ end
118
+ alias_method :==, :eql?
119
+
120
+ def hash
121
+ @session.hash ^ @handle.hash
122
+ end
123
+
124
+ def inspect
125
+ "#<Window @handle=#{@handle.inspect}>"
126
+ end
127
+
128
+ private
129
+
130
+ def wait_for_stable_size(seconds = session.config.default_max_wait_time)
131
+ res = yield if block_given?
132
+ timer = Capybara::Helpers.timer(expire_in: seconds)
133
+ loop do
134
+ prev_size = size
135
+ sleep 0.025
136
+ return res if prev_size == size
137
+ break if timer.expired?
138
+ end
139
+ raise Capybara::WindowError, "Window size not stable within #{seconds} seconds."
140
+ end
141
+
142
+ def raise_unless_current(what)
143
+ raise Capybara::WindowError, "#{what} not current window is not possible." unless current?
144
+ end
145
+ end
146
+ end
@@ -0,0 +1,154 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Capybara do
6
+ describe '.string' do
7
+ let :string do
8
+ described_class.string <<-STRING
9
+ <html>
10
+ <head>
11
+ <title>simple_node</title>
12
+ </head>
13
+ <body>
14
+ <svg><title>not document title</title></svg>
15
+ <div id="page">
16
+ <div id="content">
17
+ <h1 data="fantastic">Totally awesome</h1>
18
+ <p>Yes it is</p>
19
+ </div>
20
+
21
+ <form>
22
+ <input type="text" name="bleh" disabled="disabled"/>
23
+ <input type="text" name="meh"/>
24
+ </form>
25
+
26
+ <div id="footer">
27
+ <p>c2010</p>
28
+ <p>Jonas Nicklas</p>
29
+ <input type="text" name="foo" value="bar"/>
30
+ <select name="animal">
31
+ <option>Monkey</option>
32
+ <option selected="selected">Capybara</option>
33
+ </select>
34
+ </div>
35
+
36
+ <div id="hidden" style="display: none">
37
+ <p id="secret">Secret</p>
38
+ </div>
39
+
40
+ <section>
41
+ <div class="subsection"></div>
42
+ </section>
43
+ </div>
44
+ </body>
45
+ </html>
46
+ STRING
47
+ end
48
+
49
+ it 'allows using matchers' do
50
+ expect(string).to have_css('#page')
51
+ expect(string).not_to have_css('#does-not-exist')
52
+ end
53
+
54
+ it 'allows using custom matchers' do
55
+ described_class.add_selector :lifeform do
56
+ xpath { |name| ".//option[contains(.,'#{name}')]" }
57
+ end
58
+ expect(string).to have_selector(:id, 'page')
59
+ expect(string).not_to have_selector(:id, 'does-not-exist')
60
+ expect(string).to have_selector(:lifeform, 'Monkey')
61
+ expect(string).not_to have_selector(:lifeform, 'Gorilla')
62
+ end
63
+
64
+ it 'allows custom matcher using css' do
65
+ described_class.add_selector :section do
66
+ css { |css_class| "section .#{css_class}" }
67
+ end
68
+ expect(string).to have_selector(:section, 'subsection')
69
+ expect(string).not_to have_selector(:section, 'section_8')
70
+ end
71
+
72
+ it 'allows using matchers with text option' do
73
+ expect(string).to have_css('h1', text: 'Totally awesome')
74
+ expect(string).not_to have_css('h1', text: 'Not so awesome')
75
+ end
76
+
77
+ it 'allows finding only visible nodes' do
78
+ expect(string.all(:css, '#secret', visible: true)).to be_empty
79
+ expect(string.all(:css, '#secret', visible: false).size).to eq(1)
80
+ end
81
+
82
+ it 'allows finding elements and extracting text from them' do
83
+ expect(string.find('//h1').text).to eq('Totally awesome')
84
+ end
85
+
86
+ it 'allows finding elements and extracting attributes from them' do
87
+ expect(string.find('//h1')[:data]).to eq('fantastic')
88
+ end
89
+
90
+ it 'allows finding elements and extracting the tag name from them' do
91
+ expect(string.find('//h1').tag_name).to eq('h1')
92
+ end
93
+
94
+ it 'allows finding elements and extracting the path' do
95
+ expect(string.find('//h1').path).to eq('/html/body/div/div[1]/h1')
96
+ end
97
+
98
+ it 'allows finding elements and extracting the value' do
99
+ expect(string.find('//div/input').value).to eq('bar')
100
+ expect(string.find('//select').value).to eq('Capybara')
101
+ end
102
+
103
+ it 'allows finding elements and checking if they are visible' do
104
+ expect(string.find('//h1')).to be_visible
105
+ expect(string.find(:css, '#secret', visible: false)).not_to be_visible
106
+ end
107
+
108
+ it 'allows finding elements and checking if they are disabled' do
109
+ expect(string.find('//form/input[@name="bleh"]')).to be_disabled
110
+ expect(string.find('//form/input[@name="meh"]')).not_to be_disabled
111
+ end
112
+
113
+ it 'drops illegal fragments when using gumbo' do
114
+ skip 'libxml is less strict than Gumbo' unless Nokogiri.respond_to?(:HTML5)
115
+ expect(described_class.string('<td>1</td>')).not_to have_css('td')
116
+ end
117
+
118
+ it 'can disable use of gumbo' do
119
+ skip "Test doesn't make sense unlesss nokogumbo is loaded" unless Nokogiri.respond_to?(:HTML5)
120
+ described_class.allow_gumbo = false
121
+ expect(described_class.string('<td>1</td>')).to have_css('td')
122
+ end
123
+
124
+ describe '#title' do
125
+ it 'returns the page title' do
126
+ expect(string.title).to eq('simple_node')
127
+ end
128
+ end
129
+
130
+ describe '#has_title?' do
131
+ it 'returns whether the page has the given title' do
132
+ expect(string.has_title?('simple_node')).to be_truthy
133
+ expect(string.has_title?('monkey')).to be_falsey
134
+ end
135
+
136
+ it 'allows regexp matches' do
137
+ expect(string.has_title?(/s[a-z]+_node/)).to be_truthy
138
+ expect(string.has_title?(/monkey/)).to be_falsey
139
+ end
140
+ end
141
+
142
+ describe '#has_no_title?' do
143
+ it 'returns whether the page does not have the given title' do
144
+ expect(string.has_no_title?('simple_node')).to be_falsey
145
+ expect(string.has_no_title?('monkey')).to be_truthy
146
+ end
147
+
148
+ it 'allows regexp matches' do
149
+ expect(string.has_no_title?(/s[a-z]+_node/)).to be_falsey
150
+ expect(string.has_no_title?(/monkey/)).to be_truthy
151
+ end
152
+ end
153
+ end
154
+ end