capybara 2.18.0 → 3.40.0

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 (316) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/History.md +945 -12
  4. data/License.txt +1 -1
  5. data/README.md +264 -90
  6. data/lib/capybara/config.rb +29 -57
  7. data/lib/capybara/cucumber.rb +2 -3
  8. data/lib/capybara/driver/base.rb +35 -18
  9. data/lib/capybara/driver/node.rb +40 -10
  10. data/lib/capybara/dsl.rb +10 -7
  11. data/lib/capybara/helpers.rb +70 -31
  12. data/lib/capybara/minitest/spec.rb +185 -83
  13. data/lib/capybara/minitest.rb +232 -112
  14. data/lib/capybara/node/actions.rb +274 -171
  15. data/lib/capybara/node/base.rb +42 -34
  16. data/lib/capybara/node/document.rb +15 -3
  17. data/lib/capybara/node/document_matchers.rb +19 -21
  18. data/lib/capybara/node/element.rb +362 -135
  19. data/lib/capybara/node/finders.rb +151 -137
  20. data/lib/capybara/node/matchers.rb +394 -209
  21. data/lib/capybara/node/simple.rb +59 -26
  22. data/lib/capybara/node/whitespace_normalizer.rb +81 -0
  23. data/lib/capybara/queries/active_element_query.rb +18 -0
  24. data/lib/capybara/queries/ancestor_query.rb +12 -9
  25. data/lib/capybara/queries/base_query.rb +39 -28
  26. data/lib/capybara/queries/current_path_query.rb +21 -27
  27. data/lib/capybara/queries/match_query.rb +14 -7
  28. data/lib/capybara/queries/selector_query.rb +659 -149
  29. data/lib/capybara/queries/sibling_query.rb +11 -9
  30. data/lib/capybara/queries/style_query.rb +45 -0
  31. data/lib/capybara/queries/text_query.rb +56 -38
  32. data/lib/capybara/queries/title_query.rb +8 -11
  33. data/lib/capybara/rack_test/browser.rb +114 -42
  34. data/lib/capybara/rack_test/css_handlers.rb +6 -4
  35. data/lib/capybara/rack_test/driver.rb +22 -17
  36. data/lib/capybara/rack_test/errors.rb +6 -0
  37. data/lib/capybara/rack_test/form.rb +93 -58
  38. data/lib/capybara/rack_test/node.rb +184 -81
  39. data/lib/capybara/rails.rb +3 -7
  40. data/lib/capybara/registration_container.rb +41 -0
  41. data/lib/capybara/registrations/drivers.rb +42 -0
  42. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  43. data/lib/capybara/registrations/servers.rb +66 -0
  44. data/lib/capybara/result.rb +97 -63
  45. data/lib/capybara/rspec/features.rb +17 -50
  46. data/lib/capybara/rspec/matcher_proxies.rb +52 -15
  47. data/lib/capybara/rspec/matchers/base.rb +113 -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 +69 -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 +43 -0
  59. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  60. data/lib/capybara/rspec/matchers.rb +146 -310
  61. data/lib/capybara/rspec.rb +7 -11
  62. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  63. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  64. data/lib/capybara/selector/css.rb +85 -13
  65. data/lib/capybara/selector/definition/button.rb +68 -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 +28 -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 +55 -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/definition.rb +280 -0
  87. data/lib/capybara/selector/filter.rb +2 -17
  88. data/lib/capybara/selector/filter_set.rb +80 -33
  89. data/lib/capybara/selector/filters/base.rb +50 -6
  90. data/lib/capybara/selector/filters/expression_filter.rb +8 -26
  91. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  92. data/lib/capybara/selector/filters/node_filter.rb +16 -12
  93. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  94. data/lib/capybara/selector/selector.rb +93 -210
  95. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  96. data/lib/capybara/selector.rb +475 -523
  97. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  98. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  99. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  100. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  101. data/lib/capybara/selenium/driver.rb +298 -267
  102. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  103. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
  104. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
  105. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  106. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  107. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  108. data/lib/capybara/selenium/extensions/find.rb +110 -0
  109. data/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
  110. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  111. data/lib/capybara/selenium/extensions/scroll.rb +76 -0
  112. data/lib/capybara/selenium/node.rb +517 -145
  113. data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
  114. data/lib/capybara/selenium/nodes/edge_node.rb +110 -0
  115. data/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
  116. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  117. data/lib/capybara/selenium/nodes/safari_node.rb +118 -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 +80 -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 +59 -67
  127. data/lib/capybara/session/config.rb +81 -67
  128. data/lib/capybara/session/matchers.rb +28 -20
  129. data/lib/capybara/session.rb +337 -365
  130. data/lib/capybara/spec/public/jquery.js +5 -5
  131. data/lib/capybara/spec/public/offset.js +6 -0
  132. data/lib/capybara/spec/public/test.js +151 -12
  133. data/lib/capybara/spec/session/accept_alert_spec.rb +12 -11
  134. data/lib/capybara/spec/session/accept_confirm_spec.rb +6 -5
  135. data/lib/capybara/spec/session/accept_prompt_spec.rb +10 -10
  136. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  137. data/lib/capybara/spec/session/all_spec.rb +161 -57
  138. data/lib/capybara/spec/session/ancestor_spec.rb +27 -24
  139. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +68 -38
  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.rb → assert_title_spec.rb} +22 -12
  145. data/lib/capybara/spec/session/attach_file_spec.rb +144 -69
  146. data/lib/capybara/spec/session/body_spec.rb +12 -13
  147. data/lib/capybara/spec/session/check_spec.rb +117 -55
  148. data/lib/capybara/spec/session/choose_spec.rb +64 -31
  149. data/lib/capybara/spec/session/click_button_spec.rb +231 -173
  150. data/lib/capybara/spec/session/click_link_or_button_spec.rb +55 -35
  151. data/lib/capybara/spec/session/click_link_spec.rb +93 -58
  152. data/lib/capybara/spec/session/current_scope_spec.rb +12 -11
  153. data/lib/capybara/spec/session/current_url_spec.rb +57 -39
  154. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +4 -4
  155. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +3 -2
  156. data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +11 -9
  157. data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
  158. data/lib/capybara/spec/session/element/match_xpath_spec.rb +9 -7
  159. data/lib/capybara/spec/session/element/matches_selector_spec.rb +71 -57
  160. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +8 -7
  161. data/lib/capybara/spec/session/evaluate_script_spec.rb +29 -8
  162. data/lib/capybara/spec/session/execute_script_spec.rb +10 -8
  163. data/lib/capybara/spec/session/fill_in_spec.rb +134 -43
  164. data/lib/capybara/spec/session/find_button_spec.rb +25 -24
  165. data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
  166. data/lib/capybara/spec/session/find_field_spec.rb +37 -41
  167. data/lib/capybara/spec/session/find_link_spec.rb +46 -17
  168. data/lib/capybara/spec/session/find_spec.rb +260 -145
  169. data/lib/capybara/spec/session/first_spec.rb +80 -52
  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 +33 -20
  173. data/lib/capybara/spec/session/frame/within_frame_spec.rb +52 -32
  174. data/lib/capybara/spec/session/go_back_spec.rb +2 -1
  175. data/lib/capybara/spec/session/go_forward_spec.rb +2 -1
  176. data/lib/capybara/spec/session/has_all_selectors_spec.rb +31 -31
  177. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  178. data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
  179. data/lib/capybara/spec/session/has_button_spec.rb +100 -13
  180. data/lib/capybara/spec/session/has_css_spec.rb +272 -137
  181. data/lib/capybara/spec/session/has_current_path_spec.rb +60 -61
  182. data/lib/capybara/spec/session/has_element_spec.rb +47 -0
  183. data/lib/capybara/spec/session/has_field_spec.rb +139 -59
  184. data/lib/capybara/spec/session/has_link_spec.rb +47 -6
  185. data/lib/capybara/spec/session/has_none_selectors_spec.rb +42 -40
  186. data/lib/capybara/spec/session/has_select_spec.rb +107 -72
  187. data/lib/capybara/spec/session/has_selector_spec.rb +120 -71
  188. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  189. data/lib/capybara/spec/session/has_table_spec.rb +183 -5
  190. data/lib/capybara/spec/session/has_text_spec.rb +106 -62
  191. data/lib/capybara/spec/session/has_title_spec.rb +20 -14
  192. data/lib/capybara/spec/session/has_xpath_spec.rb +57 -38
  193. data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +3 -2
  194. data/lib/capybara/spec/session/html_spec.rb +14 -6
  195. data/lib/capybara/spec/session/matches_style_spec.rb +37 -0
  196. data/lib/capybara/spec/session/node_spec.rb +1024 -153
  197. data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  198. data/lib/capybara/spec/session/refresh_spec.rb +12 -6
  199. data/lib/capybara/spec/session/reset_session_spec.rb +82 -35
  200. data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +2 -1
  201. data/lib/capybara/spec/session/save_and_open_page_spec.rb +3 -2
  202. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +8 -12
  203. data/lib/capybara/spec/session/save_page_spec.rb +42 -55
  204. data/lib/capybara/spec/session/save_screenshot_spec.rb +16 -14
  205. data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
  206. data/lib/capybara/spec/session/scroll_spec.rb +119 -0
  207. data/lib/capybara/spec/session/select_spec.rb +107 -81
  208. data/lib/capybara/spec/session/selectors_spec.rb +52 -19
  209. data/lib/capybara/spec/session/sibling_spec.rb +10 -10
  210. data/lib/capybara/spec/session/text_spec.rb +37 -21
  211. data/lib/capybara/spec/session/title_spec.rb +17 -5
  212. data/lib/capybara/spec/session/uncheck_spec.rb +43 -23
  213. data/lib/capybara/spec/session/unselect_spec.rb +39 -38
  214. data/lib/capybara/spec/session/visit_spec.rb +85 -53
  215. data/lib/capybara/spec/session/window/become_closed_spec.rb +24 -20
  216. data/lib/capybara/spec/session/window/current_window_spec.rb +5 -3
  217. data/lib/capybara/spec/session/window/open_new_window_spec.rb +5 -3
  218. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +27 -22
  219. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +12 -6
  220. data/lib/capybara/spec/session/window/window_spec.rb +97 -63
  221. data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
  222. data/lib/capybara/spec/session/window/within_window_spec.rb +31 -86
  223. data/lib/capybara/spec/session/within_spec.rb +83 -44
  224. data/lib/capybara/spec/spec_helper.rb +54 -44
  225. data/lib/capybara/spec/test_app.rb +158 -43
  226. data/lib/capybara/spec/views/animated.erb +49 -0
  227. data/lib/capybara/spec/views/form.erb +163 -42
  228. data/lib/capybara/spec/views/frame_child.erb +4 -3
  229. data/lib/capybara/spec/views/frame_one.erb +2 -1
  230. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  231. data/lib/capybara/spec/views/frame_two.erb +1 -1
  232. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  233. data/lib/capybara/spec/views/layout.erb +10 -0
  234. data/lib/capybara/spec/views/obscured.erb +47 -0
  235. data/lib/capybara/spec/views/offset.erb +33 -0
  236. data/lib/capybara/spec/views/path.erb +2 -2
  237. data/lib/capybara/spec/views/popup_one.erb +1 -1
  238. data/lib/capybara/spec/views/popup_two.erb +1 -1
  239. data/lib/capybara/spec/views/react.erb +45 -0
  240. data/lib/capybara/spec/views/scroll.erb +21 -0
  241. data/lib/capybara/spec/views/spatial.erb +31 -0
  242. data/lib/capybara/spec/views/tables.erb +68 -1
  243. data/lib/capybara/spec/views/with_animation.erb +81 -0
  244. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  245. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  246. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  247. data/lib/capybara/spec/views/with_hover.erb +3 -2
  248. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  249. data/lib/capybara/spec/views/with_html.erb +69 -12
  250. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  251. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  252. data/lib/capybara/spec/views/with_js.erb +30 -5
  253. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  254. data/lib/capybara/spec/views/with_namespace.erb +21 -0
  255. data/lib/capybara/spec/views/with_scope.erb +2 -2
  256. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  257. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  258. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  259. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  260. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  261. data/lib/capybara/spec/views/with_windows.erb +1 -1
  262. data/lib/capybara/spec/views/within_frames.erb +5 -2
  263. data/lib/capybara/version.rb +2 -1
  264. data/lib/capybara/window.rb +36 -34
  265. data/lib/capybara.rb +134 -107
  266. data/spec/basic_node_spec.rb +60 -34
  267. data/spec/capybara_spec.rb +63 -88
  268. data/spec/counter_spec.rb +35 -0
  269. data/spec/css_builder_spec.rb +101 -0
  270. data/spec/css_splitter_spec.rb +38 -0
  271. data/spec/dsl_spec.rb +85 -64
  272. data/spec/filter_set_spec.rb +27 -9
  273. data/spec/fixtures/certificate.pem +25 -0
  274. data/spec/fixtures/key.pem +27 -0
  275. data/spec/fixtures/selenium_driver_rspec_failure.rb +6 -5
  276. data/spec/fixtures/selenium_driver_rspec_success.rb +6 -5
  277. data/spec/minitest_spec.rb +52 -7
  278. data/spec/minitest_spec_spec.rb +94 -63
  279. data/spec/per_session_config_spec.rb +14 -13
  280. data/spec/rack_test_spec.rb +194 -125
  281. data/spec/regexp_dissassembler_spec.rb +250 -0
  282. data/spec/result_spec.rb +111 -50
  283. data/spec/rspec/features_spec.rb +37 -31
  284. data/spec/rspec/scenarios_spec.rb +10 -8
  285. data/spec/rspec/shared_spec_matchers.rb +473 -422
  286. data/spec/rspec/views_spec.rb +5 -3
  287. data/spec/rspec_matchers_spec.rb +52 -11
  288. data/spec/rspec_spec.rb +109 -89
  289. data/spec/sauce_spec_chrome.rb +43 -0
  290. data/spec/selector_spec.rb +397 -68
  291. data/spec/selenium_spec_chrome.rb +187 -40
  292. data/spec/selenium_spec_chrome_remote.rb +96 -0
  293. data/spec/selenium_spec_edge.rb +60 -0
  294. data/spec/selenium_spec_firefox.rb +201 -41
  295. data/spec/selenium_spec_firefox_remote.rb +94 -0
  296. data/spec/selenium_spec_ie.rb +149 -0
  297. data/spec/selenium_spec_safari.rb +162 -0
  298. data/spec/server_spec.rb +213 -102
  299. data/spec/session_spec.rb +53 -16
  300. data/spec/shared_selenium_node.rb +79 -0
  301. data/spec/shared_selenium_session.rb +473 -122
  302. data/spec/spec_helper.rb +126 -7
  303. data/spec/whitespace_normalizer_spec.rb +54 -0
  304. data/spec/xpath_builder_spec.rb +93 -0
  305. metadata +355 -73
  306. data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
  307. data/.yard/templates_custom/default/class/html/setup.rb +0 -17
  308. data/.yard/yard_extensions.rb +0 -78
  309. data/lib/capybara/query.rb +0 -7
  310. data/lib/capybara/rspec/compound.rb +0 -95
  311. data/lib/capybara/spec/session/assert_current_path.rb +0 -72
  312. data/lib/capybara/spec/session/assert_selector.rb +0 -148
  313. data/lib/capybara/spec/session/assert_text.rb +0 -234
  314. data/lib/capybara/spec/session/source_spec.rb +0 -0
  315. data/lib/capybara/spec/views/with_title.erb +0 -5
  316. data/spec/selenium_spec_marionette.rb +0 -127
@@ -1,21 +1,108 @@
1
1
  var activeRequests = 0;
2
2
  $(function() {
3
3
  $('#change').text('I changed it');
4
- $('#drag, #drag_scroll').draggable();
4
+ $('#drag, #drag_scroll, #drag_link').draggable({
5
+ start: function(event, ui){
6
+ $(document.body).append(
7
+ "<div class='drag_start'>Dragged!" +
8
+ (event.altKey ? "-alt" : "") +
9
+ (event.ctrlKey ? "-ctrl" : "") +
10
+ (event.metaKey ? "-meta" : "") +
11
+ (event.shiftKey ? "-shift" : "") +
12
+ "</div>"
13
+ );
14
+ }
15
+ });
5
16
  $('#drop, #drop_scroll').droppable({
17
+ tolerance: 'touch',
6
18
  drop: function(event, ui) {
7
19
  ui.draggable.remove();
8
- $(this).html('Dropped!');
20
+ $(this).html(
21
+ "Dropped!" +
22
+ (event.altKey ? "-alt" : "") +
23
+ (event.ctrlKey ? "-ctrl" : "") +
24
+ (event.metaKey ? "-meta" : "") +
25
+ (event.shiftKey ? "-shift" : "")
26
+ );
9
27
  }
10
28
  });
11
- $('#clickable').click(function() {
29
+ $('#drag_html5, #drag_html5_scroll').on('dragstart', function(ev){
30
+ $(document.body).append(
31
+ "<div class='drag_start'>HTML5 Dragged!" +
32
+ (event.altKey ? "-alt" : "") +
33
+ (event.ctrlKey ? "-ctrl" : "") +
34
+ (event.metaKey ? "-meta" : "") +
35
+ (event.shiftKey ? "-shift" : "") +
36
+ "</div>"
37
+ );
38
+ ev.originalEvent.dataTransfer.setData("text", ev.target.id);
39
+ });
40
+ $('#drag_html5, #drag_html5_scroll').on('dragend', function(ev){
41
+ $(this).after('<div class="log">DragEnd with client position: ' + ev.clientX + ',' + ev.clientY)
42
+ });
43
+ $('#drop_html5, #drop_html5_scroll').on('dragover', function(ev){
44
+ $(this).after('<div class="log">DragOver with client position: ' + ev.clientX + ',' + ev.clientY)
45
+ if ($(this).hasClass('drop')) { ev.preventDefault(); }
46
+ });
47
+ $('#drop_html5, #drop_html5_scroll').on('dragenter', function(ev){
48
+ $(this).after('<div class="log">DragEnter')
49
+ if ($(this).hasClass('drop')) { ev.preventDefault(); }
50
+ });
51
+ $('#drop_html5, #drop_html5_scroll').on('dragleave', function(ev){
52
+ $(this).after('<div class="log">DragLeave with client position: ' + ev.clientX + ',' + ev.clientY)
53
+ if ($(this).hasClass('drop')) { ev.preventDefault(); }
54
+ });
55
+ $('#drop_html5, #drop_html5_scroll').on('drop', function(ev){
56
+ $(this).after('<div class="log">Drop with client position: ' + ev.clientX + ',' + ev.clientY)
57
+ if ($(this).hasClass('drop')) { ev.preventDefault(); }
58
+ });
59
+ $('#drop_html5, #drop_html5_scroll').on('drop', function(ev){
60
+ ev.preventDefault();
61
+ var oev = ev.originalEvent;
62
+ if (oev.dataTransfer.items) {
63
+ for (var i = 0; i < oev.dataTransfer.items.length; i++){
64
+ var item = oev.dataTransfer.items[i];
65
+ if (item.kind === 'file'){
66
+ var file = item.getAsFile();
67
+ $(this).append('HTML5 Dropped file: ' + file.name);
68
+ } else {
69
+ var _this = this;
70
+ var callback = (function(type) {
71
+ return function(s) {
72
+ $(_this).append(
73
+ "HTML5 Dropped string: " +
74
+ type +
75
+ " " +
76
+ s +
77
+ (ev.altKey ? "-alt" : "") +
78
+ (ev.ctrlKey ? "-ctrl" : "") +
79
+ (ev.metaKey ? "-meta" : "") +
80
+ (ev.shiftKey ? "-shift" : "")
81
+ );
82
+ };
83
+ })(item.type);
84
+ item.getAsString(callback);
85
+ }
86
+ }
87
+ } else {
88
+ $(this).html('HTML5 Dropped ' + oev.dataTransfer.getData("text"));
89
+ for (var i = 0; i < oev.dataTransfer.files.length; i++) {
90
+ $(this).append('HTML5 Dropped file: ' + oev.dataTransfer.files[i].name);
91
+ }
92
+ for (var i = 0; i < oev.dataTransfer.types.length; i++) {
93
+ var type = oev.dataTransfer.types[i];
94
+ $(this).append('HTML5 Dropped string: ' + type + ' ' + oev.dataTransfer.getData(type));
95
+ }
96
+ }
97
+ });
98
+ $('#clickable').click(function(e) {
12
99
  var link = $(this);
13
100
  setTimeout(function() {
14
101
  $(link).after('<a id="has-been-clicked" href="#">Has been clicked</a>');
15
102
  $(link).after('<input type="submit" value="New Here">');
16
103
  $(link).after('<input type="text" id="new_field">');
17
104
  $('#change').remove();
18
- }, 500);
105
+ }, 1000);
19
106
  return false;
20
107
  });
21
108
  $('#slow-click').click(function() {
@@ -25,6 +112,13 @@ $(function() {
25
112
  }, 4000);
26
113
  return false;
27
114
  });
115
+ $('#aria-button').click(function() {
116
+ var span = $(this);
117
+ setTimeout(function() {
118
+ $(span).after('<span role="button">ARIA button has been clicked</span>')
119
+ }, 1000);
120
+ return false;
121
+ });
28
122
  $('#waiter').change(function() {
29
123
  activeRequests = 1;
30
124
  setTimeout(function() {
@@ -63,13 +157,50 @@ $(function() {
63
157
  $('title').text('changed title')
64
158
  }, 400)
65
159
  });
160
+ $('#change-size').click(function() {
161
+ setTimeout(function() {
162
+ document.getElementById('change').style.fontSize = '50px';
163
+ }, 500)
164
+ });
66
165
  $('#click-test').on({
67
- dblclick: function() {
68
- $(this).after('<a id="has-been-double-clicked" href="#">Has been double clicked</a>');
166
+ click: function(e) {
167
+ window.click_delay = ((new Date().getTime()) - window.mouse_down_time)/1000.0;
168
+ var desc = "";
169
+ if (e.altKey) desc += 'alt ';
170
+ if (e.ctrlKey) desc += 'control ';
171
+ if (e.metaKey) desc += 'meta ';
172
+ if (e.shiftKey) desc += 'shift ';
173
+ var pos = this.getBoundingClientRect();
174
+ $(this).after('<a id="has-been-clicked" href="#">Has been ' + desc + 'clicked at ' + (e.clientX - pos.left) + ',' + (e.clientY - pos.top) + '</a>');
175
+ },
176
+ dblclick: function(e) {
177
+ var desc = "";
178
+ if (e.altKey) desc += 'alt ';
179
+ if (e.ctrlKey) desc += 'control ';
180
+ if (e.metaKey) desc += 'meta ';
181
+ if (e.shiftKey) desc += 'shift ';
182
+ var pos = this.getBoundingClientRect();
183
+ $(this).after('<a id="has-been-double-clicked" href="#">Has been ' + desc + 'double clicked at ' + (e.clientX - pos.left) + ',' + (e.clientY - pos.top) + '</a>');
69
184
  },
70
185
  contextmenu: function(e) {
71
186
  e.preventDefault();
72
- $(this).after('<a id="has-been-right-clicked" href="#">Has been right clicked</a>');
187
+ var desc = "";
188
+ if (e.altKey) desc += 'alt ';
189
+ if (e.ctrlKey) desc += 'control ';
190
+ if (e.metaKey) desc += 'meta ';
191
+ if (e.shiftKey) desc += 'shift ';
192
+ var pos = this.getBoundingClientRect();
193
+ $(this).after('<a id="has-been-right-clicked" href="#">Has been ' + desc + 'right clicked at ' + (e.clientX - pos.left) + ',' + (e.clientY - pos.top) + '</a>');
194
+ },
195
+ mousedown: function(e) {
196
+ window.click_delay = undefined;
197
+ window.right_click_delay = undefined;
198
+ window.mouse_down_time = new Date().getTime();
199
+ },
200
+ mouseup: function(e) {
201
+ if (e.button == 2){
202
+ window.right_click_delay = ((new Date().getTime()) - window.mouse_down_time)/1000.0;
203
+ }
73
204
  }
74
205
  });
75
206
  $('#open-alert').click(function() {
@@ -123,23 +254,31 @@ $(function() {
123
254
  $(this).attr('confirmed', 'false');
124
255
  }
125
256
  }
126
- })
257
+ });
127
258
  $('#delayed-page-change').click(function() {
128
259
  setTimeout(function() {
129
260
  window.location.pathname = '/with_html'
130
261
  }, 500)
131
- })
262
+ });
132
263
  $('#with-key-events').keydown(function(e){
133
264
  $('#key-events-output').append('keydown:'+e.which+' ')
134
265
  });
135
266
  $('#disable-on-click').click(function(e){
136
- var input = this
267
+ var input = this;
137
268
  setTimeout(function() {
138
269
  input.disabled = true;
139
270
  }, 500)
140
- })
271
+ });
141
272
  $('#set-storage').click(function(e){
142
273
  sessionStorage.setItem('session', 'session_value');
143
274
  localStorage.setItem('local', 'local value');
144
- })
275
+ });
276
+ $('#multiple-file, #hidden_file').change(function(e){
277
+ $('body').append($('<p class="file_change">File input changed</p>'));
278
+ });
279
+
280
+ var shadow = document.querySelector('#shadow').attachShadow({mode: 'open'});
281
+ var span = document.createElement('span');
282
+ span.textContent = 'The things we do in the shadows';
283
+ shadow.appendChild(span);
145
284
  });
@@ -1,17 +1,18 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#accept_alert', requires: [:modals] do
3
4
  before do
4
5
  @session.visit('/with_js')
5
6
  end
6
7
 
7
- it "should accept the alert" do
8
+ it 'should accept the alert' do
8
9
  @session.accept_alert do
9
10
  @session.click_link('Open alert')
10
11
  end
11
12
  expect(@session).to have_xpath("//a[@id='open-alert' and @opened='true']")
12
13
  end
13
14
 
14
- it "should accept the alert if the text matches" do
15
+ it 'should accept the alert if the text matches' do
15
16
  @session.accept_alert 'Alert opened' do
16
17
  @session.click_link('Open alert')
17
18
  end
@@ -25,14 +26,14 @@ Capybara::SpecHelper.spec '#accept_alert', requires: [:modals] do
25
26
  expect(@session).to have_xpath("//a[@id='open-alert' and @opened='true']")
26
27
  end
27
28
 
28
- it "should accept the alert if the text matches a regexp" do
29
+ it 'should accept the alert if the text matches a regexp' do
29
30
  @session.accept_alert(/op.{2}ed/) do
30
31
  @session.click_link('Open alert')
31
32
  end
32
33
  expect(@session).to have_xpath("//a[@id='open-alert' and @opened='true']")
33
34
  end
34
35
 
35
- it "should not accept the alert if the text doesnt match" do
36
+ it 'should not accept the alert if the text doesnt match' do
36
37
  expect do
37
38
  @session.accept_alert 'Incorrect Text' do
38
39
  @session.click_link('Open alert')
@@ -40,37 +41,37 @@ Capybara::SpecHelper.spec '#accept_alert', requires: [:modals] do
40
41
  end.to raise_error(Capybara::ModalNotFound)
41
42
  end
42
43
 
43
- it "should return the message presented" do
44
+ it 'should return the message presented' do
44
45
  message = @session.accept_alert do
45
46
  @session.click_link('Open alert')
46
47
  end
47
48
  expect(message).to eq('Alert opened [*Yay?*]')
48
49
  end
49
50
 
50
- it "should handle the alert if the page changes" do
51
+ it 'should handle the alert if the page changes' do
51
52
  @session.accept_alert do
52
53
  @session.click_link('Alert page change')
53
54
  sleep 1 # ensure page change occurs before the accept_alert block exits
54
55
  end
55
- expect(@session).to have_current_path('/with_html')
56
+ expect(@session).to have_current_path('/with_html', wait: 5)
56
57
  end
57
58
 
58
- context "with an asynchronous alert" do
59
- it "should accept the alert" do
59
+ context 'with an asynchronous alert' do
60
+ it 'should accept the alert' do
60
61
  @session.accept_alert do
61
62
  @session.click_link('Open delayed alert')
62
63
  end
63
64
  expect(@session).to have_xpath("//a[@id='open-delayed-alert' and @opened='true']")
64
65
  end
65
66
 
66
- it "should return the message presented" do
67
+ it 'should return the message presented' do
67
68
  message = @session.accept_alert do
68
69
  @session.click_link('Open delayed alert')
69
70
  end
70
71
  expect(message).to eq('Delayed alert opened')
71
72
  end
72
73
 
73
- it "should allow to adjust the delay" do
74
+ it 'should allow to adjust the delay' do
74
75
  @session.accept_alert wait: 10 do
75
76
  @session.click_link('Open slow alert')
76
77
  end
@@ -1,31 +1,32 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#accept_confirm', requires: [:modals] do
3
4
  before do
4
5
  @session.visit('/with_js')
5
6
  end
6
7
 
7
- it "should accept the confirm" do
8
+ it 'should accept the confirm' do
8
9
  @session.accept_confirm do
9
10
  @session.click_link('Open confirm')
10
11
  end
11
12
  expect(@session).to have_xpath("//a[@id='open-confirm' and @confirmed='true']")
12
13
  end
13
14
 
14
- it "should return the message presented" do
15
+ it 'should return the message presented' do
15
16
  message = @session.accept_confirm do
16
17
  @session.click_link('Open confirm')
17
18
  end
18
19
  expect(message).to eq('Confirm opened')
19
20
  end
20
21
 
21
- it "should work with nested modals" do
22
- expect {
22
+ it 'should work with nested modals' do
23
+ expect do
23
24
  @session.dismiss_confirm 'Are you really sure?' do
24
25
  @session.accept_confirm 'Are you sure?' do
25
26
  @session.click_link('Open check twice')
26
27
  end
27
28
  end
28
- }.not_to raise_error
29
+ end.not_to raise_error
29
30
  expect(@session).to have_xpath("//a[@id='open-twice' and @confirmed='false']")
30
31
  end
31
32
  end
@@ -1,60 +1,60 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#accept_prompt', requires: [:modals] do
3
4
  before do
4
5
  @session.visit('/with_js')
5
6
  end
6
7
 
7
- it "should accept the prompt with no message" do
8
+ it 'should accept the prompt with no message' do
8
9
  @session.accept_prompt do
9
10
  @session.click_link('Open prompt')
10
11
  end
11
12
  expect(@session).to have_xpath("//a[@id='open-prompt' and @response='']")
12
13
  end
13
14
 
14
- it "should accept the prompt with no message when there is a default" do
15
+ it 'should accept the prompt with no message when there is a default' do
15
16
  @session.accept_prompt do
16
17
  @session.click_link('Open defaulted prompt')
17
18
  end
18
19
  expect(@session).to have_xpath("//a[@id='open-prompt-with-default' and @response='Default value!']")
19
20
  end
20
21
 
21
- it "should return the message presented" do
22
+ it 'should return the message presented' do
22
23
  message = @session.accept_prompt do
23
24
  @session.click_link('Open prompt')
24
25
  end
25
26
  expect(message).to eq('Prompt opened')
26
27
  end
27
28
 
28
- it "should accept the prompt with a response" do
29
+ it 'should accept the prompt with a response' do
29
30
  @session.accept_prompt with: 'the response' do
30
31
  @session.click_link('Open prompt')
31
32
  end
32
33
  expect(@session).to have_xpath("//a[@id='open-prompt' and @response='the response']")
33
34
  end
34
35
 
35
- it "should accept the prompt with a response when there is a default" do
36
+ it 'should accept the prompt with a response when there is a default' do
36
37
  @session.accept_prompt with: 'the response' do
37
38
  @session.click_link('Open defaulted prompt')
38
39
  end
39
40
  expect(@session).to have_xpath("//a[@id='open-prompt-with-default' and @response='the response']")
40
41
  end
41
42
 
42
- it "should accept the prompt with a blank response when there is a default" do
43
- pending "Geckodriver doesn't set a blank response currently" if marionette?(@session)
43
+ it 'should accept the prompt with a blank response when there is a default' do
44
44
  @session.accept_prompt with: '' do
45
45
  @session.click_link('Open defaulted prompt')
46
46
  end
47
47
  expect(@session).to have_xpath("//a[@id='open-prompt-with-default' and @response='']")
48
48
  end
49
49
 
50
- it "should allow special characters in the reponse" do
50
+ it 'should allow special characters in the reponse' do
51
51
  @session.accept_prompt with: '\'the\' \b "response"' do
52
52
  @session.click_link('Open prompt')
53
53
  end
54
54
  expect(@session).to have_xpath(%{//a[@id='open-prompt' and @response=concat("'the' ", '\\b "response"')]})
55
55
  end
56
56
 
57
- it "should accept the prompt if the message matches" do
57
+ it 'should accept the prompt if the message matches' do
58
58
  @session.accept_prompt 'Prompt opened', with: 'matched' do
59
59
  @session.click_link('Open prompt')
60
60
  end
@@ -69,7 +69,7 @@ Capybara::SpecHelper.spec '#accept_prompt', requires: [:modals] do
69
69
  end.to raise_error(Capybara::ModalNotFound)
70
70
  end
71
71
 
72
- it "should return the message presented" do
72
+ it 'should return the message presented' do
73
73
  message = @session.accept_prompt with: 'the response' do
74
74
  @session.click_link('Open prompt')
75
75
  end
@@ -0,0 +1,31 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#active_element', requires: [:active_element] do
4
+ it 'should return the active element' do
5
+ @session.visit('/form')
6
+ @session.send_keys(:tab)
7
+
8
+ expect(@session.active_element).to match_selector(:css, '[tabindex="1"]')
9
+
10
+ @session.send_keys(:tab)
11
+
12
+ expect(@session.active_element).to match_selector(:css, '[tabindex="2"]')
13
+ end
14
+
15
+ it 'should support reloading' do
16
+ @session.visit('/form')
17
+ expect(@session.active_element).to match_selector(:css, 'body')
18
+ @session.execute_script <<-JS
19
+ window.setTimeout(() => {
20
+ document.querySelector('#form_title').focus();
21
+ }, 1000)
22
+ JS
23
+ expect(@session.active_element).to match_selector(:css, 'body', wait: false)
24
+ expect(@session.active_element).to match_selector(:css, '#form_title', wait: 2)
25
+ end
26
+
27
+ it 'should return a Capybara::Element' do
28
+ @session.visit('/form')
29
+ expect(@session.active_element).to be_a Capybara::Node::Element
30
+ end
31
+ end