capybara 3.3.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 (308) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -0
  3. data/History.md +803 -13
  4. data/License.txt +1 -1
  5. data/README.md +257 -84
  6. data/lib/capybara/config.rb +25 -9
  7. data/lib/capybara/cucumber.rb +1 -1
  8. data/lib/capybara/driver/base.rb +17 -3
  9. data/lib/capybara/driver/node.rb +31 -6
  10. data/lib/capybara/dsl.rb +9 -7
  11. data/lib/capybara/helpers.rb +31 -7
  12. data/lib/capybara/minitest/spec.rb +180 -88
  13. data/lib/capybara/minitest.rb +262 -149
  14. data/lib/capybara/node/actions.rb +202 -116
  15. data/lib/capybara/node/base.rb +34 -19
  16. data/lib/capybara/node/document.rb +14 -2
  17. data/lib/capybara/node/document_matchers.rb +10 -12
  18. data/lib/capybara/node/element.rb +269 -115
  19. data/lib/capybara/node/finders.rb +99 -77
  20. data/lib/capybara/node/matchers.rb +327 -151
  21. data/lib/capybara/node/simple.rb +48 -13
  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 +8 -9
  25. data/lib/capybara/queries/base_query.rb +23 -16
  26. data/lib/capybara/queries/current_path_query.rb +16 -6
  27. data/lib/capybara/queries/match_query.rb +1 -0
  28. data/lib/capybara/queries/selector_query.rb +587 -130
  29. data/lib/capybara/queries/sibling_query.rb +8 -6
  30. data/lib/capybara/queries/style_query.rb +6 -2
  31. data/lib/capybara/queries/text_query.rb +28 -14
  32. data/lib/capybara/queries/title_query.rb +2 -2
  33. data/lib/capybara/rack_test/browser.rb +92 -25
  34. data/lib/capybara/rack_test/driver.rb +16 -7
  35. data/lib/capybara/rack_test/errors.rb +6 -0
  36. data/lib/capybara/rack_test/form.rb +68 -41
  37. data/lib/capybara/rack_test/node.rb +106 -39
  38. data/lib/capybara/rails.rb +1 -1
  39. data/lib/capybara/registration_container.rb +41 -0
  40. data/lib/capybara/registrations/drivers.rb +42 -0
  41. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  42. data/lib/capybara/registrations/servers.rb +66 -0
  43. data/lib/capybara/result.rb +75 -52
  44. data/lib/capybara/rspec/features.rb +7 -7
  45. data/lib/capybara/rspec/matcher_proxies.rb +39 -18
  46. data/lib/capybara/rspec/matchers/base.rb +113 -0
  47. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  48. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  49. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  50. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  51. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  52. data/lib/capybara/rspec/matchers/have_selector.rb +69 -0
  53. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  54. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  55. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  56. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  57. data/lib/capybara/rspec/matchers/match_style.rb +43 -0
  58. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  59. data/lib/capybara/rspec/matchers.rb +141 -339
  60. data/lib/capybara/rspec.rb +2 -0
  61. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  62. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  63. data/lib/capybara/selector/css.rb +27 -25
  64. data/lib/capybara/selector/definition/button.rb +68 -0
  65. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  66. data/lib/capybara/selector/definition/css.rb +10 -0
  67. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  68. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  69. data/lib/capybara/selector/definition/element.rb +28 -0
  70. data/lib/capybara/selector/definition/field.rb +40 -0
  71. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  72. data/lib/capybara/selector/definition/file_field.rb +13 -0
  73. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  74. data/lib/capybara/selector/definition/frame.rb +17 -0
  75. data/lib/capybara/selector/definition/id.rb +6 -0
  76. data/lib/capybara/selector/definition/label.rb +62 -0
  77. data/lib/capybara/selector/definition/link.rb +55 -0
  78. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  79. data/lib/capybara/selector/definition/option.rb +27 -0
  80. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  81. data/lib/capybara/selector/definition/select.rb +81 -0
  82. data/lib/capybara/selector/definition/table.rb +109 -0
  83. data/lib/capybara/selector/definition/table_row.rb +21 -0
  84. data/lib/capybara/selector/definition/xpath.rb +5 -0
  85. data/lib/capybara/selector/definition.rb +280 -0
  86. data/lib/capybara/selector/filter.rb +1 -0
  87. data/lib/capybara/selector/filter_set.rb +73 -25
  88. data/lib/capybara/selector/filters/base.rb +24 -5
  89. data/lib/capybara/selector/filters/expression_filter.rb +3 -3
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +16 -2
  92. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  93. data/lib/capybara/selector/selector.rb +85 -348
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/lib/capybara/selector.rb +474 -447
  96. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  97. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  98. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  99. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  100. data/lib/capybara/selenium/driver.rb +255 -143
  101. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +93 -11
  102. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
  103. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
  104. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  105. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  106. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  107. data/lib/capybara/selenium/extensions/find.rb +110 -0
  108. data/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
  109. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  110. data/lib/capybara/selenium/extensions/scroll.rb +76 -0
  111. data/lib/capybara/selenium/node.rb +436 -134
  112. data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
  113. data/lib/capybara/selenium/nodes/edge_node.rb +110 -0
  114. data/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
  115. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  116. data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
  117. data/lib/capybara/selenium/patches/atoms.rb +18 -0
  118. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  119. data/lib/capybara/selenium/patches/logs.rb +45 -0
  120. data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
  121. data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  122. data/lib/capybara/server/animation_disabler.rb +56 -19
  123. data/lib/capybara/server/checker.rb +9 -3
  124. data/lib/capybara/server/middleware.rb +28 -12
  125. data/lib/capybara/server.rb +33 -10
  126. data/lib/capybara/session/config.rb +34 -10
  127. data/lib/capybara/session/matchers.rb +23 -16
  128. data/lib/capybara/session.rb +230 -170
  129. data/lib/capybara/spec/public/jquery.js +5 -5
  130. data/lib/capybara/spec/public/offset.js +6 -0
  131. data/lib/capybara/spec/public/test.js +121 -8
  132. data/lib/capybara/spec/session/accept_alert_spec.rb +11 -11
  133. data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -3
  134. data/lib/capybara/spec/session/accept_prompt_spec.rb +9 -10
  135. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  136. data/lib/capybara/spec/session/all_spec.rb +127 -40
  137. data/lib/capybara/spec/session/ancestor_spec.rb +24 -19
  138. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +67 -38
  139. data/lib/capybara/spec/session/assert_current_path_spec.rb +21 -18
  140. data/lib/capybara/spec/session/assert_selector_spec.rb +52 -58
  141. data/lib/capybara/spec/session/assert_style_spec.rb +7 -7
  142. data/lib/capybara/spec/session/assert_text_spec.rb +74 -50
  143. data/lib/capybara/spec/session/assert_title_spec.rb +12 -12
  144. data/lib/capybara/spec/session/attach_file_spec.rb +126 -72
  145. data/lib/capybara/spec/session/body_spec.rb +6 -6
  146. data/lib/capybara/spec/session/check_spec.rb +102 -47
  147. data/lib/capybara/spec/session/choose_spec.rb +58 -32
  148. data/lib/capybara/spec/session/click_button_spec.rb +219 -163
  149. data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -23
  150. data/lib/capybara/spec/session/click_link_spec.rb +77 -54
  151. data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
  152. data/lib/capybara/spec/session/current_url_spec.rb +38 -29
  153. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
  154. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -2
  155. data/lib/capybara/spec/session/element/assert_match_selector_spec.rb +8 -8
  156. data/lib/capybara/spec/session/element/match_css_spec.rb +16 -10
  157. data/lib/capybara/spec/session/element/match_xpath_spec.rb +6 -6
  158. data/lib/capybara/spec/session/element/matches_selector_spec.rb +68 -56
  159. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +7 -7
  160. data/lib/capybara/spec/session/evaluate_script_spec.rb +28 -8
  161. data/lib/capybara/spec/session/execute_script_spec.rb +8 -7
  162. data/lib/capybara/spec/session/fill_in_spec.rb +101 -46
  163. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  164. data/lib/capybara/spec/session/find_by_id_spec.rb +7 -7
  165. data/lib/capybara/spec/session/find_field_spec.rb +32 -30
  166. data/lib/capybara/spec/session/find_link_spec.rb +31 -21
  167. data/lib/capybara/spec/session/find_spec.rb +244 -141
  168. data/lib/capybara/spec/session/first_spec.rb +43 -43
  169. data/lib/capybara/spec/session/frame/frame_title_spec.rb +5 -5
  170. data/lib/capybara/spec/session/frame/frame_url_spec.rb +5 -5
  171. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +30 -18
  172. data/lib/capybara/spec/session/frame/within_frame_spec.rb +45 -18
  173. data/lib/capybara/spec/session/go_back_spec.rb +1 -1
  174. data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
  175. data/lib/capybara/spec/session/has_all_selectors_spec.rb +23 -23
  176. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  177. data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
  178. data/lib/capybara/spec/session/has_button_spec.rb +94 -13
  179. data/lib/capybara/spec/session/has_css_spec.rb +272 -132
  180. data/lib/capybara/spec/session/has_current_path_spec.rb +50 -35
  181. data/lib/capybara/spec/session/has_element_spec.rb +47 -0
  182. data/lib/capybara/spec/session/has_field_spec.rb +137 -58
  183. data/lib/capybara/spec/session/has_link_spec.rb +44 -4
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +31 -31
  185. data/lib/capybara/spec/session/has_select_spec.rb +84 -50
  186. data/lib/capybara/spec/session/has_selector_spec.rb +111 -71
  187. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  188. data/lib/capybara/spec/session/has_table_spec.rb +181 -4
  189. data/lib/capybara/spec/session/has_text_spec.rb +101 -53
  190. data/lib/capybara/spec/session/has_title_spec.rb +19 -14
  191. data/lib/capybara/spec/session/has_xpath_spec.rb +56 -38
  192. data/lib/capybara/spec/session/headers_spec.rb +1 -1
  193. data/lib/capybara/spec/session/html_spec.rb +13 -6
  194. data/lib/capybara/spec/session/matches_style_spec.rb +37 -0
  195. data/lib/capybara/spec/session/node_spec.rb +894 -142
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +10 -7
  197. data/lib/capybara/spec/session/refresh_spec.rb +9 -7
  198. data/lib/capybara/spec/session/reset_session_spec.rb +63 -35
  199. data/lib/capybara/spec/session/response_code_spec.rb +1 -1
  200. data/lib/capybara/spec/session/save_and_open_page_spec.rb +2 -2
  201. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +2 -2
  202. data/lib/capybara/spec/session/save_page_spec.rb +37 -37
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +10 -10
  204. data/lib/capybara/spec/session/screenshot_spec.rb +2 -2
  205. data/lib/capybara/spec/session/scroll_spec.rb +119 -0
  206. data/lib/capybara/spec/session/select_spec.rb +85 -85
  207. data/lib/capybara/spec/session/selectors_spec.rb +49 -18
  208. data/lib/capybara/spec/session/sibling_spec.rb +9 -9
  209. data/lib/capybara/spec/session/text_spec.rb +25 -24
  210. data/lib/capybara/spec/session/title_spec.rb +7 -6
  211. data/lib/capybara/spec/session/uncheck_spec.rb +33 -21
  212. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  213. data/lib/capybara/spec/session/visit_spec.rb +68 -49
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +20 -17
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +1 -1
  216. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +20 -16
  217. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +6 -2
  218. data/lib/capybara/spec/session/window/window_spec.rb +62 -63
  219. data/lib/capybara/spec/session/window/windows_spec.rb +5 -1
  220. data/lib/capybara/spec/session/window/within_window_spec.rb +14 -14
  221. data/lib/capybara/spec/session/within_spec.rb +79 -42
  222. data/lib/capybara/spec/spec_helper.rb +41 -53
  223. data/lib/capybara/spec/test_app.rb +132 -43
  224. data/lib/capybara/spec/views/animated.erb +49 -0
  225. data/lib/capybara/spec/views/form.erb +139 -42
  226. data/lib/capybara/spec/views/frame_child.erb +4 -3
  227. data/lib/capybara/spec/views/frame_one.erb +2 -1
  228. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  229. data/lib/capybara/spec/views/frame_two.erb +1 -1
  230. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  231. data/lib/capybara/spec/views/layout.erb +10 -0
  232. data/lib/capybara/spec/views/obscured.erb +47 -0
  233. data/lib/capybara/spec/views/offset.erb +33 -0
  234. data/lib/capybara/spec/views/path.erb +2 -2
  235. data/lib/capybara/spec/views/popup_one.erb +1 -1
  236. data/lib/capybara/spec/views/popup_two.erb +1 -1
  237. data/lib/capybara/spec/views/react.erb +45 -0
  238. data/lib/capybara/spec/views/scroll.erb +21 -0
  239. data/lib/capybara/spec/views/spatial.erb +31 -0
  240. data/lib/capybara/spec/views/tables.erb +67 -0
  241. data/lib/capybara/spec/views/with_animation.erb +39 -4
  242. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  243. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  244. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  245. data/lib/capybara/spec/views/with_hover.erb +3 -2
  246. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  247. data/lib/capybara/spec/views/with_html.erb +37 -9
  248. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  249. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  250. data/lib/capybara/spec/views/with_js.erb +26 -5
  251. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  252. data/lib/capybara/spec/views/with_namespace.erb +1 -0
  253. data/lib/capybara/spec/views/with_scope.erb +2 -2
  254. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  255. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  256. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  257. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  258. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  259. data/lib/capybara/spec/views/with_windows.erb +1 -1
  260. data/lib/capybara/spec/views/within_frames.erb +1 -1
  261. data/lib/capybara/version.rb +1 -1
  262. data/lib/capybara/window.rb +19 -25
  263. data/lib/capybara.rb +126 -111
  264. data/spec/basic_node_spec.rb +59 -34
  265. data/spec/capybara_spec.rb +56 -44
  266. data/spec/counter_spec.rb +35 -0
  267. data/spec/css_builder_spec.rb +101 -0
  268. data/spec/css_splitter_spec.rb +8 -8
  269. data/spec/dsl_spec.rb +79 -52
  270. data/spec/filter_set_spec.rb +9 -9
  271. data/spec/fixtures/selenium_driver_rspec_failure.rb +4 -4
  272. data/spec/fixtures/selenium_driver_rspec_success.rb +4 -4
  273. data/spec/minitest_spec.rb +45 -7
  274. data/spec/minitest_spec_spec.rb +87 -64
  275. data/spec/per_session_config_spec.rb +6 -6
  276. data/spec/rack_test_spec.rb +172 -116
  277. data/spec/regexp_dissassembler_spec.rb +250 -0
  278. data/spec/result_spec.rb +80 -72
  279. data/spec/rspec/features_spec.rb +21 -16
  280. data/spec/rspec/scenarios_spec.rb +10 -6
  281. data/spec/rspec/shared_spec_matchers.rb +407 -365
  282. data/spec/rspec/views_spec.rb +3 -3
  283. data/spec/rspec_matchers_spec.rb +35 -10
  284. data/spec/rspec_spec.rb +63 -41
  285. data/spec/sauce_spec_chrome.rb +43 -0
  286. data/spec/selector_spec.rb +334 -89
  287. data/spec/selenium_spec_chrome.rb +176 -62
  288. data/spec/selenium_spec_chrome_remote.rb +54 -14
  289. data/spec/selenium_spec_edge.rb +41 -8
  290. data/spec/selenium_spec_firefox.rb +228 -0
  291. data/spec/selenium_spec_firefox_remote.rb +94 -0
  292. data/spec/selenium_spec_ie.rb +129 -11
  293. data/spec/selenium_spec_safari.rb +162 -0
  294. data/spec/server_spec.rb +171 -97
  295. data/spec/session_spec.rb +34 -18
  296. data/spec/shared_selenium_node.rb +79 -0
  297. data/spec/shared_selenium_session.rb +344 -80
  298. data/spec/spec_helper.rb +124 -2
  299. data/spec/whitespace_normalizer_spec.rb +54 -0
  300. data/spec/xpath_builder_spec.rb +93 -0
  301. metadata +326 -28
  302. data/lib/capybara/rspec/compound.rb +0 -94
  303. data/lib/capybara/selenium/driver_specializations/marionette_driver.rb +0 -31
  304. data/lib/capybara/selenium/nodes/marionette_node.rb +0 -31
  305. data/lib/capybara/spec/session/has_style_spec.rb +0 -25
  306. data/lib/capybara/spec/session/source_spec.rb +0 -0
  307. data/lib/capybara/spec/views/with_title.erb +0 -5
  308. data/spec/selenium_spec_marionette.rb +0 -167
@@ -1,11 +1,98 @@
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
+ );
27
+ }
28
+ });
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
+ }
9
96
  }
10
97
  });
11
98
  $('#clickable').click(function(e) {
@@ -15,7 +102,7 @@ $(function() {
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() {
@@ -70,6 +164,7 @@ $(function() {
70
164
  });
71
165
  $('#click-test').on({
72
166
  click: function(e) {
167
+ window.click_delay = ((new Date().getTime()) - window.mouse_down_time)/1000.0;
73
168
  var desc = "";
74
169
  if (e.altKey) desc += 'alt ';
75
170
  if (e.ctrlKey) desc += 'control ';
@@ -96,6 +191,16 @@ $(function() {
96
191
  if (e.shiftKey) desc += 'shift ';
97
192
  var pos = this.getBoundingClientRect();
98
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
+ }
99
204
  }
100
205
  });
101
206
  $('#open-alert').click(function() {
@@ -149,23 +254,31 @@ $(function() {
149
254
  $(this).attr('confirmed', 'false');
150
255
  }
151
256
  }
152
- })
257
+ });
153
258
  $('#delayed-page-change').click(function() {
154
259
  setTimeout(function() {
155
260
  window.location.pathname = '/with_html'
156
261
  }, 500)
157
- })
262
+ });
158
263
  $('#with-key-events').keydown(function(e){
159
264
  $('#key-events-output').append('keydown:'+e.which+' ')
160
265
  });
161
266
  $('#disable-on-click').click(function(e){
162
- var input = this
267
+ var input = this;
163
268
  setTimeout(function() {
164
269
  input.disabled = true;
165
270
  }, 500)
166
- })
271
+ });
167
272
  $('#set-storage').click(function(e){
168
273
  sessionStorage.setItem('session', 'session_value');
169
274
  localStorage.setItem('local', 'local value');
170
- })
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);
171
284
  });
@@ -5,14 +5,14 @@ Capybara::SpecHelper.spec '#accept_alert', requires: [:modals] do
5
5
  @session.visit('/with_js')
6
6
  end
7
7
 
8
- it "should accept the alert" do
8
+ it 'should accept the alert' do
9
9
  @session.accept_alert do
10
10
  @session.click_link('Open alert')
11
11
  end
12
12
  expect(@session).to have_xpath("//a[@id='open-alert' and @opened='true']")
13
13
  end
14
14
 
15
- it "should accept the alert if the text matches" do
15
+ it 'should accept the alert if the text matches' do
16
16
  @session.accept_alert 'Alert opened' do
17
17
  @session.click_link('Open alert')
18
18
  end
@@ -26,14 +26,14 @@ Capybara::SpecHelper.spec '#accept_alert', requires: [:modals] do
26
26
  expect(@session).to have_xpath("//a[@id='open-alert' and @opened='true']")
27
27
  end
28
28
 
29
- 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
30
30
  @session.accept_alert(/op.{2}ed/) do
31
31
  @session.click_link('Open alert')
32
32
  end
33
33
  expect(@session).to have_xpath("//a[@id='open-alert' and @opened='true']")
34
34
  end
35
35
 
36
- 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
37
37
  expect do
38
38
  @session.accept_alert 'Incorrect Text' do
39
39
  @session.click_link('Open alert')
@@ -41,37 +41,37 @@ Capybara::SpecHelper.spec '#accept_alert', requires: [:modals] do
41
41
  end.to raise_error(Capybara::ModalNotFound)
42
42
  end
43
43
 
44
- it "should return the message presented" do
44
+ it 'should return the message presented' do
45
45
  message = @session.accept_alert do
46
46
  @session.click_link('Open alert')
47
47
  end
48
48
  expect(message).to eq('Alert opened [*Yay?*]')
49
49
  end
50
50
 
51
- it "should handle the alert if the page changes" do
51
+ it 'should handle the alert if the page changes' do
52
52
  @session.accept_alert do
53
53
  @session.click_link('Alert page change')
54
54
  sleep 1 # ensure page change occurs before the accept_alert block exits
55
55
  end
56
- expect(@session).to have_current_path('/with_html')
56
+ expect(@session).to have_current_path('/with_html', wait: 5)
57
57
  end
58
58
 
59
- context "with an asynchronous alert" do
60
- it "should accept the alert" do
59
+ context 'with an asynchronous alert' do
60
+ it 'should accept the alert' do
61
61
  @session.accept_alert do
62
62
  @session.click_link('Open delayed alert')
63
63
  end
64
64
  expect(@session).to have_xpath("//a[@id='open-delayed-alert' and @opened='true']")
65
65
  end
66
66
 
67
- it "should return the message presented" do
67
+ it 'should return the message presented' do
68
68
  message = @session.accept_alert do
69
69
  @session.click_link('Open delayed alert')
70
70
  end
71
71
  expect(message).to eq('Delayed alert opened')
72
72
  end
73
73
 
74
- it "should allow to adjust the delay" do
74
+ it 'should allow to adjust the delay' do
75
75
  @session.accept_alert wait: 10 do
76
76
  @session.click_link('Open slow alert')
77
77
  end
@@ -5,21 +5,21 @@ Capybara::SpecHelper.spec '#accept_confirm', requires: [:modals] do
5
5
  @session.visit('/with_js')
6
6
  end
7
7
 
8
- it "should accept the confirm" do
8
+ it 'should accept the confirm' do
9
9
  @session.accept_confirm do
10
10
  @session.click_link('Open confirm')
11
11
  end
12
12
  expect(@session).to have_xpath("//a[@id='open-confirm' and @confirmed='true']")
13
13
  end
14
14
 
15
- it "should return the message presented" do
15
+ it 'should return the message presented' do
16
16
  message = @session.accept_confirm do
17
17
  @session.click_link('Open confirm')
18
18
  end
19
19
  expect(message).to eq('Confirm opened')
20
20
  end
21
21
 
22
- it "should work with nested modals" do
22
+ it 'should work with nested modals' do
23
23
  expect do
24
24
  @session.dismiss_confirm 'Are you really sure?' do
25
25
  @session.accept_confirm 'Are you sure?' do
@@ -5,57 +5,56 @@ Capybara::SpecHelper.spec '#accept_prompt', requires: [:modals] do
5
5
  @session.visit('/with_js')
6
6
  end
7
7
 
8
- it "should accept the prompt with no message" do
8
+ it 'should accept the prompt with no message' do
9
9
  @session.accept_prompt do
10
10
  @session.click_link('Open prompt')
11
11
  end
12
12
  expect(@session).to have_xpath("//a[@id='open-prompt' and @response='']")
13
13
  end
14
14
 
15
- 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
16
16
  @session.accept_prompt do
17
17
  @session.click_link('Open defaulted prompt')
18
18
  end
19
19
  expect(@session).to have_xpath("//a[@id='open-prompt-with-default' and @response='Default value!']")
20
20
  end
21
21
 
22
- it "should return the message presented" do
22
+ it 'should return the message presented' do
23
23
  message = @session.accept_prompt do
24
24
  @session.click_link('Open prompt')
25
25
  end
26
26
  expect(message).to eq('Prompt opened')
27
27
  end
28
28
 
29
- it "should accept the prompt with a response" do
29
+ it 'should accept the prompt with a response' do
30
30
  @session.accept_prompt with: 'the response' do
31
31
  @session.click_link('Open prompt')
32
32
  end
33
33
  expect(@session).to have_xpath("//a[@id='open-prompt' and @response='the response']")
34
34
  end
35
35
 
36
- 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
37
37
  @session.accept_prompt with: 'the response' do
38
38
  @session.click_link('Open defaulted prompt')
39
39
  end
40
40
  expect(@session).to have_xpath("//a[@id='open-prompt-with-default' and @response='the response']")
41
41
  end
42
42
 
43
- it "should accept the prompt with a blank response when there is a default" do
44
- 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
45
44
  @session.accept_prompt with: '' do
46
45
  @session.click_link('Open defaulted prompt')
47
46
  end
48
47
  expect(@session).to have_xpath("//a[@id='open-prompt-with-default' and @response='']")
49
48
  end
50
49
 
51
- it "should allow special characters in the reponse" do
50
+ it 'should allow special characters in the reponse' do
52
51
  @session.accept_prompt with: '\'the\' \b "response"' do
53
52
  @session.click_link('Open prompt')
54
53
  end
55
54
  expect(@session).to have_xpath(%{//a[@id='open-prompt' and @response=concat("'the' ", '\\b "response"')]})
56
55
  end
57
56
 
58
- it "should accept the prompt if the message matches" do
57
+ it 'should accept the prompt if the message matches' do
59
58
  @session.accept_prompt 'Prompt opened', with: 'matched' do
60
59
  @session.click_link('Open prompt')
61
60
  end
@@ -70,7 +69,7 @@ Capybara::SpecHelper.spec '#accept_prompt', requires: [:modals] do
70
69
  end.to raise_error(Capybara::ModalNotFound)
71
70
  end
72
71
 
73
- it "should return the message presented" do
72
+ it 'should return the message presented' do
74
73
  message = @session.accept_prompt with: 'the response' do
75
74
  @session.click_link('Open prompt')
76
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