capybara 3.0.0 → 3.36.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (308) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/History.md +777 -10
  4. data/License.txt +1 -1
  5. data/README.md +75 -58
  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 +34 -9
  10. data/lib/capybara/dsl.rb +14 -6
  11. data/lib/capybara/helpers.rb +52 -7
  12. data/lib/capybara/minitest/spec.rb +173 -84
  13. data/lib/capybara/minitest.rb +250 -144
  14. data/lib/capybara/node/actions.rb +248 -124
  15. data/lib/capybara/node/base.rb +34 -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 +339 -113
  19. data/lib/capybara/node/finders.rb +95 -82
  20. data/lib/capybara/node/matchers.rb +338 -157
  21. data/lib/capybara/node/simple.rb +54 -15
  22. data/lib/capybara/queries/active_element_query.rb +18 -0
  23. data/lib/capybara/queries/ancestor_query.rb +9 -10
  24. data/lib/capybara/queries/base_query.rb +25 -18
  25. data/lib/capybara/queries/current_path_query.rb +16 -6
  26. data/lib/capybara/queries/match_query.rb +11 -0
  27. data/lib/capybara/queries/selector_query.rb +600 -103
  28. data/lib/capybara/queries/sibling_query.rb +9 -7
  29. data/lib/capybara/queries/style_query.rb +45 -0
  30. data/lib/capybara/queries/text_query.rb +40 -22
  31. data/lib/capybara/queries/title_query.rb +2 -2
  32. data/lib/capybara/rack_test/browser.rb +47 -28
  33. data/lib/capybara/rack_test/driver.rb +12 -3
  34. data/lib/capybara/rack_test/errors.rb +6 -0
  35. data/lib/capybara/rack_test/form.rb +53 -50
  36. data/lib/capybara/rack_test/node.rb +114 -37
  37. data/lib/capybara/rails.rb +1 -1
  38. data/lib/capybara/registration_container.rb +44 -0
  39. data/lib/capybara/registrations/drivers.rb +42 -0
  40. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  41. data/lib/capybara/registrations/servers.rb +45 -0
  42. data/lib/capybara/result.rb +86 -52
  43. data/lib/capybara/rspec/features.rb +8 -10
  44. data/lib/capybara/rspec/matcher_proxies.rb +39 -18
  45. data/lib/capybara/rspec/matchers/base.rb +111 -0
  46. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  47. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  48. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  49. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  50. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  51. data/lib/capybara/rspec/matchers/have_selector.rb +77 -0
  52. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  53. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  54. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  55. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  56. data/lib/capybara/rspec/matchers/match_style.rb +43 -0
  57. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  58. data/lib/capybara/rspec/matchers.rb +138 -316
  59. data/lib/capybara/rspec.rb +3 -2
  60. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  61. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  62. data/lib/capybara/selector/css.rb +89 -12
  63. data/lib/capybara/selector/definition/button.rb +68 -0
  64. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  65. data/lib/capybara/selector/definition/css.rb +10 -0
  66. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  67. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  68. data/lib/capybara/selector/definition/element.rb +28 -0
  69. data/lib/capybara/selector/definition/field.rb +40 -0
  70. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  71. data/lib/capybara/selector/definition/file_field.rb +13 -0
  72. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  73. data/lib/capybara/selector/definition/frame.rb +17 -0
  74. data/lib/capybara/selector/definition/id.rb +6 -0
  75. data/lib/capybara/selector/definition/label.rb +62 -0
  76. data/lib/capybara/selector/definition/link.rb +54 -0
  77. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  78. data/lib/capybara/selector/definition/option.rb +27 -0
  79. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  80. data/lib/capybara/selector/definition/select.rb +81 -0
  81. data/lib/capybara/selector/definition/table.rb +109 -0
  82. data/lib/capybara/selector/definition/table_row.rb +21 -0
  83. data/lib/capybara/selector/definition/xpath.rb +5 -0
  84. data/lib/capybara/selector/definition.rb +279 -0
  85. data/lib/capybara/selector/filter.rb +1 -0
  86. data/lib/capybara/selector/filter_set.rb +72 -27
  87. data/lib/capybara/selector/filters/base.rb +45 -2
  88. data/lib/capybara/selector/filters/expression_filter.rb +5 -6
  89. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  90. data/lib/capybara/selector/filters/node_filter.rb +18 -4
  91. data/lib/capybara/selector/regexp_disassembler.rb +214 -0
  92. data/lib/capybara/selector/selector.rb +85 -200
  93. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  94. data/lib/capybara/selector.rb +226 -537
  95. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  96. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  97. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  98. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  99. data/lib/capybara/selenium/driver.rb +296 -238
  100. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  101. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +124 -0
  102. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +89 -0
  103. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  104. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  105. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  106. data/lib/capybara/selenium/extensions/find.rb +110 -0
  107. data/lib/capybara/selenium/extensions/html5_drag.rb +228 -0
  108. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  109. data/lib/capybara/selenium/extensions/scroll.rb +76 -0
  110. data/lib/capybara/selenium/logger_suppressor.rb +40 -0
  111. data/lib/capybara/selenium/node.rb +436 -166
  112. data/lib/capybara/selenium/nodes/chrome_node.rb +137 -0
  113. data/lib/capybara/selenium/nodes/edge_node.rb +104 -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/action_pauser.rb +26 -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 +69 -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 +58 -67
  127. data/lib/capybara/session/config.rb +38 -6
  128. data/lib/capybara/session/matchers.rb +26 -19
  129. data/lib/capybara/session.rb +258 -190
  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 +122 -8
  133. data/lib/capybara/spec/session/accept_alert_spec.rb +11 -11
  134. data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -3
  135. data/lib/capybara/spec/session/accept_prompt_spec.rb +9 -10
  136. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  137. data/lib/capybara/spec/session/all_spec.rb +135 -42
  138. data/lib/capybara/spec/session/ancestor_spec.rb +24 -19
  139. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +67 -38
  140. data/lib/capybara/spec/session/{assert_current_path.rb → assert_current_path_spec.rb} +20 -18
  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.rb → assert_text_spec.rb} +62 -38
  144. data/lib/capybara/spec/session/{assert_title.rb → assert_title_spec.rb} +12 -12
  145. data/lib/capybara/spec/session/attach_file_spec.rb +120 -72
  146. data/lib/capybara/spec/session/body_spec.rb +11 -13
  147. data/lib/capybara/spec/session/check_spec.rb +111 -51
  148. data/lib/capybara/spec/session/choose_spec.rb +62 -30
  149. data/lib/capybara/spec/session/click_button_spec.rb +227 -161
  150. data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -30
  151. data/lib/capybara/spec/session/click_link_spec.rb +78 -55
  152. data/lib/capybara/spec/session/current_scope_spec.rb +7 -7
  153. data/lib/capybara/spec/session/current_url_spec.rb +44 -37
  154. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
  155. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -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 +8 -6
  159. data/lib/capybara/spec/session/element/matches_selector_spec.rb +70 -56
  160. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +7 -7
  161. data/lib/capybara/spec/session/evaluate_script_spec.rb +28 -8
  162. data/lib/capybara/spec/session/execute_script_spec.rb +8 -7
  163. data/lib/capybara/spec/session/fill_in_spec.rb +104 -44
  164. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  165. data/lib/capybara/spec/session/find_by_id_spec.rb +8 -8
  166. data/lib/capybara/spec/session/find_field_spec.rb +33 -31
  167. data/lib/capybara/spec/session/find_link_spec.rb +32 -14
  168. data/lib/capybara/spec/session/find_spec.rb +236 -141
  169. data/lib/capybara/spec/session/first_spec.rb +44 -43
  170. data/lib/capybara/spec/session/frame/frame_title_spec.rb +6 -6
  171. data/lib/capybara/spec/session/frame/frame_url_spec.rb +6 -6
  172. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +32 -20
  173. data/lib/capybara/spec/session/frame/within_frame_spec.rb +44 -19
  174. data/lib/capybara/spec/session/go_back_spec.rb +1 -1
  175. data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
  176. data/lib/capybara/spec/session/has_all_selectors_spec.rb +18 -18
  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 +92 -12
  180. data/lib/capybara/spec/session/has_css_spec.rb +271 -137
  181. data/lib/capybara/spec/session/has_current_path_spec.rb +48 -33
  182. data/lib/capybara/spec/session/has_field_spec.rb +137 -58
  183. data/lib/capybara/spec/session/has_link_spec.rb +30 -6
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +26 -24
  185. data/lib/capybara/spec/session/has_select_spec.rb +75 -47
  186. data/lib/capybara/spec/session/has_selector_spec.rb +102 -69
  187. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  188. data/lib/capybara/spec/session/has_table_spec.rb +170 -4
  189. data/lib/capybara/spec/session/has_text_spec.rb +108 -52
  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 +35 -0
  195. data/lib/capybara/spec/session/node_spec.rb +871 -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 +52 -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 +117 -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 +40 -21
  212. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  213. data/lib/capybara/spec/session/visit_spec.rb +59 -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 +10 -7
  221. data/lib/capybara/spec/session/window/within_window_spec.rb +17 -16
  222. data/lib/capybara/spec/session/within_spec.rb +69 -44
  223. data/lib/capybara/spec/spec_helper.rb +41 -53
  224. data/lib/capybara/spec/test_app.rb +79 -40
  225. data/lib/capybara/spec/views/animated.erb +49 -0
  226. data/lib/capybara/spec/views/form.erb +134 -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 +43 -10
  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_other.erb +6 -0
  255. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  256. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  257. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  258. data/lib/capybara/spec/views/with_windows.erb +1 -1
  259. data/lib/capybara/spec/views/within_frames.erb +1 -1
  260. data/lib/capybara/version.rb +1 -1
  261. data/lib/capybara/window.rb +31 -25
  262. data/lib/capybara.rb +120 -100
  263. data/spec/basic_node_spec.rb +59 -34
  264. data/spec/capybara_spec.rb +54 -52
  265. data/spec/css_builder_spec.rb +101 -0
  266. data/spec/css_splitter_spec.rb +38 -0
  267. data/spec/dsl_spec.rb +80 -53
  268. data/spec/filter_set_spec.rb +24 -7
  269. data/spec/fixtures/certificate.pem +25 -0
  270. data/spec/fixtures/key.pem +27 -0
  271. data/spec/fixtures/selenium_driver_rspec_failure.rb +4 -4
  272. data/spec/fixtures/selenium_driver_rspec_success.rb +4 -4
  273. data/spec/minitest_spec.rb +38 -5
  274. data/spec/minitest_spec_spec.rb +88 -62
  275. data/spec/per_session_config_spec.rb +5 -5
  276. data/spec/rack_test_spec.rb +169 -115
  277. data/spec/regexp_dissassembler_spec.rb +250 -0
  278. data/spec/result_spec.rb +86 -33
  279. data/spec/rspec/features_spec.rb +26 -23
  280. data/spec/rspec/scenarios_spec.rb +8 -4
  281. data/spec/rspec/shared_spec_matchers.rb +393 -363
  282. data/spec/rspec/views_spec.rb +4 -3
  283. data/spec/rspec_matchers_spec.rb +10 -10
  284. data/spec/rspec_spec.rb +109 -85
  285. data/spec/sauce_spec_chrome.rb +43 -0
  286. data/spec/selector_spec.rb +391 -61
  287. data/spec/selenium_spec_chrome.rb +180 -41
  288. data/spec/selenium_spec_chrome_remote.rb +101 -0
  289. data/spec/selenium_spec_edge.rb +28 -8
  290. data/spec/selenium_spec_firefox.rb +211 -0
  291. data/spec/selenium_spec_firefox_remote.rb +80 -0
  292. data/spec/selenium_spec_ie.rb +127 -11
  293. data/spec/selenium_spec_safari.rb +156 -0
  294. data/spec/server_spec.rb +177 -78
  295. data/spec/session_spec.rb +52 -16
  296. data/spec/shared_selenium_node.rb +79 -0
  297. data/spec/shared_selenium_session.rb +455 -123
  298. data/spec/spec_helper.rb +91 -2
  299. data/spec/xpath_builder_spec.rb +93 -0
  300. metadata +343 -42
  301. data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
  302. data/.yard/templates_custom/default/class/html/setup.rb +0 -17
  303. data/.yard/yard_extensions.rb +0 -78
  304. data/lib/capybara/rspec/compound.rb +0 -90
  305. data/lib/capybara/spec/session/assert_selector.rb +0 -149
  306. data/lib/capybara/spec/session/source_spec.rb +0 -0
  307. data/lib/capybara/spec/views/with_title.erb +0 -5
  308. data/spec/selenium_spec_marionette.rb +0 -143
@@ -1,168 +1,216 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- Capybara::SpecHelper.spec "#attach_file" do
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
+
4
9
  before do
5
- @test_file_path = File.expand_path('../fixtures/test_file.txt', File.dirname(__FILE__))
6
- @another_test_file_path = File.expand_path('../fixtures/another_test_file.txt', File.dirname(__FILE__))
7
- @test_jpg_file_path = File.expand_path('../fixtures/capybara.jpg', File.dirname(__FILE__))
8
- @no_extension_file_path = File.expand_path('../fixtures/no_extension', File.dirname(__FILE__))
9
10
  @session.visit('/form')
10
11
  end
11
12
 
12
- context "with normal form" do
13
- it "should set a file path by id" do
14
- @session.attach_file "form_image", with_os_path_separators(__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__)
15
16
  @session.click_button('awesome')
16
- expect(extract_results(@session)['image']).to eq(File.basename(__FILE__))
17
+ expect(extract_results(@session)['image']).to end_with(File.basename(__FILE__))
17
18
  end
18
19
 
19
- it "should set a file path by label" do
20
- @session.attach_file "Image", with_os_path_separators(__FILE__)
20
+ it 'should set a file path by label' do
21
+ @session.attach_file 'Image', with_os_path_separators(__FILE__)
21
22
  @session.click_button('awesome')
22
- expect(extract_results(@session)['image']).to eq(File.basename(__FILE__))
23
+ expect(extract_results(@session)['image']).to end_with(File.basename(__FILE__))
23
24
  end
24
25
 
25
- it "casts to string" do
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__))
29
+ @session.click_button('awesome')
30
+ expect(extract_results(@session)['image']).to end_with(File.basename(__FILE__))
31
+ end
32
+
33
+ it 'casts to string' do
26
34
  @session.attach_file :form_image, with_os_path_separators(__FILE__)
27
35
  @session.click_button('awesome')
28
- expect(extract_results(@session)['image']).to eq(File.basename(__FILE__))
36
+ expect(extract_results(@session)['image']).to end_with(File.basename(__FILE__))
29
37
  end
30
38
  end
31
39
 
32
- context "with multipart form" do
33
- it "should set a file path by id" do
34
- @session.attach_file "form_document", with_os_path_separators(@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)
35
43
  @session.click_button('Upload Single')
36
- expect(@session).to have_content(File.read(@test_file_path))
44
+ expect(@session).to have_content(File.read(test_file_path))
37
45
  end
38
46
 
39
- it "should set a file path by label" do
40
- @session.attach_file "Single Document", with_os_path_separators(@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)
41
49
  @session.click_button('Upload Single')
42
- expect(@session).to have_content(File.read(@test_file_path))
50
+ expect(@session).to have_content(File.read(test_file_path))
43
51
  end
44
52
 
45
- it "should not break if no file is submitted" do
53
+ it 'should not break if no file is submitted' do
46
54
  @session.click_button('Upload Single')
47
55
  expect(@session).to have_content('No file uploaded')
48
56
  end
49
57
 
50
- it "should send content type text/plain when uploading a text file" do
51
- @session.attach_file "Single Document", with_os_path_separators(@test_file_path)
58
+ it 'should send content type text/plain when uploading a text file' do
59
+ @session.attach_file 'Single Document', with_os_path_separators(test_file_path)
52
60
  @session.click_button 'Upload Single'
53
61
  expect(@session).to have_content('text/plain')
54
62
  end
55
63
 
56
- it "should send content type image/jpeg when uploading an image" do
57
- @session.attach_file "Single Document", with_os_path_separators(@test_jpg_file_path)
64
+ it 'should send content type image/jpeg when uploading an image' do
65
+ @session.attach_file 'Single Document', with_os_path_separators(test_jpg_file_path)
58
66
  @session.click_button 'Upload Single'
59
67
  expect(@session).to have_content('image/jpeg')
60
68
  end
61
69
 
62
- it "should not break when uploading a file without extension" do
63
- @session.attach_file "Single Document", with_os_path_separators(@no_extension_file_path)
70
+ it 'should not break when uploading a file without extension' do
71
+ @session.attach_file 'Single Document', with_os_path_separators(no_extension_file_path)
64
72
  @session.click_button 'Upload Single'
65
- expect(@session).to have_content(File.read(@no_extension_file_path))
73
+ expect(@session).to have_content(File.read(no_extension_file_path))
66
74
  end
67
75
 
68
- it "should not break when using HTML5 multiple file input" do
69
- @session.attach_file "Multiple Documents", with_os_path_separators(@test_file_path)
76
+ it 'should not break when using HTML5 multiple file input' do
77
+ @session.attach_file 'Multiple Documents', with_os_path_separators(test_file_path)
70
78
  @session.click_button('Upload Multiple')
71
- expect(@session).to have_content(File.read(@test_file_path))
72
- expect(@session.body).to include("1 | ") # number of files
79
+ expect(@session).to have_content(File.read(test_file_path))
80
+ expect(@session.body).to include('1 | ') # number of files
73
81
  end
74
82
 
75
- it "should not break when using HTML5 multiple file input uploading multiple files" do
76
- @session.attach_file("Multiple Documents",
77
- [@test_file_path, @another_test_file_path].map { |f| with_os_path_separators(f) })
83
+ it 'should not break when using HTML5 multiple file input uploading multiple files' do
84
+ @session.attach_file('Multiple Documents',
85
+ [test_file_path, another_test_file_path].map { |f| with_os_path_separators(f) })
78
86
  @session.click_button('Upload Multiple')
79
- expect(@session.body).to include("2 | ") # number of files
80
- expect(@session.body).to include(File.read(@test_file_path))
81
- expect(@session.body).to include(File.read(@another_test_file_path))
87
+ expect(@session).to have_content('2 | ') # number of files
88
+ expect(@session.body).to include(File.read(test_file_path))
89
+ expect(@session.body).to include(File.read(another_test_file_path))
82
90
  end
83
91
 
84
- it "should not send anything when attaching no files to a multiple upload field" do
92
+ it 'should not send anything when attaching no files to a multiple upload field' do
85
93
  @session.click_button('Upload Empty Multiple')
86
- expect(@session).to have_content("Successfully ignored empty file field")
94
+ expect(@session).to have_content('Successfully ignored empty file field')
87
95
  end
88
96
 
89
- it "should not append files to already attached" do
90
- @session.attach_file "Multiple Documents", with_os_path_separators(@test_file_path)
91
- @session.attach_file("Multiple Documents",
92
- [@test_file_path, @another_test_file_path].map { |f| with_os_path_separators(f) })
97
+ it 'should not append files to already attached' do
98
+ @session.attach_file 'Multiple Documents', with_os_path_separators(test_file_path)
99
+ @session.attach_file 'Multiple Documents', with_os_path_separators(another_test_file_path)
93
100
  @session.click_button('Upload Multiple')
94
- expect(@session.body).to include("2 | ") # number of files
95
- expect(@session.body).to include(File.read(@test_file_path))
96
- expect(@session.body).to include(File.read(@another_test_file_path))
101
+ expect(@session).to have_content('1 | ') # number of files
102
+ expect(@session.body).to include(File.read(another_test_file_path))
103
+ expect(@session.body).not_to include(File.read(test_file_path))
104
+ end
105
+
106
+ it 'should fire change once when uploading multiple files from empty', requires: [:js] do
107
+ @session.visit('with_js')
108
+ @session.attach_file('multiple-file',
109
+ [test_file_path, another_test_file_path].map { |f| with_os_path_separators(f) })
110
+ expect(@session).to have_css('.file_change', count: 1)
111
+ end
112
+
113
+ it 'should fire change once for each set of files uploaded', requires: [:js] do
114
+ @session.visit('with_js')
115
+ @session.attach_file('multiple-file', [test_jpg_file_path].map { |f| with_os_path_separators(f) })
116
+ @session.attach_file('multiple-file',
117
+ [test_file_path, another_test_file_path].map { |f| with_os_path_separators(f) })
118
+ expect(@session).to have_css('.file_change', count: 2)
97
119
  end
98
120
  end
99
121
 
100
122
  context "with a locator that doesn't exist" do
101
- it "should raise an error" do
102
- msg = "Unable to find visible file field \"does not exist\" that is not disabled"
123
+ it 'should raise an error' do
124
+ msg = /Unable to find file field "does not exist"/
103
125
  expect do
104
- @session.attach_file('does not exist', with_os_path_separators(@test_file_path))
126
+ @session.attach_file('does not exist', with_os_path_separators(test_file_path))
105
127
  end.to raise_error(Capybara::ElementNotFound, msg)
106
128
  end
107
129
  end
108
130
 
109
131
  context "with a path that doesn't exist" do
110
- it "should raise an error" do
132
+ it 'should raise an error' do
111
133
  expect { @session.attach_file('Image', '/no_such_file.png') }.to raise_error(Capybara::FileNotFound)
112
134
  end
113
135
  end
114
136
 
115
- context "with :exact option" do
116
- it "should set a file path by partial label when false" do
117
- @session.attach_file "Imag", with_os_path_separators(__FILE__), exact: false
137
+ context 'with :exact option' do
138
+ it 'should set a file path by partial label when false' do
139
+ @session.attach_file 'Imag', with_os_path_separators(__FILE__), exact: false
118
140
  @session.click_button('awesome')
119
- expect(extract_results(@session)['image']).to eq(File.basename(__FILE__))
141
+ expect(extract_results(@session)['image']).to end_with(File.basename(__FILE__))
120
142
  end
121
143
 
122
- it "should not allow partial matches when true" do
144
+ it 'should not allow partial matches when true' do
123
145
  expect do
124
- @session.attach_file "Imag", with_os_path_separators(__FILE__), exact: true
146
+ @session.attach_file 'Imag', with_os_path_separators(__FILE__), exact: true
125
147
  end.to raise_error(Capybara::ElementNotFound)
126
148
  end
127
149
  end
128
150
 
129
- context "with :make_visible option", requires: %i[js es_args] do
130
- it "applies a default style change when true" do
151
+ context 'with :make_visible option', requires: %i[js es_args] do
152
+ it 'applies a default style change when true' do
131
153
  @session.visit('/with_js')
132
154
  expect do
133
- @session.attach_file("hidden_file", with_os_path_separators(__FILE__))
155
+ @session.attach_file('hidden_file', with_os_path_separators(__FILE__))
134
156
  end.to raise_error Capybara::ElementNotFound
135
157
  expect do
136
- @session.attach_file("hidden_file", with_os_path_separators(__FILE__), make_visible: true)
158
+ @session.attach_file('hidden_file', with_os_path_separators(__FILE__), make_visible: true)
137
159
  end.not_to raise_error
138
160
  end
139
161
 
140
- it "accepts a hash of styles to be applied" do
162
+ it 'accepts a hash of styles to be applied' do
141
163
  @session.visit('/with_js')
142
164
  expect do
143
- @session.attach_file("hidden_file",
165
+ @session.attach_file('hidden_file',
144
166
  with_os_path_separators(__FILE__),
145
167
  make_visible: { opacity: 1, display: 'block' })
146
168
  end.not_to raise_error
147
169
  end
148
170
 
149
- it "raises an error when the file input is not made visible" do
171
+ it 'raises an error when the file input is not made visible' do
150
172
  @session.visit('/with_js')
151
173
  expect do
152
- @session.attach_file("hidden_file", with_os_path_separators(__FILE__), make_visible: { color: 'red' })
174
+ @session.attach_file('hidden_file', with_os_path_separators(__FILE__), make_visible: { color: 'red' })
153
175
  end.to raise_error(Capybara::ExpectationNotMet)
154
176
  end
155
177
 
156
- it "resets the style when done" do
178
+ it 'resets the style when done' do
179
+ @session.visit('/with_js')
180
+ @session.attach_file('hidden_file', with_os_path_separators(__FILE__), make_visible: true)
181
+ expect(@session.evaluate_script('arguments[0].style.display', @session.find(:css, '#hidden_file', visible: :all))).to eq 'none'
182
+ end
183
+
184
+ it 'should fire change' do
157
185
  @session.visit('/with_js')
158
- @session.attach_file("hidden_file", with_os_path_separators(__FILE__), make_visible: true)
159
- expect(@session.evaluate_script("arguments[0].style.display", @session.find(:css, '#hidden_file', visible: :all))).to eq 'none'
186
+ @session.attach_file('hidden_file', with_os_path_separators(__FILE__), make_visible: true)
187
+ expect(@session).to have_css('.file_change')
160
188
  end
161
189
  end
162
190
 
163
- private
191
+ context 'with a block', requires: %i[js] do
192
+ it 'can upload by clicking the file input' do
193
+ @session.attach_file(with_os_path_separators(__FILE__)) do
194
+ @session.find(:file_field, 'form[image]').click
195
+ end
196
+ @session.click_button('awesome')
197
+ expect(extract_results(@session)['image']).to end_with(File.basename(__FILE__))
198
+ end
164
199
 
165
- def with_os_path_separators(path)
166
- Gem.win_platform? ? path.to_s.tr('/', '\\') : path.to_s
200
+ it 'can upload by clicking the label' do
201
+ @session.attach_file(with_os_path_separators(__FILE__)) do
202
+ @session.find(:label, 'Hidden Image').click
203
+ end
204
+ @session.click_button('awesome')
205
+ expect(extract_results(@session)['hidden_image']).to end_with(File.basename(__FILE__))
206
+ end
207
+
208
+ it 'should fire change' do
209
+ @session.visit('/with_js')
210
+ @session.attach_file(with_os_path_separators(__FILE__)) do
211
+ @session.find(:label, 'Label for hidden file input').click
212
+ end
213
+ expect(@session).to have_css('.file_change')
214
+ end
167
215
  end
168
216
  end
@@ -1,25 +1,23 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Capybara::SpecHelper.spec '#body' do
4
- it "should return the unmodified page body" do
4
+ it 'should return the unmodified page body' do
5
5
  @session.visit('/')
6
6
  expect(@session).to have_content('Hello world!') # wait for content to appear if visit is async
7
7
  expect(@session.body).to include('Hello world!')
8
8
  end
9
9
 
10
- if "".respond_to?(:encoding)
11
- context "encoding of response between ascii and utf8" do
12
- it "should be valid with html entities" do
13
- @session.visit('/with_html_entities')
14
- expect(@session).to have_content('Encoding') # wait for content to appear if visit is async
15
- expect { @session.body.encode!("UTF-8") }.not_to raise_error
16
- 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
17
16
 
18
- it "should be valid without html entities" do
19
- @session.visit('/with_html')
20
- expect(@session).to have_content('This is a test') # wait for content to appear if visit is async
21
- expect { @session.body.encode!("UTF-8") }.not_to raise_error
22
- 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
23
21
  end
24
22
  end
25
23
  end
@@ -1,189 +1,249 @@
1
1
  # frozen_string_literal: true
2
2
 
3
- Capybara::SpecHelper.spec "#check" do
3
+ Capybara::SpecHelper.spec '#check' do
4
4
  before do
5
5
  @session.visit('/form')
6
6
  end
7
7
 
8
8
  describe "'checked' attribute" do
9
- it "should be true if checked" do
10
- @session.check("Terms of Use")
9
+ it 'should be true if checked' do
10
+ @session.check('Terms of Use')
11
11
  expect(@session.find(:xpath, "//input[@id='form_terms_of_use']")['checked']).to be_truthy
12
12
  end
13
13
 
14
- it "should be false if unchecked" do
14
+ it 'should be false if unchecked' do
15
15
  expect(@session.find(:xpath, "//input[@id='form_terms_of_use']")['checked']).to be_falsey
16
16
  end
17
17
  end
18
18
 
19
- it "should trigger associated events", requires: [:js] do
19
+ it 'should trigger associated events', requires: [:js] do
20
20
  @session.visit('/with_js')
21
21
  @session.check('checkbox_with_event')
22
22
  expect(@session).to have_css('#checkbox_event_triggered')
23
23
  end
24
24
 
25
- describe "checking" do
26
- it "should not change an already checked checkbox" do
25
+ describe 'checking' do
26
+ it 'should not change an already checked checkbox' do
27
27
  expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).to be_checked
28
28
  @session.check('form_pets_dog')
29
29
  expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).to be_checked
30
30
  end
31
31
 
32
- it "should check an unchecked checkbox" do
32
+ it 'should check an unchecked checkbox' do
33
33
  expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).not_to be_checked
34
34
  @session.check('form_pets_cat')
35
35
  expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).to be_checked
36
36
  end
37
37
  end
38
38
 
39
- describe "unchecking" do
40
- it "should not change an already unchecked checkbox" do
39
+ describe 'unchecking' do
40
+ it 'should not change an already unchecked checkbox' do
41
41
  expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).not_to be_checked
42
42
  @session.uncheck('form_pets_cat')
43
43
  expect(@session.find(:xpath, "//input[@id='form_pets_cat']")).not_to be_checked
44
44
  end
45
45
 
46
- it "should uncheck a checked checkbox" do
46
+ it 'should uncheck a checked checkbox' do
47
47
  expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).to be_checked
48
48
  @session.uncheck('form_pets_dog')
49
49
  expect(@session.find(:xpath, "//input[@id='form_pets_dog']")).not_to be_checked
50
50
  end
51
51
  end
52
52
 
53
- it "should check a checkbox by id" do
54
- @session.check("form_pets_cat")
53
+ it 'should check a checkbox by id' do
54
+ @session.check('form_pets_cat')
55
55
  @session.click_button('awesome')
56
56
  expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
57
57
  end
58
58
 
59
- it "should check a checkbox by label" do
60
- @session.check("Cat")
59
+ it 'should check a checkbox by label' do
60
+ @session.check('Cat')
61
61
  @session.click_button('awesome')
62
62
  expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
63
63
  end
64
64
 
65
- it "casts to string" do
65
+ it 'should work without a locator string' do
66
+ @session.check(id: 'form_pets_cat')
67
+ @session.click_button('awesome')
68
+ expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
69
+ end
70
+
71
+ it 'should be able to check itself if no locator specified' do
72
+ cb = @session.find(:id, 'form_pets_cat')
73
+ cb.check
74
+ @session.click_button('awesome')
75
+ expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
76
+ end
77
+
78
+ it 'casts to string' do
66
79
  @session.check(:form_pets_cat)
67
80
  @session.click_button('awesome')
68
81
  expect(extract_results(@session)['pets']).to include('dog', 'cat', 'hamster')
69
82
  end
70
83
 
71
84
  context "with a locator that doesn't exist" do
72
- it "should raise an error" do
73
- 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"/
74
87
  expect do
75
88
  @session.check('does not exist')
76
89
  end.to raise_error(Capybara::ElementNotFound, msg)
77
90
  end
78
91
  end
79
92
 
80
- context "with a disabled checkbox" do
81
- 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'
82
96
  expect do
83
97
  @session.check('Disabled Checkbox')
84
- end.to raise_error(Capybara::ElementNotFound)
98
+ end.to raise_error(Capybara::ElementNotFound, msg)
85
99
  end
86
100
  end
87
101
 
88
- context "with :exact option" do
89
- it "should accept partial matches when false" do
102
+ context 'with :exact option' do
103
+ it 'should accept partial matches when false' do
90
104
  @session.check('Ham', exact: false)
91
105
  @session.click_button('awesome')
92
106
  expect(extract_results(@session)['pets']).to include('hamster')
93
107
  end
94
108
 
95
- it "should not accept partial matches when true" do
109
+ it 'should not accept partial matches when true' do
96
110
  expect do
97
111
  @session.check('Ham', exact: true)
98
112
  end.to raise_error(Capybara::ElementNotFound)
99
113
  end
100
114
  end
101
115
 
102
- context "with `option` option" do
103
- it "can check boxes by their value" do
104
- @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')
105
125
  @session.click_button('awesome')
106
126
  expect(extract_results(@session)['pets']).to include('cat')
107
127
  end
108
128
 
109
- it "should raise an error if option not found" do
129
+ it 'should raise an error if option not found' do
110
130
  expect do
111
- @session.check('form[pets][]', option: "elephant")
131
+ @session.check('form[pets][]', option: 'elephant')
112
132
  end.to raise_error(Capybara::ElementNotFound)
113
133
  end
114
134
  end
115
135
 
116
- context "when checkbox hidden" do
117
- context "with Capybara.automatic_label_click == true" do
136
+ context 'when checkbox hidden' do
137
+ context 'with Capybara.automatic_label_click == true' do
118
138
  around do |spec|
119
139
  old_click_label, Capybara.automatic_label_click = Capybara.automatic_label_click, true
120
140
  spec.run
121
141
  Capybara.automatic_label_click = old_click_label
122
142
  end
123
143
 
124
- it "should check via clicking the label with :for attribute if possible" do
125
- 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
126
146
  @session.check('form_cars_tesla')
127
147
  @session.click_button('awesome')
128
148
  expect(extract_results(@session)['cars']).to include('tesla')
129
149
  end
130
150
 
131
- it "should check via clicking the wrapping label if possible" do
132
- 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
133
153
  @session.check('form_cars_mclaren')
134
154
  @session.click_button('awesome')
135
155
  expect(extract_results(@session)['cars']).to include('mclaren')
136
156
  end
137
157
 
138
- it "should not click the label if unneeded" do
139
- 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
140
174
  @session.check('form_cars_jaguar')
141
175
  @session.click_button('awesome')
142
176
  expect(extract_results(@session)['cars']).to include('jaguar')
143
177
  end
144
178
 
145
- it "should raise original error when no label available" do
146
- 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"/)
147
181
  end
148
182
 
149
- it "should raise error if not allowed to click label" do
150
- 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"/)
151
185
  end
152
186
  end
153
187
 
154
- context "with Capybara.automatic_label_click == false" do
188
+ context 'with Capybara.automatic_label_click == false' do
155
189
  around do |spec|
156
190
  old_label_click, Capybara.automatic_label_click = Capybara.automatic_label_click, false
157
191
  spec.run
158
192
  Capybara.automatic_label_click = old_label_click
159
193
  end
160
194
 
161
- it "should raise error if checkbox not visible" do
162
- 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')
163
201
  end
164
202
 
165
- context "with allow_label_click == true" do
166
- it "should check via the label if input is hidden" do
167
- 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
168
206
  @session.check('form_cars_tesla', allow_label_click: true)
169
207
  @session.click_button('awesome')
170
208
  expect(extract_results(@session)['cars']).to include('tesla')
171
209
  end
172
210
 
173
- it "should not wait the full time if label can be clicked" do
174
- 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
175
213
  start_time = Time.now
176
214
  @session.check('form_cars_tesla', allow_label_click: true, wait: 10)
177
215
  end_time = Time.now
178
216
  expect(end_time - start_time).to be < 10
179
217
  end
180
218
 
181
- it "should check via the label if input is moved off the left edge of the page" do
182
- 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
183
221
  @session.check('form_cars_pagani', allow_label_click: true)
184
222
  @session.click_button('awesome')
185
223
  expect(extract_results(@session)['cars']).to include('pagani')
186
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
+ expect(@session.find(:checkbox, 'form_cars_lotus', unchecked: true, visible: :hidden)).to be_truthy
243
+ @session.check('form_cars_lotus', allow_label_click: { x: 90, y: 10 })
244
+ @session.click_button('awesome')
245
+ expect(extract_results(@session)['cars']).to include('lotus')
246
+ end
187
247
  end
188
248
  end
189
249
  end