capybara 3.0.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 (312) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/History.md +891 -12
  4. data/License.txt +1 -1
  5. data/README.md +257 -84
  6. data/lib/capybara/config.rb +29 -10
  7. data/lib/capybara/cucumber.rb +1 -1
  8. data/lib/capybara/driver/base.rb +22 -4
  9. data/lib/capybara/driver/node.rb +38 -9
  10. data/lib/capybara/dsl.rb +9 -7
  11. data/lib/capybara/helpers.rb +57 -8
  12. data/lib/capybara/minitest/spec.rb +185 -84
  13. data/lib/capybara/minitest.rb +264 -145
  14. data/lib/capybara/node/actions.rb +248 -124
  15. data/lib/capybara/node/base.rb +35 -20
  16. data/lib/capybara/node/document.rb +14 -2
  17. data/lib/capybara/node/document_matchers.rb +13 -15
  18. data/lib/capybara/node/element.rb +350 -113
  19. data/lib/capybara/node/finders.rb +104 -82
  20. data/lib/capybara/node/matchers.rb +363 -157
  21. data/lib/capybara/node/simple.rb +54 -15
  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 +9 -10
  25. data/lib/capybara/queries/base_query.rb +25 -18
  26. data/lib/capybara/queries/current_path_query.rb +16 -6
  27. data/lib/capybara/queries/match_query.rb +11 -0
  28. data/lib/capybara/queries/selector_query.rb +617 -104
  29. data/lib/capybara/queries/sibling_query.rb +9 -7
  30. data/lib/capybara/queries/style_query.rb +45 -0
  31. data/lib/capybara/queries/text_query.rb +40 -22
  32. data/lib/capybara/queries/title_query.rb +2 -2
  33. data/lib/capybara/rack_test/browser.rb +106 -31
  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 +74 -49
  37. data/lib/capybara/rack_test/node.rb +120 -47
  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 +87 -53
  44. data/lib/capybara/rspec/features.rb +8 -10
  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 +142 -315
  60. data/lib/capybara/rspec.rb +3 -2
  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 +85 -8
  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 +72 -28
  88. data/lib/capybara/selector/filters/base.rb +45 -2
  89. data/lib/capybara/selector/filters/expression_filter.rb +5 -6
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +18 -4
  92. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  93. data/lib/capybara/selector/selector.rb +89 -200
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/lib/capybara/selector.rb +474 -534
  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 +270 -245
  101. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  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 +460 -170
  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 +80 -0
  123. data/lib/capybara/server/checker.rb +44 -0
  124. data/lib/capybara/server/middleware.rb +71 -0
  125. data/lib/capybara/server.rb +58 -67
  126. data/lib/capybara/session/config.rb +40 -6
  127. data/lib/capybara/session/matchers.rb +26 -19
  128. data/lib/capybara/session.rb +252 -194
  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 +126 -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 +135 -44
  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.rb → assert_current_path_spec.rb} +20 -18
  140. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  141. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  142. data/lib/capybara/spec/session/{assert_text.rb → assert_text_spec.rb} +76 -52
  143. data/lib/capybara/spec/session/{assert_title.rb → 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 +11 -13
  146. data/lib/capybara/spec/session/check_spec.rb +112 -51
  147. data/lib/capybara/spec/session/choose_spec.rb +62 -30
  148. data/lib/capybara/spec/session/click_button_spec.rb +227 -161
  149. data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -30
  150. data/lib/capybara/spec/session/click_link_spec.rb +89 -55
  151. data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
  152. data/lib/capybara/spec/session/current_url_spec.rb +44 -37
  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.rb → assert_match_selector_spec.rb} +11 -9
  156. data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
  157. data/lib/capybara/spec/session/element/match_xpath_spec.rb +8 -6
  158. data/lib/capybara/spec/session/element/matches_selector_spec.rb +70 -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 +110 -44
  163. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  164. data/lib/capybara/spec/session/find_by_id_spec.rb +8 -8
  165. data/lib/capybara/spec/session/find_field_spec.rb +33 -31
  166. data/lib/capybara/spec/session/find_link_spec.rb +42 -14
  167. data/lib/capybara/spec/session/find_spec.rb +251 -142
  168. data/lib/capybara/spec/session/first_spec.rb +45 -44
  169. data/lib/capybara/spec/session/frame/frame_title_spec.rb +6 -6
  170. data/lib/capybara/spec/session/frame/frame_url_spec.rb +6 -6
  171. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +32 -20
  172. data/lib/capybara/spec/session/frame/within_frame_spec.rb +46 -19
  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 +98 -12
  179. data/lib/capybara/spec/session/has_css_spec.rb +271 -137
  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 +46 -6
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +33 -31
  185. data/lib/capybara/spec/session/has_select_spec.rb +84 -50
  186. data/lib/capybara/spec/session/has_selector_spec.rb +117 -69
  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.rb → 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 +958 -122
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +15 -12
  197. data/lib/capybara/spec/session/refresh_spec.rb +9 -7
  198. data/lib/capybara/spec/session/reset_session_spec.rb +65 -37
  199. data/lib/capybara/spec/session/{response_code.rb → 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 +5 -4
  202. data/lib/capybara/spec/session/save_page_spec.rb +41 -38
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +13 -11
  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 +102 -76
  207. data/lib/capybara/spec/session/selectors_spec.rb +51 -18
  208. data/lib/capybara/spec/session/sibling_spec.rb +9 -9
  209. data/lib/capybara/spec/session/text_spec.rb +26 -24
  210. data/lib/capybara/spec/session/title_spec.rb +8 -6
  211. data/lib/capybara/spec/session/uncheck_spec.rb +41 -22
  212. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  213. data/lib/capybara/spec/session/visit_spec.rb +79 -53
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +22 -19
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +4 -3
  216. data/lib/capybara/spec/session/window/open_new_window_spec.rb +4 -3
  217. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +25 -21
  218. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +10 -5
  219. data/lib/capybara/spec/session/window/window_spec.rb +88 -54
  220. data/lib/capybara/spec/session/window/windows_spec.rb +11 -8
  221. data/lib/capybara/spec/session/window/within_window_spec.rb +17 -16
  222. data/lib/capybara/spec/session/within_spec.rb +82 -44
  223. data/lib/capybara/spec/spec_helper.rb +46 -52
  224. data/lib/capybara/spec/test_app.rb +148 -41
  225. data/lib/capybara/spec/views/animated.erb +49 -0
  226. data/lib/capybara/spec/views/form.erb +156 -42
  227. data/lib/capybara/spec/views/frame_child.erb +4 -3
  228. data/lib/capybara/spec/views/frame_one.erb +2 -1
  229. data/lib/capybara/spec/views/frame_parent.erb +1 -1
  230. data/lib/capybara/spec/views/frame_two.erb +1 -1
  231. data/lib/capybara/spec/views/initial_alert.erb +2 -1
  232. data/lib/capybara/spec/views/layout.erb +10 -0
  233. data/lib/capybara/spec/views/obscured.erb +47 -0
  234. data/lib/capybara/spec/views/offset.erb +33 -0
  235. data/lib/capybara/spec/views/path.erb +2 -2
  236. data/lib/capybara/spec/views/popup_one.erb +1 -1
  237. data/lib/capybara/spec/views/popup_two.erb +1 -1
  238. data/lib/capybara/spec/views/react.erb +45 -0
  239. data/lib/capybara/spec/views/scroll.erb +21 -0
  240. data/lib/capybara/spec/views/spatial.erb +31 -0
  241. data/lib/capybara/spec/views/tables.erb +68 -1
  242. data/lib/capybara/spec/views/with_animation.erb +81 -0
  243. data/lib/capybara/spec/views/with_base_tag.erb +2 -2
  244. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  245. data/lib/capybara/spec/views/with_fixed_header_footer.erb +2 -1
  246. data/lib/capybara/spec/views/with_hover.erb +3 -2
  247. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  248. data/lib/capybara/spec/views/with_html.erb +46 -11
  249. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  250. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  251. data/lib/capybara/spec/views/with_js.erb +30 -5
  252. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  253. data/lib/capybara/spec/views/with_namespace.erb +21 -0
  254. data/lib/capybara/spec/views/with_scope.erb +2 -2
  255. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  256. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  257. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  258. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  259. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  260. data/lib/capybara/spec/views/with_windows.erb +1 -1
  261. data/lib/capybara/spec/views/within_frames.erb +1 -1
  262. data/lib/capybara/version.rb +1 -1
  263. data/lib/capybara/window.rb +32 -26
  264. data/lib/capybara.rb +128 -104
  265. data/spec/basic_node_spec.rb +59 -34
  266. data/spec/capybara_spec.rb +65 -51
  267. data/spec/counter_spec.rb +35 -0
  268. data/spec/css_builder_spec.rb +101 -0
  269. data/spec/css_splitter_spec.rb +38 -0
  270. data/spec/dsl_spec.rb +84 -55
  271. data/spec/filter_set_spec.rb +24 -7
  272. data/spec/fixtures/certificate.pem +25 -0
  273. data/spec/fixtures/key.pem +27 -0
  274. data/spec/fixtures/selenium_driver_rspec_failure.rb +5 -5
  275. data/spec/fixtures/selenium_driver_rspec_success.rb +5 -5
  276. data/spec/minitest_spec.rb +49 -5
  277. data/spec/minitest_spec_spec.rb +92 -62
  278. data/spec/per_session_config_spec.rb +6 -6
  279. data/spec/rack_test_spec.rb +183 -115
  280. data/spec/regexp_dissassembler_spec.rb +250 -0
  281. data/spec/result_spec.rb +99 -39
  282. data/spec/rspec/features_spec.rb +28 -25
  283. data/spec/rspec/scenarios_spec.rb +10 -6
  284. data/spec/rspec/shared_spec_matchers.rb +418 -364
  285. data/spec/rspec/views_spec.rb +4 -3
  286. data/spec/rspec_matchers_spec.rb +35 -10
  287. data/spec/rspec_spec.rb +109 -85
  288. data/spec/sauce_spec_chrome.rb +43 -0
  289. data/spec/selector_spec.rb +392 -62
  290. data/spec/selenium_spec_chrome.rb +183 -41
  291. data/spec/selenium_spec_chrome_remote.rb +96 -0
  292. data/spec/selenium_spec_edge.rb +41 -8
  293. data/spec/selenium_spec_firefox.rb +228 -0
  294. data/spec/selenium_spec_firefox_remote.rb +94 -0
  295. data/spec/selenium_spec_ie.rb +129 -11
  296. data/spec/selenium_spec_safari.rb +162 -0
  297. data/spec/server_spec.rb +192 -81
  298. data/spec/session_spec.rb +52 -16
  299. data/spec/shared_selenium_node.rb +79 -0
  300. data/spec/shared_selenium_session.rb +460 -123
  301. data/spec/spec_helper.rb +124 -2
  302. data/spec/whitespace_normalizer_spec.rb +54 -0
  303. data/spec/xpath_builder_spec.rb +93 -0
  304. metadata +344 -45
  305. data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
  306. data/.yard/templates_custom/default/class/html/setup.rb +0 -17
  307. data/.yard/yard_extensions.rb +0 -78
  308. data/lib/capybara/rspec/compound.rb +0 -90
  309. data/lib/capybara/spec/session/assert_selector.rb +0 -149
  310. data/lib/capybara/spec/session/source_spec.rb +0 -0
  311. data/lib/capybara/spec/views/with_title.erb +0 -5
  312. data/spec/selenium_spec_marionette.rb +0 -143
@@ -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,6 +211,12 @@ 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"/>
189
221
  <input type="checkbox" value="porsche" name="form[cars][]" id="form_cars_porsche" checked="checked" style="display: none"/>
190
222
  <label>
@@ -195,6 +227,19 @@ New line after and before textarea tag
195
227
  Koenigsegg
196
228
  <input type="checkbox" value="koenigsegg" name="form[cars][]" id="form_cars_koenigsegg" checked="checked" style="display: none"/>
197
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>
198
243
  </p>
199
244
 
200
245
  <p>
@@ -361,7 +406,6 @@ New line after and before textarea tag
361
406
  </label>
362
407
  </p>
363
408
 
364
-
365
409
  <p>
366
410
  <label for="form_disabled_file">
367
411
  Disabled File
@@ -369,41 +413,38 @@ New line after and before textarea tag
369
413
  </label>
370
414
  </p>
371
415
 
372
- <p>
373
- <fieldset>
374
- <input name="form[enabled_fieldset_child]" id="form_enabled_fieldset_child"/>
375
- </fieldset>
376
- </p>
377
-
378
-
379
- <p>
380
- <fieldset disabled="disabled">
381
- <legend>Disabled Child</legend>
382
- <input name="form[disabled_fieldset_child]" id="form_disabled_fieldset_child"/>
383
- <select>
384
- <option>Disabled Child Option</option>
385
- </select>
386
- </fieldset>
416
+ <fieldset>
417
+ <input name="form[enabled_fieldset_child]" id="form_enabled_fieldset_child"/>
418
+ </fieldset>
387
419
 
388
- <fieldset disabled="disabled">
389
- <legend>
390
- Nested Disabled
391
- <input type="checkbox" name="form[disabled_fieldeset_legend_child]" id="form_disabled_fieldset_legend_child"/>
392
- </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>
393
438
  <legend>
394
- Another Legend
395
- <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">
396
441
  </legend>
397
- <p>
398
- <fieldset>
399
- <input name="form[disabled_fieldset_descendant]" id="form_disabled_fieldset_descendant"/>
400
- </fieldset>
401
- </p>
442
+ <input name="form[disabled_fieldset_descendant]" id="form_disabled_fieldset_descendant"/>
402
443
  </fieldset>
403
- </p>
444
+ </fieldset>
404
445
 
405
446
  <p>
406
- <select>
447
+ <select data-test-id="my_test_id">
407
448
  <optgroup label="Level One">
408
449
  <option> A.1 </option>
409
450
  </optgroup>
@@ -415,15 +456,26 @@ New line after and before textarea tag
415
456
  </p>
416
457
 
417
458
  <p>
418
- <input type="button" name="form[fresh]" id="fresh_btn" value="i am fresh"/>
419
- <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"/>
420
461
  <input type="submit" name="form[crappy]" id="crap321" value="crappy"/>
421
462
  <input type="image" name="form[okay]" id="okay556" title="Okay 556 Image" value="okay" alt="oh hai thar"/>
422
463
  <button type="submit" id="click_me_123" title="Click Title button" value="click_me">Click me!</button>
423
464
  <button type="submit" name="form[no_value]">No Value!</button>
424
465
  <button id="no_type">No Type!</button>
425
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>
426
477
  <input type="button" disabled="disabled" value="Disabled button"/>
478
+ <span role="button">ARIA button</span>
427
479
  </p>
428
480
 
429
481
  <p>
@@ -436,6 +488,11 @@ New line after and before textarea tag
436
488
  <input id="readonly" name="form[readonly_test]" readonly/>
437
489
  <input id="not_readonly" name="form[readonly_test]" />
438
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>
439
496
  </form>
440
497
 
441
498
  <input type="text" name="form[outside_input]" value="outside_input" form="form1"/>
@@ -445,14 +502,21 @@ New line after and before textarea tag
445
502
  <input type="text" name="nested_label" id="nested_label"/>
446
503
  </label>
447
504
 
505
+ <label id="wrapper_label">
506
+ Wrapper Label
507
+ <input type="checkbox"/>
508
+ </label>
509
+
448
510
  <form id="form1" action="/form" method="post">
449
511
  <input type="text" name="form[which_form]" value="form1" id="form_which_form"/>
450
512
  <input type="text" name="form[for_form2]" value="for_form2" form="form2"/>
451
513
  <input type="submit" name="form[submit_form1]" value="submit_form1" id="submit_form1"/>
452
514
  </form>
453
515
 
516
+ <button type="submit" name="form[outside_button]" value="outside_button" form="form2">Outside!</button>
517
+
454
518
  <form id="form2" action="/form" method="post">
455
- <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"/>
456
520
  <input type="submit" name="form[unused]" value="unused"/>
457
521
  <button type="submit" name="form[other_form_button]" value="other_form_button" form="form1">Form1</button>
458
522
  </form>
@@ -467,8 +531,6 @@ New line after and before textarea tag
467
531
  </select>
468
532
 
469
533
  <input type="submit" name="form[outside_submit]" value="outside_submit" form="form1"/>
470
- <button type="submit" name="form[outside_button]" value="outside_button" form="form2">Outside!</button>
471
-
472
534
 
473
535
  <form id="get-form" action="/form/get?foo=bar" method="get">
474
536
  <p>
@@ -478,6 +540,7 @@ New line after and before textarea tag
478
540
 
479
541
  <p>
480
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"/>
481
544
  <p>
482
545
  </form>
483
546
 
@@ -523,6 +586,19 @@ New line after and before textarea tag
523
586
  <p>
524
587
  </form>
525
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
+
526
602
  <form action="/upload_multiple" method="post" enctype="multipart/form-data">
527
603
  <p>
528
604
  <label for="form_multiple_file_name">File Name</label>
@@ -534,6 +610,11 @@ New line after and before textarea tag
534
610
  <input type="file" name="form[multiple_documents][]" id="form_multiple_documents" multiple="multiple" />
535
611
  </p>
536
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
+
537
618
  <p>
538
619
  <input type="submit" value="Upload Multiple"/>
539
620
  <p>
@@ -543,6 +624,14 @@ New line after and before textarea tag
543
624
  <p>
544
625
  <input type="submit" value="Go FAR"/>
545
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>
546
635
  </form>
547
636
 
548
637
  <form action="/form" method="post">
@@ -606,6 +695,15 @@ New line after and before textarea tag
606
695
  </p>
607
696
  </form>
608
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
+
609
707
  <label>Confusion
610
708
  <input type="checkbox" id="confusion_checkbox" class="confusion-checkbox confusion"/>
611
709
  </label>
@@ -622,3 +720,19 @@ New line after and before textarea tag
622
720
  <label for="asterisk_input">With Asterisk<abbr title="required">*</abbr></label>
623
721
  <input id="asterisk_input" type="number"value="2016"/>
624
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>