capybara 3.32.2

Sign up to get free protection for your applications and to get access to all the features.
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