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,147 +1,222 @@
1
1
  # frozen_string_literal: true
2
- Capybara::SpecHelper.spec "#attach_file" do
2
+
3
+ Capybara::SpecHelper.spec '#attach_file' do
4
+ let(:test_file_path) { File.expand_path('../fixtures/test_file.txt', File.dirname(__FILE__)) }
5
+ let(:another_test_file_path) { File.expand_path('../fixtures/another_test_file.txt', File.dirname(__FILE__)) }
6
+ let(:test_jpg_file_path) { File.expand_path('../fixtures/capybara.jpg', File.dirname(__FILE__)) }
7
+ let(:no_extension_file_path) { File.expand_path('../fixtures/no_extension', File.dirname(__FILE__)) }
8
+
3
9
  before do
4
- @test_file_path = File.expand_path('../fixtures/test_file.txt', File.dirname(__FILE__))
5
- @another_test_file_path = File.expand_path('../fixtures/another_test_file.txt', File.dirname(__FILE__))
6
- @test_jpg_file_path = File.expand_path('../fixtures/capybara.jpg', File.dirname(__FILE__))
7
- @no_extension_file_path = File.expand_path('../fixtures/no_extension', File.dirname(__FILE__))
8
10
  @session.visit('/form')
9
11
  end
10
12
 
11
- context "with normal form" do
12
- it "should set a file path by id" do
13
- @session.attach_file "form_image", __FILE__
13
+ context 'with normal form' do
14
+ it 'should set a file path by id' do
15
+ @session.attach_file 'form_image', with_os_path_separators(__FILE__)
16
+ @session.click_button('awesome')
17
+ expect(extract_results(@session)['image']).to end_with(File.basename(__FILE__))
18
+ end
19
+
20
+ it 'should set a file path by label' do
21
+ @session.attach_file 'Image', with_os_path_separators(__FILE__)
14
22
  @session.click_button('awesome')
15
- expect(extract_results(@session)['image']).to eq(File.basename(__FILE__))
23
+ expect(extract_results(@session)['image']).to end_with(File.basename(__FILE__))
16
24
  end
17
25
 
18
- it "should set a file path by label" do
19
- @session.attach_file "Image", __FILE__
26
+ it 'should be able to set on element if no locator passed' do
27
+ ff = @session.find(:file_field, 'Image')
28
+ ff.attach_file(with_os_path_separators(__FILE__))
20
29
  @session.click_button('awesome')
21
- expect(extract_results(@session)['image']).to eq(File.basename(__FILE__))
30
+ expect(extract_results(@session)['image']).to end_with(File.basename(__FILE__))
22
31
  end
23
32
 
24
- it "casts to string" do
25
- @session.attach_file :"form_image", __FILE__
33
+ it 'casts to string' do
34
+ @session.attach_file :form_image, with_os_path_separators(__FILE__)
26
35
  @session.click_button('awesome')
27
- expect(extract_results(@session)['image']).to eq(File.basename(__FILE__))
36
+ expect(extract_results(@session)['image']).to end_with(File.basename(__FILE__))
28
37
  end
29
38
  end
30
39
 
31
- context "with multipart form" do
32
- it "should set a file path by id" do
33
- @session.attach_file "form_document", @test_file_path
40
+ context 'with multipart form' do
41
+ it 'should set a file path by id' do
42
+ @session.attach_file 'form_document', with_os_path_separators(test_file_path)
34
43
  @session.click_button('Upload Single')
35
- expect(@session).to have_content(File.read(@test_file_path))
44
+ expect(@session).to have_content(File.read(test_file_path))
36
45
  end
37
46
 
38
- it "should set a file path by label" do
39
- @session.attach_file "Single Document", @test_file_path
47
+ it 'should set a file path by label' do
48
+ @session.attach_file 'Single Document', with_os_path_separators(test_file_path)
40
49
  @session.click_button('Upload Single')
41
- expect(@session).to have_content(File.read(@test_file_path))
50
+ expect(@session).to have_content(File.read(test_file_path))
42
51
  end
43
52
 
44
- it "should not break if no file is submitted" do
53
+ it 'should not break if no file is submitted' do
45
54
  @session.click_button('Upload Single')
46
55
  expect(@session).to have_content('No file uploaded')
47
56
  end
48
57
 
49
- it "should send content type text/plain when uploading a text file" do
50
- @session.attach_file "Single Document", @test_file_path
58
+ it 'should send prior hidden field if no file submitted' do
59
+ @session.click_button('Upload Empty With Hidden')
60
+ expect(extract_results(@session)['document2']).to eq('hidden_field')
61
+ expect(extract_content_type(@session)).to start_with('multipart/form-data;')
62
+ end
63
+
64
+ it 'should send content type text/plain when uploading a text file' do
65
+ @session.attach_file 'Single Document', with_os_path_separators(test_file_path)
51
66
  @session.click_button 'Upload Single'
52
67
  expect(@session).to have_content('text/plain')
53
68
  end
54
69
 
55
- it "should send content type image/jpeg when uploading an image" do
56
- @session.attach_file "Single Document", @test_jpg_file_path
70
+ it 'should send content type image/jpeg when uploading an image' do
71
+ @session.attach_file 'Single Document', with_os_path_separators(test_jpg_file_path)
57
72
  @session.click_button 'Upload Single'
58
73
  expect(@session).to have_content('image/jpeg')
59
74
  end
60
75
 
61
- it "should not break when uploading a file without extension" do
62
- @session.attach_file "Single Document", @no_extension_file_path
76
+ it 'should not break when uploading a file without extension' do
77
+ @session.attach_file 'Single Document', with_os_path_separators(no_extension_file_path)
63
78
  @session.click_button 'Upload Single'
64
- expect(@session).to have_content(File.read(@no_extension_file_path))
79
+ expect(@session).to have_content(File.read(no_extension_file_path))
65
80
  end
66
81
 
67
- it "should not break when using HTML5 multiple file input" do
68
- @session.attach_file "Multiple Documents", @test_file_path
82
+ it 'should not break when using HTML5 multiple file input' do
83
+ @session.attach_file 'Multiple Documents', with_os_path_separators(test_file_path)
69
84
  @session.click_button('Upload Multiple')
70
- expect(@session).to have_content(File.read(@test_file_path))
71
- expect(@session.body).to include("1 | ")#number of files
85
+ expect(@session).to have_content(File.read(test_file_path))
86
+ expect(@session.body).to include('1 | ') # number of files
72
87
  end
73
88
 
74
- it "should not break when using HTML5 multiple file input uploading multiple files" do
75
- pending "Selenium is buggy on this, see http://code.google.com/p/selenium/issues/detail?id=2239" if @session.respond_to?(:mode) && @session.mode.to_s =~ /^selenium_(firefox|marionette)/
76
- @session.attach_file "Multiple Documents", [@test_file_path, @another_test_file_path]
89
+ it 'should not break when using HTML5 multiple file input uploading multiple files' do
90
+ @session.attach_file('Multiple Documents',
91
+ [test_file_path, another_test_file_path].map { |f| with_os_path_separators(f) })
77
92
  @session.click_button('Upload Multiple')
78
- expect(@session.body).to include("2 | ")#number of files
79
- expect(@session.body).to include(File.read(@test_file_path))
80
- expect(@session.body).to include(File.read(@another_test_file_path))
93
+ expect(@session).to have_content('2 | ') # number of files
94
+ expect(@session.body).to include(File.read(test_file_path))
95
+ expect(@session.body).to include(File.read(another_test_file_path))
81
96
  end
82
97
 
83
- it "should not send anything when attaching no files to a multiple upload field" do
98
+ it 'should not send anything when attaching no files to a multiple upload field' do
84
99
  @session.click_button('Upload Empty Multiple')
85
- expect(@session).to have_content("Successfully ignored empty file field")
100
+ expect(@session).to have_content('Successfully ignored empty file field')
101
+ end
102
+
103
+ it 'should not append files to already attached' do
104
+ @session.attach_file 'Multiple Documents', with_os_path_separators(test_file_path)
105
+ @session.attach_file 'Multiple Documents', with_os_path_separators(another_test_file_path)
106
+ @session.click_button('Upload Multiple')
107
+ expect(@session).to have_content('1 | ') # number of files
108
+ expect(@session.body).to include(File.read(another_test_file_path))
109
+ expect(@session.body).not_to include(File.read(test_file_path))
110
+ end
111
+
112
+ it 'should fire change once when uploading multiple files from empty', requires: [:js] do
113
+ @session.visit('with_js')
114
+ @session.attach_file('multiple-file',
115
+ [test_file_path, another_test_file_path].map { |f| with_os_path_separators(f) })
116
+ expect(@session).to have_css('.file_change', count: 1)
117
+ end
118
+
119
+ it 'should fire change once for each set of files uploaded', requires: [:js] do
120
+ @session.visit('with_js')
121
+ @session.attach_file('multiple-file', [test_jpg_file_path].map { |f| with_os_path_separators(f) })
122
+ @session.attach_file('multiple-file',
123
+ [test_file_path, another_test_file_path].map { |f| with_os_path_separators(f) })
124
+ expect(@session).to have_css('.file_change', count: 2)
86
125
  end
87
126
  end
88
127
 
89
128
  context "with a locator that doesn't exist" do
90
- it "should raise an error" do
91
- msg = "Unable to find visible file field \"does not exist\" that is not disabled"
129
+ it 'should raise an error' do
130
+ msg = /Unable to find file field "does not exist"/
92
131
  expect do
93
- @session.attach_file('does not exist', @test_file_path)
132
+ @session.attach_file('does not exist', with_os_path_separators(test_file_path))
94
133
  end.to raise_error(Capybara::ElementNotFound, msg)
95
134
  end
96
135
  end
97
136
 
98
137
  context "with a path that doesn't exist" do
99
- it "should raise an error" do
138
+ it 'should raise an error' do
100
139
  expect { @session.attach_file('Image', '/no_such_file.png') }.to raise_error(Capybara::FileNotFound)
101
140
  end
102
141
  end
103
142
 
104
- context "with :exact option" do
105
- it "should set a file path by partial label when false" do
106
- @session.attach_file "Imag", __FILE__, exact: false
143
+ context 'with :exact option' do
144
+ it 'should set a file path by partial label when false' do
145
+ @session.attach_file 'Imag', with_os_path_separators(__FILE__), exact: false
107
146
  @session.click_button('awesome')
108
- expect(extract_results(@session)['image']).to eq(File.basename(__FILE__))
147
+ expect(extract_results(@session)['image']).to end_with(File.basename(__FILE__))
109
148
  end
110
149
 
111
- it "not allow partial matches when true" do
150
+ it 'should not allow partial matches when true' do
112
151
  expect do
113
- @session.attach_file "Imag", __FILE__, exact: true
152
+ @session.attach_file 'Imag', with_os_path_separators(__FILE__), exact: true
114
153
  end.to raise_error(Capybara::ElementNotFound)
115
154
  end
116
155
  end
117
156
 
118
- context "with :make_visible option", requires: [:js, :es_args] do
119
- it "applies a default style change when true" do
157
+ context 'with :make_visible option', requires: %i[js es_args] do
158
+ it 'applies a default style change when true' do
120
159
  @session.visit('/with_js')
121
- expect { @session.attach_file("hidden_file", __FILE__) }.to raise_error Capybara::ElementNotFound
122
- expect {
123
- @session.attach_file("hidden_file", __FILE__, make_visible: true)
124
- }.not_to raise_error
160
+ expect do
161
+ @session.attach_file('hidden_file', with_os_path_separators(__FILE__))
162
+ end.to raise_error Capybara::ElementNotFound
163
+ expect do
164
+ @session.attach_file('hidden_file', with_os_path_separators(__FILE__), make_visible: true)
165
+ end.not_to raise_error
125
166
  end
126
167
 
127
- it "accepts a hash of styles to be applied" do
168
+ it 'accepts a hash of styles to be applied' do
128
169
  @session.visit('/with_js')
129
- expect {
130
- @session.attach_file("hidden_file", __FILE__, make_visible: { opacity: 1, display: 'block' })
131
- }.not_to raise_error
170
+ expect do
171
+ @session.attach_file('hidden_file',
172
+ with_os_path_separators(__FILE__),
173
+ make_visible: { opacity: 1, display: 'block' })
174
+ end.not_to raise_error
175
+ end
176
+
177
+ it 'raises an error when the file input is not made visible' do
178
+ @session.visit('/with_js')
179
+ expect do
180
+ @session.attach_file('hidden_file', with_os_path_separators(__FILE__), make_visible: { color: 'red' })
181
+ end.to raise_error(Capybara::ExpectationNotMet)
182
+ end
183
+
184
+ it 'resets the style when done' do
185
+ @session.visit('/with_js')
186
+ @session.attach_file('hidden_file', with_os_path_separators(__FILE__), make_visible: true)
187
+ expect(@session.evaluate_script('arguments[0].style.display', @session.find(:css, '#hidden_file', visible: :all))).to eq 'none'
132
188
  end
133
189
 
134
- it "raises an error when the file input is not made visible" do
190
+ it 'should fire change' do
135
191
  @session.visit('/with_js')
136
- expect {
137
- @session.attach_file("hidden_file", __FILE__, make_visible: { color: 'red' })
138
- }.to raise_error(Capybara::ExpectationNotMet)
192
+ @session.attach_file('hidden_file', with_os_path_separators(__FILE__), make_visible: true)
193
+ expect(@session).to have_css('.file_change')
194
+ end
195
+ end
196
+
197
+ context 'with a block', requires: %i[js] do
198
+ it 'can upload by clicking the file input' do
199
+ @session.attach_file(with_os_path_separators(__FILE__)) do
200
+ @session.find(:file_field, 'form[image]').click
201
+ end
202
+ @session.click_button('awesome')
203
+ expect(extract_results(@session)['image']).to end_with(File.basename(__FILE__))
204
+ end
205
+
206
+ it 'can upload by clicking the label' do
207
+ @session.attach_file(with_os_path_separators(__FILE__)) do
208
+ @session.find(:label, 'Hidden Image').click
209
+ end
210
+ @session.click_button('awesome')
211
+ expect(extract_results(@session)['hidden_image']).to end_with(File.basename(__FILE__))
139
212
  end
140
213
 
141
- it "resets the style when done" do
214
+ it 'should fire change' do
142
215
  @session.visit('/with_js')
143
- @session.attach_file("hidden_file", __FILE__, make_visible: true)
144
- expect(@session.evaluate_script("arguments[0].style.display", @session.find(:css, '#hidden_file', visible: :all))).to eq 'none'
216
+ @session.attach_file(with_os_path_separators(__FILE__)) do
217
+ @session.find(:label, 'Label for hidden file input').click
218
+ end
219
+ expect(@session).to have_css('.file_change')
145
220
  end
146
221
  end
147
222
  end
@@ -1,24 +1,23 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#body' do
3
- it "should return the unmodified page body" do
4
+ it 'should return the unmodified page body' do
4
5
  @session.visit('/')
5
6
  expect(@session).to have_content('Hello world!') # wait for content to appear if visit is async
6
7
  expect(@session.body).to include('Hello world!')
7
8
  end
8
9
 
9
- if "".respond_to?(:encoding)
10
- context "encoding of response between ascii and utf8" do
11
- it "should be valid with html entities" do
12
- @session.visit('/with_html_entities')
13
- expect(@session).to have_content('Encoding') # wait for content to appear if visit is async
14
- expect { @session.body.encode!("UTF-8") }.not_to raise_error
15
- end
10
+ context 'encoding of response between ascii and utf8' do
11
+ it 'should be valid with html entities' do
12
+ @session.visit('/with_html_entities')
13
+ expect(@session).to have_content('Encoding') # wait for content to appear if visit is async
14
+ expect { @session.body.encode!('UTF-8') }.not_to raise_error
15
+ end
16
16
 
17
- it "should be valid without html entities" do
18
- @session.visit('/with_html')
19
- expect(@session).to have_content('This is a test') # wait for content to appear if visit is async
20
- expect { @session.body.encode!("UTF-8") }.not_to raise_error
21
- end
17
+ it 'should be valid without html entities' do
18
+ @session.visit('/with_html')
19
+ expect(@session).to have_content('This is a test') # wait for content to appear if visit is async
20
+ expect { @session.body.encode!('UTF-8') }.not_to raise_error
22
21
  end
23
22
  end
24
23
  end
@@ -1,188 +1,250 @@
1
1
  # frozen_string_literal: true
2
- Capybara::SpecHelper.spec "#check" do
2
+
3
+ Capybara::SpecHelper.spec '#check' do
3
4
  before do
4
5
  @session.visit('/form')
5
6
  end
6
7
 
7
8
  describe "'checked' attribute" do
8
- it "should be true if checked" do
9
- @session.check("Terms of Use")
9
+ it 'should be true if checked' do
10
+ @session.check('Terms of Use')
10
11
  expect(@session.find(:xpath, "//input[@id='form_terms_of_use']")['checked']).to be_truthy
11
12
  end
12
13
 
13
- it "should be false if unchecked" do
14
+ it 'should be false if unchecked' do
14
15
  expect(@session.find(:xpath, "//input[@id='form_terms_of_use']")['checked']).to be_falsey
15
16
  end
16
17
  end
17
18
 
18
- it "should trigger associated events", requires: [:js] do
19
+ it 'should trigger associated events', requires: [:js] do
19
20
  @session.visit('/with_js')
20
21
  @session.check('checkbox_with_event')
21
- expect(@session).to have_css('#checkbox_event_triggered');
22
+ expect(@session).to have_css('#checkbox_event_triggered')
22
23
  end
23
24
 
24
- describe "checking" do
25
- it "should not change an already checked checkbox" do
25
+ describe 'checking' do
26
+ it 'should not change an already checked checkbox' do
26
27
  expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).to be_checked
27
28
  @session.check('form_pets_dog')
28
29
  expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).to be_checked
29
30
  end
30
31
 
31
- it "should check an unchecked checkbox" do
32
+ it 'should check an unchecked checkbox' do
32
33
  expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).not_to be_checked
33
34
  @session.check('form_pets_cat')
34
35
  expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).to be_checked
35
36
  end
36
37
  end
37
38
 
38
- describe "unchecking" do
39
- it "should not change an already unchecked checkbox" do
39
+ describe 'unchecking' do
40
+ it 'should not change an already unchecked checkbox' do
40
41
  expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).not_to be_checked
41
42
  @session.uncheck('form_pets_cat')
42
43
  expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).not_to be_checked
43
44
  end
44
45
 
45
- it "should uncheck a checked checkbox" do
46
+ it 'should uncheck a checked checkbox' do
46
47
  expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).to be_checked
47
48
  @session.uncheck('form_pets_dog')
48
49
  expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).not_to be_checked
49
50
  end
50
51
  end
51
52
 
52
- it "should check a checkbox by id" do
53
- @session.check("form_pets_cat")
53
+ it 'should check a checkbox by id' do
54
+ @session.check('form_pets_cat')
55
+ @session.click_button('awesome')
56
+ expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
57
+ end
58
+
59
+ it 'should check a checkbox by label' do
60
+ @session.check('Cat')
61
+ @session.click_button('awesome')
62
+ expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
63
+ end
64
+
65
+ it 'should work without a locator string' do
66
+ @session.check(id: 'form_pets_cat')
54
67
  @session.click_button('awesome')
55
68
  expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
56
69
  end
57
70
 
58
- it "should check a checkbox by label" do
59
- @session.check("Cat")
71
+ it 'should be able to check itself if no locator specified' do
72
+ cb = @session.find(:id, 'form_pets_cat')
73
+ cb.check
60
74
  @session.click_button('awesome')
61
75
  expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
62
76
  end
63
77
 
64
- it "casts to string" do
65
- @session.check(:"form_pets_cat")
78
+ it 'casts to string' do
79
+ @session.check(:form_pets_cat)
66
80
  @session.click_button('awesome')
67
81
  expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
68
82
  end
69
83
 
70
84
  context "with a locator that doesn't exist" do
71
- it "should raise an error" do
72
- msg = "Unable to find visible checkbox \"does not exist\" that is not disabled"
85
+ it 'should raise an error' do
86
+ msg = /Unable to find checkbox "does not exist"/
73
87
  expect do
74
88
  @session.check('does not exist')
75
89
  end.to raise_error(Capybara::ElementNotFound, msg)
76
90
  end
77
91
  end
78
92
 
79
- context "with a disabled checkbox" do
80
- it "should raise an error" do
93
+ context 'with a disabled checkbox' do
94
+ it 'should raise an error' do
95
+ msg = 'Unable to find visible checkbox "Disabled Checkbox" that is not disabled'
81
96
  expect do
82
97
  @session.check('Disabled Checkbox')
83
- end.to raise_error(Capybara::ElementNotFound)
98
+ end.to raise_error(Capybara::ElementNotFound, msg)
84
99
  end
85
100
  end
86
101
 
87
- context "with :exact option" do
88
- it "should accept partial matches when false" do
89
- @session.check('Ham', exact: false)
102
+ context 'with :exact option' do
103
+ it 'should accept partial matches when false' do
104
+ @session.check('Ham', exact: false)
90
105
  @session.click_button('awesome')
91
106
  expect(extract_results(@session)['pets']).to include('hamster')
92
107
  end
93
108
 
94
- it "should not accept partial matches when true" do
109
+ it 'should not accept partial matches when true' do
95
110
  expect do
96
- @session.check('Ham', exact: true)
111
+ @session.check('Ham', exact: true)
97
112
  end.to raise_error(Capybara::ElementNotFound)
98
113
  end
99
114
  end
100
115
 
101
- context "with `option` option" do
102
- it "can check boxes by their value" do
103
- @session.check('form[pets][]', option: "cat")
116
+ context 'with `option` option' do
117
+ it 'can check boxes by their value' do
118
+ @session.check('form[pets][]', option: 'cat')
119
+ @session.click_button('awesome')
120
+ expect(extract_results(@session)['pets']).to include('cat')
121
+ end
122
+
123
+ it 'should alias `with`' do
124
+ @session.check('form[pets][]', with: 'cat')
104
125
  @session.click_button('awesome')
105
126
  expect(extract_results(@session)['pets']).to include('cat')
106
127
  end
107
128
 
108
- it "should raise an error if option not found" do
129
+ it 'should raise an error if option not found' do
109
130
  expect do
110
- @session.check('form[pets][]', option: "elephant")
131
+ @session.check('form[pets][]', option: 'elephant')
111
132
  end.to raise_error(Capybara::ElementNotFound)
112
133
  end
113
134
  end
114
135
 
115
- context "when checkbox hidden" do
116
- context "with Capybara.automatic_label_click == true" do
136
+ context 'when checkbox hidden' do
137
+ context 'with Capybara.automatic_label_click == true' do
117
138
  around do |spec|
118
139
  old_click_label, Capybara.automatic_label_click = Capybara.automatic_label_click, true
119
140
  spec.run
120
141
  Capybara.automatic_label_click = old_click_label
121
142
  end
122
143
 
123
- it "should check via clicking the label with :for attribute if possible" do
124
- expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be
144
+ it 'should check via clicking the label with :for attribute if possible' do
145
+ expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be_truthy
125
146
  @session.check('form_cars_tesla')
126
147
  @session.click_button('awesome')
127
148
  expect(extract_results(@session)['cars']).to include('tesla')
128
149
  end
129
150
 
130
- it "should check via clicking the wrapping label if possible" do
131
- expect(@session.find(:checkbox, 'form_cars_mclaren', unchecked: true, visible: :hidden)).to be
151
+ it 'should check via clicking the wrapping label if possible' do
152
+ expect(@session.find(:checkbox, 'form_cars_mclaren', unchecked: true, visible: :hidden)).to be_truthy
132
153
  @session.check('form_cars_mclaren')
133
154
  @session.click_button('awesome')
134
155
  expect(extract_results(@session)['cars']).to include('mclaren')
135
156
  end
136
157
 
137
- it "should not click the label if unneeded" do
138
- expect(@session.find(:checkbox, 'form_cars_jaguar', checked: true, visible: :hidden)).to be
158
+ it 'should check via clicking the label with :for attribute if locator nil' do
159
+ cb = @session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)
160
+ cb.check
161
+ @session.click_button('awesome')
162
+ expect(extract_results(@session)['cars']).to include('tesla')
163
+ end
164
+
165
+ it 'should check self via clicking the wrapping label if locator nil' do
166
+ cb = @session.find(:checkbox, 'form_cars_mclaren', unchecked: true, visible: :hidden)
167
+ cb.check
168
+ @session.click_button('awesome')
169
+ expect(extract_results(@session)['cars']).to include('mclaren')
170
+ end
171
+
172
+ it 'should not click the label if unneeded' do
173
+ expect(@session.find(:checkbox, 'form_cars_jaguar', checked: true, visible: :hidden)).to be_truthy
139
174
  @session.check('form_cars_jaguar')
140
175
  @session.click_button('awesome')
141
176
  expect(extract_results(@session)['cars']).to include('jaguar')
142
177
  end
143
178
 
144
- it "should raise original error when no label available" do
145
- expect { @session.check('form_cars_ariel') }.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_ariel" that is not disabled')
179
+ it 'should raise original error when no label available' do
180
+ expect { @session.check('form_cars_ariel') }.to raise_error(Capybara::ElementNotFound, /Unable to find visible checkbox "form_cars_ariel"/)
146
181
  end
147
182
 
148
- it "should raise error if not allowed to click label" do
149
- expect{@session.check('form_cars_mclaren', allow_label_click: false)}.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_mclaren" that is not disabled')
183
+ it 'should raise error if not allowed to click label' do
184
+ expect { @session.check('form_cars_mclaren', allow_label_click: false) }.to raise_error(Capybara::ElementNotFound, /Unable to find visible checkbox "form_cars_mclaren"/)
150
185
  end
151
186
  end
152
187
 
153
- context "with Capybara.automatic_label_click == false" do
188
+ context 'with Capybara.automatic_label_click == false' do
154
189
  around do |spec|
155
190
  old_label_click, Capybara.automatic_label_click = Capybara.automatic_label_click, false
156
191
  spec.run
157
192
  Capybara.automatic_label_click = old_label_click
158
193
  end
159
194
 
160
- it "should raise error if checkbox not visible" do
161
- expect{@session.check('form_cars_mclaren')}.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_mclaren" that is not disabled')
195
+ it 'should raise error if checkbox not visible' do
196
+ expect { @session.check('form_cars_mclaren') }.to raise_error(Capybara::ElementNotFound, /Unable to find visible checkbox "form_cars_mclaren"/)
197
+ end
198
+
199
+ it 'should include node filter in error if verified' do
200
+ expect { @session.check('form_cars_maserati') }.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_maserati" that is not disabled')
162
201
  end
163
202
 
164
- context "with allow_label_click == true" do
165
- it "should check via the label if input is hidden" do
166
- expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be
203
+ context 'with allow_label_click == true' do
204
+ it 'should check via the label if input is hidden' do
205
+ expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be_truthy
167
206
  @session.check('form_cars_tesla', allow_label_click: true)
168
207
  @session.click_button('awesome')
169
208
  expect(extract_results(@session)['cars']).to include('tesla')
170
209
  end
171
210
 
172
- it "should not wait the full time if label can be clicked" do
173
- expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be
211
+ it 'should not wait the full time if label can be clicked' do
212
+ expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be_truthy
174
213
  start_time = Time.now
175
214
  @session.check('form_cars_tesla', allow_label_click: true, wait: 10)
176
215
  end_time = Time.now
177
216
  expect(end_time - start_time).to be < 10
178
217
  end
179
218
 
180
- it "should check via the label if input is moved off the left edge of the page" do
181
- expect(@session.find(:checkbox, 'form_cars_pagani', unchecked: true, visible: :all)).to be
219
+ it 'should check via the label if input is moved off the left edge of the page' do
220
+ expect(@session.find(:checkbox, 'form_cars_pagani', unchecked: true, visible: :all)).to be_truthy
182
221
  @session.check('form_cars_pagani', allow_label_click: true)
183
222
  @session.click_button('awesome')
184
223
  expect(extract_results(@session)['cars']).to include('pagani')
185
224
  end
225
+
226
+ it 'should check via the label if input is visible but blocked by another element' do
227
+ expect(@session.find(:checkbox, 'form_cars_bugatti', unchecked: true, visible: :all)).to be_truthy
228
+ @session.check('form_cars_bugatti', allow_label_click: true)
229
+ @session.click_button('awesome')
230
+ expect(extract_results(@session)['cars']).to include('bugatti')
231
+ end
232
+
233
+ it 'should check via label if multiple labels' do
234
+ expect(@session).to have_field('multi_label_checkbox', checked: false, visible: :hidden)
235
+ @session.check('Label to click', allow_label_click: true)
236
+ expect(@session).to have_field('multi_label_checkbox', checked: true, visible: :hidden)
237
+ end
238
+ end
239
+
240
+ context 'with allow_label_click options', requires: [:js] do
241
+ it 'should allow offsets to click location on label' do
242
+ Capybara.w3c_click_offset = false
243
+ expect(@session.find(:checkbox, 'form_cars_lotus', unchecked: true, visible: :hidden)).to be_truthy
244
+ @session.check('form_cars_lotus', allow_label_click: { x: 90, y: 10 })
245
+ @session.click_button('awesome')
246
+ expect(extract_results(@session)['cars']).to include('lotus')
247
+ end
186
248
  end
187
249
  end
188
250
  end