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,26 +1,28 @@
1
1
  # frozen_string_literal: true
2
- Capybara::SpecHelper.spec "#execute_script", requires: [:js] do
3
- it "should execute the given script and return nothing" do
2
+
3
+ Capybara::SpecHelper.spec '#execute_script', requires: [:js] do
4
+ it 'should execute the given script and return nothing' do
4
5
  @session.visit('/with_js')
5
6
  expect(@session.execute_script("document.getElementById('change').textContent = 'Funky Doodle'")).to be_nil
6
7
  expect(@session).to have_css('#change', text: 'Funky Doodle')
7
8
  end
8
9
 
9
- it "should be able to call functions defined in the page" do
10
+ it 'should be able to call functions defined in the page' do
10
11
  @session.visit('/with_js')
11
- expect{ @session.execute_script("$('#change').text('Funky Doodle')") }.not_to raise_error
12
+ expect { @session.execute_script("$('#change').text('Funky Doodle')") }.not_to raise_error
12
13
  end
13
14
 
14
- it "should pass arguments to the script", requires: [:js, :es_args] do
15
+ it 'should pass arguments to the script', requires: %i[js es_args] do
15
16
  @session.visit('/with_js')
16
- @session.execute_script("document.getElementById('change').textContent = arguments[0]", "Doodle Funk")
17
+ expect(@session).to have_css('#change')
18
+ @session.execute_script("document.getElementById('change').textContent = arguments[0]", 'Doodle Funk')
17
19
  expect(@session).to have_css('#change', text: 'Doodle Funk')
18
20
  end
19
21
 
20
- it "should support passing elements as arguments to the script", requires: [:js, :es_args] do
22
+ it 'should support passing elements as arguments to the script', requires: %i[js es_args] do
21
23
  @session.visit('/with_js')
22
24
  el = @session.find(:css, '#change')
23
- @session.execute_script("arguments[1].textContent = arguments[0]", "Doodle Funk", el)
25
+ @session.execute_script('arguments[1].textContent = arguments[0]', 'Doodle Funk', el)
24
26
  expect(@session).to have_css('#change', text: 'Doodle Funk')
25
27
  end
26
28
  end
@@ -1,145 +1,228 @@
1
1
  # frozen_string_literal: true
2
- Capybara::SpecHelper.spec "#fill_in" do
2
+
3
+ Capybara::SpecHelper.spec '#fill_in' do
3
4
  before do
4
5
  @session.visit('/form')
5
6
  end
6
7
 
7
- it "should fill in a text field by id" do
8
+ it 'should fill in a text field by id' do
8
9
  @session.fill_in('form_first_name', with: 'Harry')
9
10
  @session.click_button('awesome')
10
11
  expect(extract_results(@session)['first_name']).to eq('Harry')
11
12
  end
12
13
 
13
- it "should fill in a text field by name" do
14
+ it 'should fill in a text field by name' do
14
15
  @session.fill_in('form[last_name]', with: 'Green')
15
16
  @session.click_button('awesome')
16
17
  expect(extract_results(@session)['last_name']).to eq('Green')
17
18
  end
18
19
 
19
- it "should fill in a text field by label without for" do
20
+ it 'should fill in a text field by label without for' do
20
21
  @session.fill_in('First Name', with: 'Harry')
21
22
  @session.click_button('awesome')
22
23
  expect(extract_results(@session)['first_name']).to eq('Harry')
23
24
  end
24
25
 
25
- it "should fill in a url field by label without for" do
26
+ it 'should fill in a url field by label without for' do
26
27
  @session.fill_in('Html5 Url', with: 'http://www.avenueq.com')
27
28
  @session.click_button('html5_submit')
28
29
  expect(extract_results(@session)['html5_url']).to eq('http://www.avenueq.com')
29
30
  end
30
31
 
31
- it "should fill in a textarea by id" do
32
+ it 'should fill in a textarea by id' do
32
33
  @session.fill_in('form_description', with: 'Texty text')
33
34
  @session.click_button('awesome')
34
35
  expect(extract_results(@session)['description']).to eq('Texty text')
35
36
  end
36
37
 
37
- it "should fill in a textarea by label" do
38
+ it 'should fill in a textarea by label' do
38
39
  @session.fill_in('Description', with: 'Texty text')
39
40
  @session.click_button('awesome')
40
41
  expect(extract_results(@session)['description']).to eq('Texty text')
41
42
  end
42
43
 
43
- it "should fill in a textarea by name" do
44
+ it 'should fill in a textarea by name' do
44
45
  @session.fill_in('form[description]', with: 'Texty text')
45
46
  @session.click_button('awesome')
46
47
  expect(extract_results(@session)['description']).to eq('Texty text')
47
48
  end
48
49
 
49
- it "should fill in a password field by id" do
50
+ it 'should fill in a textarea in a reasonable time by default' do
51
+ textarea = @session.find(:fillable_field, 'form[description]')
52
+ value = 'a' * 4000
53
+ start = Time.now
54
+ textarea.fill_in(with: value)
55
+ expect(Time.now.to_f).to be_within(0.25).of start.to_f
56
+ expect(textarea.value).to eq value
57
+ end
58
+
59
+ it 'should fill in a password field by id' do
50
60
  @session.fill_in('form_password', with: 'supasikrit')
51
61
  @session.click_button('awesome')
52
62
  expect(extract_results(@session)['password']).to eq('supasikrit')
53
63
  end
54
64
 
55
- it "should handle HTML in a textarea" do
65
+ context 'Date/Time' do
66
+ it 'should fill in a date input' do
67
+ date = Date.today
68
+ @session.fill_in('form_date', with: date)
69
+ @session.click_button('awesome')
70
+ expect(Date.parse(extract_results(@session)['date'])).to eq date
71
+ end
72
+
73
+ it 'should fill in a time input' do
74
+ time = Time.new(2018, 3, 9, 15, 26)
75
+ @session.fill_in('form_time', with: time)
76
+ @session.click_button('awesome')
77
+ results = extract_results(@session)['time']
78
+ expect(Time.parse(results).strftime('%r')).to eq time.strftime('%r')
79
+ end
80
+
81
+ it 'should fill in a datetime input' do
82
+ dt = Time.new(2018, 3, 13, 9, 53)
83
+ @session.fill_in('form_datetime', with: dt)
84
+ @session.click_button('awesome')
85
+ expect(Time.parse(extract_results(@session)['datetime'])).to eq dt
86
+ end
87
+ end
88
+
89
+ it 'should handle HTML in a textarea' do
56
90
  @session.fill_in('form_description', with: 'is <strong>very</strong> secret!')
57
91
  @session.click_button('awesome')
58
92
  expect(extract_results(@session)['description']).to eq('is <strong>very</strong> secret!')
59
93
  end
60
94
 
61
- it "should handle newlines in a textarea" do
95
+ it 'should handle newlines in a textarea' do
62
96
  @session.fill_in('form_description', with: "\nSome text\n")
63
97
  @session.click_button('awesome')
64
98
  expect(extract_results(@session)['description']).to eq("\r\nSome text\r\n")
65
99
  end
66
100
 
67
- it "should fill in a field with a custom type" do
101
+ it 'should handle carriage returns with line feeds in a textarea correctly' do
102
+ @session.fill_in('form_description', with: "\r\nSome text\r\n")
103
+ @session.click_button('awesome')
104
+ expect(extract_results(@session)['description']).to eq("\r\nSome text\r\n")
105
+ end
106
+
107
+ it 'should fill in a color field' do
108
+ @session.fill_in('Html5 Color', with: '#112233')
109
+ @session.click_button('html5_submit')
110
+ expect(extract_results(@session)['html5_color']).to eq('#112233')
111
+ end
112
+
113
+ describe 'with input[type="range"]' do
114
+ it 'should set the range slider correctly' do
115
+ @session.fill_in('form_age', with: 51)
116
+ @session.click_button('awesome')
117
+ expect(extract_results(@session)['age'].to_f).to eq 51
118
+ end
119
+
120
+ it 'should set the range slider to valid values' do
121
+ @session.fill_in('form_age', with: '37.6')
122
+ @session.click_button('awesome')
123
+ expect(extract_results(@session)['age'].to_f).to eq 37.5
124
+ end
125
+
126
+ it 'should respect the range slider limits' do
127
+ @session.fill_in('form_age', with: '3')
128
+ @session.click_button('awesome')
129
+ expect(extract_results(@session)['age'].to_f).to eq 13
130
+ end
131
+ end
132
+
133
+ it 'should fill in a field with a custom type' do
68
134
  @session.fill_in('Schmooo', with: 'Schmooo is the game')
69
135
  @session.click_button('awesome')
70
136
  expect(extract_results(@session)['schmooo']).to eq('Schmooo is the game')
71
137
  end
72
138
 
73
- it "should fill in a field without a type" do
139
+ it 'should fill in a field without a type' do
74
140
  @session.fill_in('Phone', with: '+1 555 7022')
75
141
  @session.click_button('awesome')
76
142
  expect(extract_results(@session)['phone']).to eq('+1 555 7022')
77
143
  end
78
144
 
79
- it "should fill in a text field respecting its maxlength attribute" do
145
+ it 'should fill in a text field respecting its maxlength attribute' do
80
146
  @session.fill_in('Zipcode', with: '52071350')
81
147
  @session.click_button('awesome')
82
148
  expect(extract_results(@session)['zipcode']).to eq('52071')
83
149
  end
84
150
 
85
- it "should fill in a password field by name" do
151
+ it 'should fill in a password field by name' do
86
152
  @session.fill_in('form[password]', with: 'supasikrit')
87
153
  @session.click_button('awesome')
88
154
  expect(extract_results(@session)['password']).to eq('supasikrit')
89
155
  end
90
156
 
91
- it "should fill in a password field by label" do
157
+ it 'should fill in a password field by label' do
92
158
  @session.fill_in('Password', with: 'supasikrit')
93
159
  @session.click_button('awesome')
94
160
  expect(extract_results(@session)['password']).to eq('supasikrit')
95
161
  end
96
162
 
97
- it "should fill in a password field by name" do
163
+ it 'should fill in a password field by name' do
98
164
  @session.fill_in('form[password]', with: 'supasikrit')
99
165
  @session.click_button('awesome')
100
166
  expect(extract_results(@session)['password']).to eq('supasikrit')
101
167
  end
102
168
 
103
- it "should fill in a field based on current value" do
104
- @session.fill_in(currently_with: 'John', with: 'Thomas')
169
+ it 'should fill in a field based on current value' do
170
+ @session.fill_in(id: /form.*name/, currently_with: 'John', with: 'Thomas')
105
171
  @session.click_button('awesome')
106
172
  expect(extract_results(@session)['first_name']).to eq('Thomas')
107
173
  end
108
174
 
109
- it "should fill in a field based on type" do
175
+ it 'should fill in a field based on type' do
110
176
  @session.fill_in(type: 'schmooo', with: 'Schmooo for all')
111
177
  @session.click_button('awesome')
112
178
  expect(extract_results(@session)['schmooo']).to eq('Schmooo for all')
113
179
  end
114
180
 
181
+ it 'should be able to fill in element called on when no locator passed' do
182
+ field = @session.find(:fillable_field, 'form[password]')
183
+ field.fill_in(with: 'supasikrit')
184
+ @session.click_button('awesome')
185
+ expect(extract_results(@session)['password']).to eq('supasikrit')
186
+ end
187
+
115
188
  it "should throw an exception if a hash containing 'with' is not provided" do
116
- expect {@session.fill_in 'Name', 'ignu'}.to raise_error(RuntimeError, /with/)
189
+ expect { @session.fill_in 'Name' }.to raise_error(ArgumentError, /with/)
117
190
  end
118
191
 
119
- it "should wait for asynchronous load", requires: [:js] do
192
+ it 'should wait for asynchronous load', requires: [:js] do
193
+ Capybara.default_max_wait_time = 2
120
194
  @session.visit('/with_js')
121
195
  @session.click_link('Click me')
122
196
  @session.fill_in('new_field', with: 'Testing...')
123
197
  end
124
198
 
125
- it "casts to string" do
126
- @session.fill_in(:'form_first_name', with: :'Harry')
199
+ it 'casts to string' do
200
+ @session.fill_in(:form_first_name, with: :Harry)
127
201
  @session.click_button('awesome')
128
202
  expect(extract_results(@session)['first_name']).to eq('Harry')
129
203
  end
130
204
 
131
- it "casts to string if field has maxlength" do
132
- @session.fill_in(:'form_zipcode', with: 1234567)
205
+ it 'casts to string if field has maxlength' do
206
+ @session.fill_in(:form_zipcode, with: 1234567)
133
207
  @session.click_button('awesome')
134
208
  expect(extract_results(@session)['zipcode']).to eq('12345')
135
209
  end
136
210
 
211
+ it 'fills in a field if default_set_options is nil' do
212
+ Capybara.default_set_options = nil
213
+ @session.fill_in(:form_first_name, with: 'Thomas')
214
+ @session.click_button('awesome')
215
+ expect(extract_results(@session)['first_name']).to eq('Thomas')
216
+ end
217
+
137
218
  context 'on a pre-populated textfield with a reformatting onchange', requires: [:js] do
138
219
  it 'should only trigger onchange once' do
139
220
  @session.visit('/with_js')
221
+ # Click somewhere on the page to ensure focus is acquired. Without this FF won't generate change events for some reason???
222
+ @session.find(:css, 'h1', text: 'FooBar').click
140
223
  @session.fill_in('with_change_event', with: 'some value')
141
224
  # click outside the field to trigger the change event
142
- @session.find(:css, 'body').click
225
+ @session.find(:css, 'h1', text: 'FooBar').click
143
226
  expect(@session.find(:css, '.change_event_triggered', match: :one)).to have_text 'some value'
144
227
  end
145
228
 
@@ -147,16 +230,18 @@ Capybara::SpecHelper.spec "#fill_in" do
147
230
  @session.visit('/with_js')
148
231
  @session.fill_in('with_change_event', with: '')
149
232
  # click outside the field to trigger the change event
150
- @session.find(:css, 'body').click
233
+ @session.find(:css, 'h1', text: 'FooBar').click
151
234
  expect(@session).to have_selector(:css, '.change_event_triggered', match: :one)
152
235
  end
153
236
  end
154
237
 
155
- context "with ignore_hidden_fields" do
238
+ context 'with ignore_hidden_fields' do
156
239
  before { Capybara.ignore_hidden_elements = true }
240
+
157
241
  after { Capybara.ignore_hidden_elements = false }
158
- it "should not find a hidden field" do
159
- msg = "Unable to find visible field \"Super Secret\" that is not disabled"
242
+
243
+ it 'should not find a hidden field' do
244
+ msg = /Unable to find visible field "Super Secret"/
160
245
  expect do
161
246
  @session.fill_in('Super Secret', with: '777')
162
247
  end.to raise_error(Capybara::ElementNotFound, msg)
@@ -164,38 +249,44 @@ Capybara::SpecHelper.spec "#fill_in" do
164
249
  end
165
250
 
166
251
  context "with a locator that doesn't exist" do
167
- it "should raise an error" do
168
- msg = "Unable to find visible field \"does not exist\" that is not disabled"
252
+ it 'should raise an error' do
253
+ msg = /Unable to find field "does not exist"/
169
254
  expect do
170
255
  @session.fill_in('does not exist', with: 'Blah blah')
171
256
  end.to raise_error(Capybara::ElementNotFound, msg)
172
257
  end
173
258
  end
174
259
 
175
- context "on a disabled field" do
176
- it "should raise an error" do
260
+ context 'on a disabled field' do
261
+ it 'should raise an error' do
177
262
  expect do
178
263
  @session.fill_in('Disabled Text Field', with: 'Blah blah')
179
264
  end.to raise_error(Capybara::ElementNotFound)
180
265
  end
181
266
  end
182
267
 
183
- context "with :exact option" do
184
- it "should accept partial matches when false" do
185
- @session.fill_in("Explanation", with: "Dude", exact: false)
186
- @session.click_button("awesome")
187
- expect(extract_results(@session)["name_explanation"]).to eq("Dude")
268
+ context 'with :exact option' do
269
+ it 'should accept partial matches when false' do
270
+ @session.fill_in('Explanation', with: 'Dude', exact: false)
271
+ @session.click_button('awesome')
272
+ expect(extract_results(@session)['name_explanation']).to eq('Dude')
188
273
  end
189
274
 
190
- it "should not accept partial matches when true" do
275
+ it 'should not accept partial matches when true' do
191
276
  expect do
192
- @session.fill_in("Explanation", with: "Dude", exact: true)
277
+ @session.fill_in('Explanation', with: 'Dude', exact: true)
193
278
  end.to raise_error(Capybara::ElementNotFound)
194
279
  end
195
280
  end
196
281
 
197
- it "should return the element filled in" do
282
+ it 'should return the element filled in' do
198
283
  el = @session.find(:fillable_field, 'form_first_name')
199
284
  expect(@session.fill_in('form_first_name', with: 'Harry')).to eq el
200
285
  end
286
+
287
+ it 'should warn if passed what looks like a CSS id selector' do
288
+ expect do
289
+ @session.fill_in('#form_first_name', with: 'Harry')
290
+ end.to raise_error(/you may be passing a CSS selector or XPath expression rather than a locator/)
291
+ end
201
292
  end
@@ -1,28 +1,29 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#find_button' do
3
4
  before do
4
5
  @session.visit('/form')
5
6
  end
6
7
 
7
- it "should find any button" do
8
- expect(@session.find_button('med')[:id]).to eq("mediocre")
9
- expect(@session.find_button('crap321').value).to eq("crappy")
8
+ it 'should find any button' do
9
+ expect(@session.find_button('med')[:id]).to eq('mediocre')
10
+ expect(@session.find_button('crap321').value).to eq('crappy')
10
11
  end
11
12
 
12
- context "aria_label attribute with Capybara.enable_aria_label" do
13
- it "should find when true" do
13
+ context 'aria_label attribute with Capybara.enable_aria_label' do
14
+ it 'should find when true' do
14
15
  Capybara.enable_aria_label = true
15
- expect(@session.find_button('Mediocre Button')[:id]).to eq("mediocre")
16
+ expect(@session.find_button('Mediocre Button')[:id]).to eq('mediocre')
16
17
  end
17
18
 
18
- it "should not find when false" do
19
+ it 'should not find when false' do
19
20
  Capybara.enable_aria_label = false
20
21
  expect { @session.find_button('Mediocre Button') }.to raise_error(Capybara::ElementNotFound)
21
22
  end
22
23
  end
23
24
 
24
- it "casts to string" do
25
- expect(@session.find_button(:'med')[:id]).to eq("mediocre")
25
+ it 'casts to string' do
26
+ expect(@session.find_button(:med)[:id]).to eq('mediocre')
26
27
  end
27
28
 
28
29
  it "should raise error if the button doesn't exist" do
@@ -31,43 +32,43 @@ Capybara::SpecHelper.spec '#find_button' do
31
32
  end.to raise_error(Capybara::ElementNotFound)
32
33
  end
33
34
 
34
- context "with :exact option" do
35
- it "should accept partial matches when false" do
36
- expect(@session.find_button('What an Awesome', exact: false).value).to eq("awesome")
35
+ context 'with :exact option' do
36
+ it 'should accept partial matches when false' do
37
+ expect(@session.find_button('What an Awesome', exact: false).value).to eq('awesome')
37
38
  end
38
39
 
39
- it "should not accept partial matches when true" do
40
+ it 'should not accept partial matches when true' do
40
41
  expect do
41
- @session.find_button('What an Awesome', exact: true)
42
+ @session.find_button('What an Awesome', exact: true)
42
43
  end.to raise_error(Capybara::ElementNotFound)
43
44
  end
44
45
  end
45
46
 
46
- context "with :disabled option" do
47
- it "should find disabled buttons when true" do
48
- expect(@session.find_button('Disabled button', disabled: true).value).to eq("Disabled button")
47
+ context 'with :disabled option' do
48
+ it 'should find disabled buttons when true' do
49
+ expect(@session.find_button('Disabled button', disabled: true).value).to eq('Disabled button')
49
50
  end
50
51
 
51
- it "should not find disabled buttons when false" do
52
+ it 'should not find disabled buttons when false' do
52
53
  expect do
53
54
  @session.find_button('Disabled button', disabled: false)
54
55
  end.to raise_error(Capybara::ElementNotFound)
55
56
  end
56
57
 
57
- it "should default to not finding disabled buttons" do
58
+ it 'should default to not finding disabled buttons' do
58
59
  expect do
59
60
  @session.find_button('Disabled button')
60
61
  end.to raise_error(Capybara::ElementNotFound)
61
62
  end
62
63
 
63
- it "should find disabled buttons when :all" do
64
- expect(@session.find_button('Disabled button', disabled: :all).value).to eq("Disabled button")
64
+ it 'should find disabled buttons when :all' do
65
+ expect(@session.find_button('Disabled button', disabled: :all).value).to eq('Disabled button')
65
66
  end
66
67
  end
67
68
 
68
- context "without locator" do
69
- it "should use options" do
70
- expect(@session.find_button(disabled: true).value).to eq("Disabled button")
69
+ context 'without locator' do
70
+ it 'should use options' do
71
+ expect(@session.find_button(disabled: true).value).to eq('Disabled button')
71
72
  end
72
73
  end
73
74
  end
@@ -1,31 +1,32 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#find_by_id' do
3
4
  before do
4
5
  @session.visit('/with_html')
5
6
  end
6
7
 
7
- it "should find any element by id" do
8
+ it 'should find any element by id' do
8
9
  expect(@session.find_by_id('red').tag_name).to eq('a')
9
10
  end
10
11
 
11
- it "casts to string" do
12
- expect(@session.find_by_id(:'red').tag_name).to eq('a')
12
+ it 'casts to string' do
13
+ expect(@session.find_by_id(:red).tag_name).to eq('a')
13
14
  end
14
15
 
15
- it "should raise error if no element with id is found" do
16
+ it 'should raise error if no element with id is found' do
16
17
  expect do
17
18
  @session.find_by_id('nothing_with_this_id')
18
19
  end.to raise_error(Capybara::ElementNotFound)
19
20
  end
20
21
 
21
- context "with :visible option" do
22
- it "finds invisible elements when `false`" do
23
- expect(@session.find_by_id("hidden_via_ancestor", visible: false).text(:all)).to match(/with hidden ancestor/)
22
+ context 'with :visible option' do
23
+ it 'finds invisible elements when `false`' do
24
+ expect(@session.find_by_id('hidden_via_ancestor', visible: false).text(:all)).to match(/with hidden ancestor/)
24
25
  end
25
26
 
26
- it "finds invisible elements when `false`" do
27
+ it "doesn't find invisible elements when `true`" do
27
28
  expect do
28
- @session.find_by_id("hidden_via_ancestor", visible: true)
29
+ @session.find_by_id('hidden_via_ancestor', visible: true)
29
30
  end.to raise_error(Capybara::ElementNotFound)
30
31
  end
31
32
  end