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,17 +1,23 @@
1
-
2
1
  <h1>Form</h1>
3
2
 
4
- <form action="/form" method="post">
3
+ <button type="button" tabindex="1">A Button</button>
4
+
5
+ <label>
6
+ An Input
7
+ <input type="text" tabindex="2">
8
+ </label>
9
+
10
+ <form action="/form" method="post" novalidate>
5
11
 
6
12
  <p>
7
13
  <label for="form_title">Title</label>
8
- <select name="form[title]" id="form_title" class="title">
14
+ <select name="form[title]" id="form_title" class="title" tabindex="3">
9
15
  <option class="title">Mrs</option>
10
16
  <option class="title">Mr</option>
11
17
  <option>Miss</option>
12
18
  <option disabled="disabled">Other</option>
13
19
  </select>
14
- </p>
20
+ </p>
15
21
 
16
22
  <p>
17
23
  <label for="customer_name">Customer Name
@@ -25,6 +31,12 @@
25
31
  </label>
26
32
  </p>
27
33
 
34
+ <p>
35
+ <label for="customer_other_email">Customer Other Email
36
+ <input type="text" name="form[customer_other_email]" value="notben@notben.com" id="customer_other_email"/>
37
+ </label>
38
+ </p>
39
+
28
40
  <p>
29
41
  <label for="form_other_title">Other title</label>
30
42
  <select name="form[other_title]" id="form_other_title">
@@ -56,6 +68,11 @@
56
68
  <input type="text" name="form[name]" value="John Smith" id="form_name"/>
57
69
  </p>
58
70
 
71
+ <p>
72
+ <label for="form_age">Age</label>
73
+ <input type="range" name="form[age]" value="18" min="13" max="100" step="0.5" id="form_age"/>
74
+ </p>
75
+
59
76
  <p>
60
77
  <label for="form_schmooo">Schmooo</label>
61
78
  <input type="schmooo" name="form[schmooo]" value="This is Schmooo!" id="form_schmooo"/>
@@ -88,6 +105,11 @@
88
105
  <input type="file" name="form[image]" id="form_image"/>
89
106
  </p>
90
107
 
108
+ <p>
109
+ <label for="form_hidden_image">Hidden Image</label>
110
+ <input type="file" name="form[hidden_image]" id="form_hidden_image" style="display: none"/>
111
+ </p>
112
+
91
113
  <p>
92
114
  <input type="hidden" name="form[token]" value="12345" id="form_token"/>
93
115
  </p>
@@ -97,7 +119,7 @@
97
119
  <select name="form[locale]" id="form_locale">
98
120
  <option value="sv">Swedish</option>
99
121
  <option selected="selected" value="en">English</option>
100
- <option value="fi">Finish</option>
122
+ <option value="fi">Finnish</option>
101
123
  <option value="no">Norwegian</option>
102
124
  <option value="jo">John's made-up language</option>
103
125
  <option value="jbo"> Lojban </option>
@@ -124,7 +146,11 @@
124
146
 
125
147
  <p>
126
148
  <label for="form_zipcode">Zipcode</label>
127
- <input type="text" maxlength="5" name="form[zipcode]" id="form_zipcode" />
149
+ <input type="text" maxlength="5" name="form[zipcode]" id="form_zipcode" pattern="[0-9]{5,9}" />
150
+ </p>
151
+
152
+ <p>
153
+ <input maxlength="35" id="long_length" />
128
154
  </p>
129
155
 
130
156
  <p>
@@ -150,7 +176,7 @@ New line after and before textarea tag
150
176
  <label for="gender_male">Male</label>
151
177
  <input type="radio" name="form[gender]" value="female" id="gender_female" checked="checked"/>
152
178
  <label for="gender_female">Female</label>
153
- <input type="radio" name="form[gender]" value="both" id="gender_both"/>
179
+ <input type="radio" name="form[gender]" value="both" id="gender_both" readonly="readonly"/>
154
180
  <label for="gender_both">Both</label>
155
181
  </p>
156
182
 
@@ -185,7 +211,14 @@ New line after and before textarea tag
185
211
  <label for="form_cars_ferrari">Ferrari</label>
186
212
  <input type="checkbox" value="pagani" name="form[cars][]" id="form_cars_pagani" style="position: absolute; left: -9999px"/>
187
213
  <label for="form_cars_pagani">Pagani</label>
214
+ <div style="position: relative;">
215
+ <input type="checkbox" value="bugatti" name="form[cars][]" id="form_cars_bugatti"/>
216
+ <div style="position: absolute; top: 0; right: 0; bottom: 0; left: 0; background-color: #fff;">
217
+ <label for="form_cars_bugatti">Bugatti</label>
218
+ </div>
219
+ </div>
188
220
  <input type="checkbox" value="ariel" name="form[cars][]" id="form_cars_ariel" style="display: none"/>
221
+ <input type="checkbox" value="porsche" name="form[cars][]" id="form_cars_porsche" checked="checked" style="display: none"/>
189
222
  <label>
190
223
  McLaren
191
224
  <input type="checkbox" value="mclaren" name="form[cars][]" id="form_cars_mclaren" style="display: none"/>
@@ -194,6 +227,19 @@ New line after and before textarea tag
194
227
  Koenigsegg
195
228
  <input type="checkbox" value="koenigsegg" name="form[cars][]" id="form_cars_koenigsegg" checked="checked" style="display: none"/>
196
229
  </label>
230
+ <input type="checkbox" value="maserati" name="form[cars][]" id="form_cars_maserati" disabled="disabled"/>
231
+ <label for="form_cars_maserati">Maserati</label>
232
+ <input type="checkbox" value="lotus" name="form[cars][]" id="form_cars_lotus" style="display: none"/>
233
+ <label for="form_cars_lotus"><a href="#" onclick="return false;">Link here</a>Lotus</label>
234
+ </p>
235
+
236
+ <p>
237
+ <input type="text" name="form[manufacturer]" list="manufacturers" id="manufacturer"/>
238
+ <datalist id="manufacturers">
239
+ <option value="Jaguar">J</option>
240
+ <option value="Audi">
241
+ <option value="Mercedes" disabled>
242
+ </datalist>
197
243
  </p>
198
244
 
199
245
  <p>
@@ -360,7 +406,6 @@ New line after and before textarea tag
360
406
  </label>
361
407
  </p>
362
408
 
363
-
364
409
  <p>
365
410
  <label for="form_disabled_file">
366
411
  Disabled File
@@ -368,41 +413,38 @@ New line after and before textarea tag
368
413
  </label>
369
414
  </p>
370
415
 
371
- <p>
372
- <fieldset>
373
- <input name="form[enabled_fieldset_child]" id="form_enabled_fieldset_child"/>
374
- </fieldset>
375
- </p>
376
-
377
-
378
- <p>
379
- <fieldset disabled="disabled">
380
- <legend>Disabled Child</legend>
381
- <input name="form[disabled_fieldset_child]" id="form_disabled_fieldset_child"/>
382
- <select>
383
- <option>Disabled Child Option</option>
384
- </select>
385
- </fieldset>
416
+ <fieldset>
417
+ <input name="form[enabled_fieldset_child]" id="form_enabled_fieldset_child"/>
418
+ </fieldset>
386
419
 
387
- <fieldset disabled="disabled">
388
- <legend>
389
- Nested Disabled
390
- <input type="checkbox" name="form[disabled_fieldeset_legend_child]" id="form_disabled_fieldset_legend_child"/>
391
- </legend>
420
+ <fieldset disabled="disabled" id="form_disabled_fieldset">
421
+ <legend>Disabled Child</legend>
422
+ <input name="form[disabled_fieldset_child]" id="form_disabled_fieldset_child"/>
423
+ <select>
424
+ <option>Disabled Child Option</option>
425
+ </select>
426
+ </fieldset>
427
+
428
+ <fieldset disabled="disabled">
429
+ <legend>
430
+ Nested Disabled
431
+ <input type="checkbox" name="form[disabled_fieldeset_legend_child]" id="form_disabled_fieldset_legend_child"/>
432
+ </legend>
433
+ <legend>
434
+ Another WLegend
435
+ <input type="checkbox" name="form[disabled_fieldeset_second_legend_child]" id="form_disabled_fieldset_second_legend_child"/>
436
+ </legend>
437
+ <fieldset>
392
438
  <legend>
393
- Another Legend
394
- <input type="checkbox" name="form[disabled_fieldeset_second_legend_child]" id="form_disabled_fieldset_second_legend_child"/>
439
+ Disabled?
440
+ <input id="form_disabled_fieldset_descendant_legend_child">
395
441
  </legend>
396
- <p>
397
- <fieldset>
398
- <input name="form[disabled_fieldset_descendant]" id="form_disabled_fieldset_descendant"/>
399
- </fieldset>
400
- </p>
442
+ <input name="form[disabled_fieldset_descendant]" id="form_disabled_fieldset_descendant"/>
401
443
  </fieldset>
402
- </p>
444
+ </fieldset>
403
445
 
404
446
  <p>
405
- <select>
447
+ <select data-test-id="my_test_id">
406
448
  <optgroup label="Level One">
407
449
  <option> A.1 </option>
408
450
  </optgroup>
@@ -414,21 +456,43 @@ New line after and before textarea tag
414
456
  </p>
415
457
 
416
458
  <p>
417
- <input type="button" name="form[fresh]" id="fresh_btn" value="i am fresh"/>
418
- <input type="submit" name="form[awesome]" id="awe123" title="What an Awesome Button" value="awesome"/>
459
+ <input type="button" aria-label="Aria button" name="form[fresh]" id="fresh_btn" value="i am fresh"/>
460
+ <input type="submit" name="form[awesome]" id="awe123" data-test-id="test_id_button" title="What an Awesome Button" value="awesome"/>
419
461
  <input type="submit" name="form[crappy]" id="crap321" value="crappy"/>
420
462
  <input type="image" name="form[okay]" id="okay556" title="Okay 556 Image" value="okay" alt="oh hai thar"/>
421
463
  <button type="submit" id="click_me_123" title="Click Title button" value="click_me">Click me!</button>
422
464
  <button type="submit" name="form[no_value]">No Value!</button>
423
465
  <button id="no_type">No Type!</button>
424
466
  <button><img alt="A horse eating hay"/></button>
467
+ <button id="button_with_label"></button>
468
+ <label for="button_with_label">button with label element</label>
469
+ <label>
470
+ button within label element
471
+ <button></button>
472
+ </label>
473
+ <label>
474
+ role=button within label element
475
+ <span role="button">with other text</span>
476
+ </label>
425
477
  <input type="button" disabled="disabled" value="Disabled button"/>
478
+ <span role="button">ARIA button</span>
479
+ </p>
480
+
481
+ <p>
482
+ <input type="date" name="form[date]" id="form_date"/>
483
+ <input type="time" name="form[time]" id="form_time"/>
484
+ <input type="datetime-local" name="form[datetime]" id="form_datetime">
426
485
  </p>
427
486
 
428
487
  <p>
429
488
  <input id="readonly" name="form[readonly_test]" readonly/>
430
489
  <input id="not_readonly" name="form[readonly_test]" />
431
490
  </p>
491
+
492
+ <p>
493
+ <input id="required" name="form[required]" required />
494
+ <input id="length" name="form[length]" minlength="4" maxlength="4" />
495
+ </p>
432
496
  </form>
433
497
 
434
498
  <input type="text" name="form[outside_input]" value="outside_input" form="form1"/>
@@ -438,14 +502,21 @@ New line after and before textarea tag
438
502
  <input type="text" name="nested_label" id="nested_label"/>
439
503
  </label>
440
504
 
505
+ <label id="wrapper_label">
506
+ Wrapper Label
507
+ <input type="checkbox"/>
508
+ </label>
509
+
441
510
  <form id="form1" action="/form" method="post">
442
511
  <input type="text" name="form[which_form]" value="form1" id="form_which_form"/>
443
512
  <input type="text" name="form[for_form2]" value="for_form2" form="form2"/>
444
513
  <input type="submit" name="form[submit_form1]" value="submit_form1" id="submit_form1"/>
445
514
  </form>
446
515
 
516
+ <button type="submit" name="form[outside_button]" value="outside_button" form="form2">Outside!</button>
517
+
447
518
  <form id="form2" action="/form" method="post">
448
- <input type="text" name="form[which_form]" value="form2" id="form_which_form"/>
519
+ <input type="text" name="form[which_form]" value="form2" id="form_which_form2"/>
449
520
  <input type="submit" name="form[unused]" value="unused"/>
450
521
  <button type="submit" name="form[other_form_button]" value="other_form_button" form="form1">Form1</button>
451
522
  </form>
@@ -460,8 +531,6 @@ New line after and before textarea tag
460
531
  </select>
461
532
 
462
533
  <input type="submit" name="form[outside_submit]" value="outside_submit" form="form1"/>
463
- <button type="submit" name="form[outside_button]" value="outside_button" form="form2">Outside!</button>
464
-
465
534
 
466
535
  <form id="get-form" action="/form/get?foo=bar" method="get">
467
536
  <p>
@@ -471,6 +540,7 @@ New line after and before textarea tag
471
540
 
472
541
  <p>
473
542
  <input type="submit" name="form[mediocre]" id="mediocre" value="med" aria-label="Mediocre Button"/>
543
+ <input type="submit" formaction="/form/get?bar=foo" id="mediocre2" value="med2"/>
474
544
  <p>
475
545
  </form>
476
546
 
@@ -516,6 +586,19 @@ New line after and before textarea tag
516
586
  <p>
517
587
  </form>
518
588
 
589
+ <form action="/form" method="post" enctype="multipart/form-data">
590
+ <input type="hidden" name="form[document2]" value="hidden_field"/>
591
+
592
+ <p>
593
+ <label for="form_document">Document with hidden</label>
594
+ <input type="file" name="form[document2]" id="form_document2"/>
595
+ </p>
596
+
597
+ <p>
598
+ <input type="submit" value="Upload Empty With Hidden"/>
599
+ <p>
600
+ </form>
601
+
519
602
  <form action="/upload_multiple" method="post" enctype="multipart/form-data">
520
603
  <p>
521
604
  <label for="form_multiple_file_name">File Name</label>
@@ -527,6 +610,11 @@ New line after and before textarea tag
527
610
  <input type="file" name="form[multiple_documents][]" id="form_multiple_documents" multiple="multiple" />
528
611
  </p>
529
612
 
613
+ <p>
614
+ <label for="form_directory_upload">Directory Upload</label>
615
+ <input type="file" name="form[multiple_documents][]" id="form_directory_upload" multiple="multiple" webkitdirectory="webkitdirectory" mozdirectory="mozdirectory" />
616
+ </p>
617
+
530
618
  <p>
531
619
  <input type="submit" value="Upload Multiple"/>
532
620
  <p>
@@ -536,6 +624,14 @@ New line after and before textarea tag
536
624
  <p>
537
625
  <input type="submit" value="Go FAR"/>
538
626
  </p>
627
+
628
+ <input type="hidden" name="form[data]" value="TWTW"/>
629
+ <p>
630
+ <button formaction='/redirect_307'>Go 307</button>
631
+ </p>
632
+ <p>
633
+ <button formaction='/redirect_308'>Go 308</button>
634
+ </p>
539
635
  </form>
540
636
 
541
637
  <form action="/form" method="post">
@@ -599,6 +695,15 @@ New line after and before textarea tag
599
695
  </p>
600
696
  </form>
601
697
 
698
+ <form id="single_input_form" action="/form" method="post">
699
+ <input type="text" name="form[single_input]" id="single_input"/>
700
+ </form>
701
+
702
+ <form id="two_input_form" action="/form" method="post">
703
+ <input type="text" name="form[two_input_1]" id="two_input_1"/>
704
+ <input type="text" name="form[two_input_2]" id="two_input_2"/>
705
+ </form>
706
+
602
707
  <label>Confusion
603
708
  <input type="checkbox" id="confusion_checkbox" class="confusion-checkbox confusion"/>
604
709
  </label>
@@ -615,3 +720,19 @@ New line after and before textarea tag
615
720
  <label for="asterisk_input">With Asterisk<abbr title="required">*</abbr></label>
616
721
  <input id="asterisk_input" type="number"value="2016"/>
617
722
  </p>
723
+
724
+ <p>
725
+ <input id="special" {custom}="abcdef" value="custom attribute"/>
726
+ </p>
727
+
728
+
729
+ <label for="multi_label_checkbox">
730
+ Label to click
731
+ </label>
732
+ <div>Something random that justifies the usage of a separate label</div>
733
+ <label>
734
+ <div>
735
+ <input type="checkbox" id="multi_label_checkbox" style="display: none"/>
736
+ <div>Visual representation of the checkbox</div>
737
+ </div>
738
+ </label>
@@ -1,16 +1,17 @@
1
-
1
+ <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
4
  <title>This is the child frame title</title>
5
5
  <script>
6
6
  function closeWin() {
7
- var iframe = window.parent.document.getElementById('childFrame')
7
+ var iframe = window.parent.document.getElementById('childFrame');
8
8
  iframe.parentNode.removeChild(iframe)
9
9
  }
10
10
  </script>
11
11
  </head>
12
12
  <body id="childBody">
13
- <a href="javascript:void(0)" onClick="closeWin()">Close Window</a>
13
+ <a href="javascript:void(0)" onClick="closeWin()">Close Window Now</a>
14
+ <a href="javascript:void(0)" onClick="setTimeout(function(){closeWin()}, 10)">Close Window Soon</a>
14
15
  <iframe src="/frame_one" id="grandchildFrame1"></iframe>
15
16
  <iframe src="/frame_two" id="grandchildFrame2"></iframe>
16
17
  </body>
@@ -1,9 +1,10 @@
1
-
1
+ <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
4
  <title>This is the title of frame one</title>
5
5
  </head>
6
6
  <body>
7
7
  <div id="divInFrameOne">This is the text of divInFrameOne</div>
8
+ <div id="otherDivInFrameOne">Some other text</div>
8
9
  </body>
9
10
  </html>
@@ -1,4 +1,4 @@
1
-
1
+ <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
4
  <title>This is the parent frame title</title>
@@ -1,4 +1,4 @@
1
-
1
+ <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
4
  <title>This is the title of frame two</title>
@@ -1,4 +1,5 @@
1
- <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
1
+ <!DOCTYPE html>
2
+ <html lang="en">
2
3
  <body>
3
4
  <div>
4
5
  Initial alert page
@@ -0,0 +1,10 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5
+ </head>
6
+
7
+ <body>
8
+ <%= yield %>
9
+ </body>
10
+ </html>
@@ -0,0 +1,47 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5
+ <title>Obscured</title>
6
+ <style>
7
+ div {
8
+ width: 200px;
9
+ height: 200px;
10
+ }
11
+ #cover, #offscreen, #offscreen_wrapper {
12
+ position: absolute;
13
+ }
14
+ #obscured {
15
+ z-index: 1;
16
+ background-color: red;
17
+ }
18
+ #cover {
19
+ top: 0px;
20
+ z-index: 2;
21
+ background-color: blue;
22
+ }
23
+ #offscreen {
24
+ top: 2000px;
25
+ left: 2000px;
26
+ background-color: green;
27
+ }
28
+ #offscreen_wrapper {
29
+ top: 2000px;
30
+ left: 2000px;
31
+ overflow-x: scroll;
32
+ background-color: yellow;
33
+ }
34
+ </style>
35
+ </head>
36
+ <body>
37
+ <div id="obscured">
38
+ <input id="obscured_input"/>
39
+ </div>
40
+ <div id="cover"></div>
41
+ <iframe id="frameOne" height="10px" src="/frame_one"></iframe>
42
+ <iframe id="nestedFrames" src="/frame_parent"></iframe>
43
+ <div id="offscreen_wrapper">
44
+ <div id="offscreen"></div>
45
+ </div>
46
+ </body>
47
+ </html>
@@ -0,0 +1,33 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5
+ <title>Offset</title>
6
+ <style>
7
+ body {
8
+ margin: 0px;
9
+ }
10
+ #wrapper {
11
+ width: 300px;
12
+ height: 300px;
13
+ margin: 0px;
14
+ }
15
+ #clicker {
16
+ position: relative;
17
+ width: 100px;
18
+ height: 100px;
19
+ top: 100px;
20
+ left: 100px;
21
+ background-color: red;
22
+ margin: 0px;
23
+ }
24
+ </style>
25
+ <script src="/jquery.js" type="text/javascript" charset="utf-8"></script>
26
+ <script src="/offset.js" type="text/javascript" charset="utf-8"></script>
27
+ </head>
28
+ <body>
29
+ <div id="wrapper">
30
+ <div id="clicker"></div>
31
+ </div>
32
+ </body>
33
+ </html>
@@ -1,5 +1,5 @@
1
-
2
- <html xmlns="http://www.w3.org/1999/xhtml" lang="en">
1
+ <!DOCTYPE html>
2
+ <html lang="en">
3
3
  <body>
4
4
  <div>
5
5
  <a href="#">First Link</a>
@@ -1,4 +1,4 @@
1
-
1
+ <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
4
  <title>Title of the first popup</title>
@@ -1,4 +1,4 @@
1
-
1
+ <!DOCTYPE html>
2
2
  <html>
3
3
  <head>
4
4
  <title>Title of popup two</title>
@@ -0,0 +1,45 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <script src="https://unpkg.com/react/umd/react.development.js"></script>
5
+ <script src="https://unpkg.com/react-dom/umd/react-dom.development.js"></script>
6
+ </head>
7
+ <body>
8
+ <div id="root"></div>
9
+ <script>
10
+ // https://codepen.io/gaearon/pen/VmmPgp?editors=0010
11
+ class NameForm extends React.Component {
12
+ constructor(props) {
13
+ super(props);
14
+ this.state = { value: '' };
15
+
16
+ this.handleChange = this.handleChange.bind(this);
17
+ this.handleSubmit = this.handleSubmit.bind(this);
18
+ }
19
+
20
+ handleChange(event) {
21
+ this.setState({ value: event.target.value });
22
+ }
23
+
24
+ handleSubmit(event) {
25
+ alert('A name was submitted: ' + this.state.value);
26
+ event.preventDefault();
27
+ }
28
+
29
+ render() {
30
+ return (
31
+ React.createElement("form", { onSubmit: this.handleSubmit },
32
+ React.createElement("label", null, "Name:",
33
+
34
+ React.createElement("input", { type: "text", value: this.state.value, onChange: this.handleChange })),
35
+
36
+ React.createElement("input", { type: "submit", value: "Submit" })));
37
+ }}
38
+
39
+
40
+ ReactDOM.render(
41
+ React.createElement(NameForm, null),
42
+ document.getElementById('root'));
43
+ </script>
44
+ </body>
45
+ </html>
@@ -0,0 +1,21 @@
1
+ <!DOCTYPE html>
2
+ <html style="height: 250%; width: 150%">
3
+ <head>
4
+ <style>
5
+ * { padding: 0; }
6
+ div { position: absolute; }
7
+ #scroll { top: 125%; }
8
+ #scrollable { top: 150%; overflow-y: scroll; overflow-x: scroll; height: 50px; width: 50px; position: relative; border: 1px solid black;}
9
+ #inner { top: 50%; }
10
+ </style>
11
+ </head>
12
+ <body style="height: 100%; width: 100%">
13
+ <div id="scroll" style = "top: 125%">scroll</div>
14
+ <div id="scrollable">
15
+ <div style="height: 200px; width: 200px; poistion: relative">
16
+ <div id="inner">inner</div>
17
+ </div>
18
+ </div>
19
+ </div>
20
+ </body>
21
+ </html>
@@ -0,0 +1,31 @@
1
+ <!DOCTYPE html>
2
+ <html>
3
+ <head>
4
+ <meta http-equiv="Content-type" content="text/html; charset=utf-8"/>
5
+ <title>spatial</title>
6
+ <style>
7
+ #spatial {
8
+ display: grid;
9
+ grid-template-columns: repeat(3, 1fr);
10
+ grid-gap: 10px;
11
+ grid-auto-rows: minmax(100px, auto);
12
+ }
13
+ .footer {
14
+ grid-column: 1 / 4;
15
+ }
16
+ </style>
17
+ </head>
18
+
19
+ <body id="spatial">
20
+ <div class="corner">1</div>
21
+ <div class="distance">2</div>
22
+ <div class="corner">3</div>
23
+ <div>4</div>
24
+ <div class="center">5</div>
25
+ <div>6</div>
26
+ <div class="corner">7</div>
27
+ <div>8</div>
28
+ <div class="corner">9</div>
29
+ <div class="footer distance">10</div>
30
+ </body>
31
+ </html>