capybara 2.7.0 → 3.35.3

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 (318) hide show
  1. checksums.yaml +5 -5
  2. data/.yardopts +1 -0
  3. data/History.md +1147 -11
  4. data/License.txt +1 -1
  5. data/README.md +252 -131
  6. data/lib/capybara/config.rb +92 -0
  7. data/lib/capybara/cucumber.rb +3 -3
  8. data/lib/capybara/driver/base.rb +52 -21
  9. data/lib/capybara/driver/node.rb +48 -14
  10. data/lib/capybara/dsl.rb +16 -9
  11. data/lib/capybara/helpers.rb +72 -81
  12. data/lib/capybara/minitest/spec.rb +267 -0
  13. data/lib/capybara/minitest.rb +385 -0
  14. data/lib/capybara/node/actions.rb +337 -89
  15. data/lib/capybara/node/base.rb +50 -32
  16. data/lib/capybara/node/document.rb +19 -3
  17. data/lib/capybara/node/document_matchers.rb +22 -24
  18. data/lib/capybara/node/element.rb +388 -125
  19. data/lib/capybara/node/finders.rb +231 -121
  20. data/lib/capybara/node/matchers.rb +503 -217
  21. data/lib/capybara/node/simple.rb +64 -27
  22. data/lib/capybara/queries/ancestor_query.rb +27 -0
  23. data/lib/capybara/queries/base_query.rb +87 -11
  24. data/lib/capybara/queries/current_path_query.rb +24 -24
  25. data/lib/capybara/queries/match_query.rb +15 -10
  26. data/lib/capybara/queries/selector_query.rb +675 -81
  27. data/lib/capybara/queries/sibling_query.rb +26 -0
  28. data/lib/capybara/queries/style_query.rb +45 -0
  29. data/lib/capybara/queries/text_query.rb +88 -20
  30. data/lib/capybara/queries/title_query.rb +9 -11
  31. data/lib/capybara/rack_test/browser.rb +63 -39
  32. data/lib/capybara/rack_test/css_handlers.rb +6 -4
  33. data/lib/capybara/rack_test/driver.rb +26 -16
  34. data/lib/capybara/rack_test/errors.rb +6 -0
  35. data/lib/capybara/rack_test/form.rb +73 -58
  36. data/lib/capybara/rack_test/node.rb +187 -67
  37. data/lib/capybara/rails.rb +4 -8
  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 +142 -14
  43. data/lib/capybara/rspec/features.rb +17 -42
  44. data/lib/capybara/rspec/matcher_proxies.rb +82 -0
  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 +143 -244
  59. data/lib/capybara/rspec.rb +10 -12
  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 +102 -0
  63. data/lib/capybara/selector/definition/button.rb +63 -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 +278 -0
  85. data/lib/capybara/selector/filter.rb +3 -46
  86. data/lib/capybara/selector/filter_set.rb +124 -0
  87. data/lib/capybara/selector/filters/base.rb +77 -0
  88. data/lib/capybara/selector/filters/expression_filter.rb +22 -0
  89. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  90. data/lib/capybara/selector/filters/node_filter.rb +31 -0
  91. data/lib/capybara/selector/regexp_disassembler.rb +214 -0
  92. data/lib/capybara/selector/selector.rb +155 -0
  93. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  94. data/lib/capybara/selector.rb +232 -369
  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 +380 -142
  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 +528 -97
  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 +63 -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 +74 -71
  127. data/lib/capybara/session/config.rb +126 -0
  128. data/lib/capybara/session/matchers.rb +44 -27
  129. data/lib/capybara/session.rb +500 -297
  130. data/lib/capybara/spec/fixtures/no_extension +1 -0
  131. data/lib/capybara/spec/public/jquery.js +5 -5
  132. data/lib/capybara/spec/public/offset.js +6 -0
  133. data/lib/capybara/spec/public/test.js +168 -14
  134. data/lib/capybara/spec/session/accept_alert_spec.rb +37 -14
  135. data/lib/capybara/spec/session/accept_confirm_spec.rb +7 -6
  136. data/lib/capybara/spec/session/accept_prompt_spec.rb +38 -10
  137. data/lib/capybara/spec/session/all_spec.rb +179 -59
  138. data/lib/capybara/spec/session/ancestor_spec.rb +88 -0
  139. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +140 -0
  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_spec.rb +93 -0
  145. data/lib/capybara/spec/session/attach_file_spec.rb +154 -48
  146. data/lib/capybara/spec/session/body_spec.rb +12 -13
  147. data/lib/capybara/spec/session/check_spec.rb +168 -41
  148. data/lib/capybara/spec/session/choose_spec.rb +75 -23
  149. data/lib/capybara/spec/session/click_button_spec.rb +243 -175
  150. data/lib/capybara/spec/session/click_link_or_button_spec.rb +57 -32
  151. data/lib/capybara/spec/session/click_link_spec.rb +100 -53
  152. data/lib/capybara/spec/session/current_scope_spec.rb +11 -10
  153. data/lib/capybara/spec/session/current_url_spec.rb +61 -35
  154. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +7 -7
  155. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +5 -4
  156. data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +13 -6
  157. data/lib/capybara/spec/session/element/match_css_spec.rb +21 -7
  158. data/lib/capybara/spec/session/element/match_xpath_spec.rb +9 -7
  159. data/lib/capybara/spec/session/element/matches_selector_spec.rb +91 -34
  160. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
  161. data/lib/capybara/spec/session/evaluate_script_spec.rb +45 -3
  162. data/lib/capybara/spec/session/execute_script_spec.rb +24 -4
  163. data/lib/capybara/spec/session/fill_in_spec.rb +166 -64
  164. data/lib/capybara/spec/session/find_button_spec.rb +37 -18
  165. data/lib/capybara/spec/session/find_by_id_spec.rb +10 -9
  166. data/lib/capybara/spec/session/find_field_spec.rb +57 -34
  167. data/lib/capybara/spec/session/find_link_spec.rb +47 -10
  168. data/lib/capybara/spec/session/find_spec.rb +290 -144
  169. data/lib/capybara/spec/session/first_spec.rb +91 -48
  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 +116 -0
  173. data/lib/capybara/spec/session/frame/within_frame_spec.rb +112 -0
  174. data/lib/capybara/spec/session/go_back_spec.rb +3 -2
  175. data/lib/capybara/spec/session/go_forward_spec.rb +3 -2
  176. data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
  177. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  178. data/lib/capybara/spec/session/has_any_selectors_spec.rb +25 -0
  179. data/lib/capybara/spec/session/has_button_spec.rb +76 -19
  180. data/lib/capybara/spec/session/has_css_spec.rb +277 -131
  181. data/lib/capybara/spec/session/has_current_path_spec.rb +98 -26
  182. data/lib/capybara/spec/session/has_field_spec.rb +177 -107
  183. data/lib/capybara/spec/session/has_link_spec.rb +13 -12
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
  185. data/lib/capybara/spec/session/has_select_spec.rb +191 -95
  186. data/lib/capybara/spec/session/has_selector_spec.rb +128 -64
  187. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  188. data/lib/capybara/spec/session/has_table_spec.rb +172 -5
  189. data/lib/capybara/spec/session/has_text_spec.rb +126 -60
  190. data/lib/capybara/spec/session/has_title_spec.rb +35 -12
  191. data/lib/capybara/spec/session/has_xpath_spec.rb +74 -53
  192. data/lib/capybara/spec/session/{headers.rb → headers_spec.rb} +3 -2
  193. data/lib/capybara/spec/session/html_spec.rb +14 -6
  194. data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
  195. data/lib/capybara/spec/session/node_spec.rb +1028 -131
  196. data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  197. data/lib/capybara/spec/session/refresh_spec.rb +34 -0
  198. data/lib/capybara/spec/session/reset_session_spec.rb +75 -34
  199. data/lib/capybara/spec/session/{response_code.rb → response_code_spec.rb} +2 -1
  200. data/lib/capybara/spec/session/save_and_open_page_spec.rb +3 -2
  201. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +11 -15
  202. data/lib/capybara/spec/session/save_page_spec.rb +42 -55
  203. data/lib/capybara/spec/session/save_screenshot_spec.rb +16 -14
  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 +112 -85
  207. data/lib/capybara/spec/session/selectors_spec.rb +71 -8
  208. data/lib/capybara/spec/session/sibling_spec.rb +52 -0
  209. data/lib/capybara/spec/session/text_spec.rb +38 -23
  210. data/lib/capybara/spec/session/title_spec.rb +17 -5
  211. data/lib/capybara/spec/session/uncheck_spec.rb +71 -12
  212. data/lib/capybara/spec/session/unselect_spec.rb +44 -43
  213. data/lib/capybara/spec/session/visit_spec.rb +99 -32
  214. data/lib/capybara/spec/session/window/become_closed_spec.rb +33 -29
  215. data/lib/capybara/spec/session/window/current_window_spec.rb +5 -3
  216. data/lib/capybara/spec/session/window/open_new_window_spec.rb +5 -3
  217. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +39 -30
  218. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +17 -10
  219. data/lib/capybara/spec/session/window/window_spec.rb +121 -73
  220. data/lib/capybara/spec/session/window/windows_spec.rb +12 -10
  221. data/lib/capybara/spec/session/window/within_window_spec.rb +52 -82
  222. data/lib/capybara/spec/session/within_spec.rb +76 -43
  223. data/lib/capybara/spec/spec_helper.rb +67 -33
  224. data/lib/capybara/spec/test_app.rb +85 -36
  225. data/lib/capybara/spec/views/animated.erb +49 -0
  226. data/lib/capybara/spec/views/buttons.erb +1 -1
  227. data/lib/capybara/spec/views/fieldsets.erb +1 -1
  228. data/lib/capybara/spec/views/form.erb +227 -20
  229. data/lib/capybara/spec/views/frame_child.erb +10 -2
  230. data/lib/capybara/spec/views/frame_one.erb +2 -1
  231. data/lib/capybara/spec/views/frame_parent.erb +2 -2
  232. data/lib/capybara/spec/views/frame_two.erb +1 -1
  233. data/lib/capybara/spec/views/header_links.erb +1 -1
  234. data/lib/capybara/spec/views/host_links.erb +1 -1
  235. data/lib/capybara/spec/views/initial_alert.erb +10 -0
  236. data/lib/capybara/spec/views/obscured.erb +47 -0
  237. data/lib/capybara/spec/views/offset.erb +32 -0
  238. data/lib/capybara/spec/views/path.erb +1 -1
  239. data/lib/capybara/spec/views/popup_one.erb +1 -1
  240. data/lib/capybara/spec/views/popup_two.erb +1 -1
  241. data/lib/capybara/spec/views/postback.erb +1 -1
  242. data/lib/capybara/spec/views/react.erb +45 -0
  243. data/lib/capybara/spec/views/scroll.erb +20 -0
  244. data/lib/capybara/spec/views/spatial.erb +31 -0
  245. data/lib/capybara/spec/views/tables.erb +69 -2
  246. data/lib/capybara/spec/views/with_animation.erb +82 -0
  247. data/lib/capybara/spec/views/with_base_tag.erb +1 -1
  248. data/lib/capybara/spec/views/with_count.erb +1 -1
  249. data/lib/capybara/spec/views/with_dragula.erb +24 -0
  250. data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
  251. data/lib/capybara/spec/views/with_hover.erb +7 -1
  252. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  253. data/lib/capybara/spec/views/with_html.erb +100 -10
  254. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  255. data/lib/capybara/spec/views/with_html_entities.erb +1 -1
  256. data/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  257. data/lib/capybara/spec/views/with_js.erb +49 -3
  258. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  259. data/lib/capybara/spec/views/with_namespace.erb +20 -0
  260. data/lib/capybara/spec/views/with_scope.erb +1 -1
  261. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  262. data/lib/capybara/spec/views/with_simple_html.erb +1 -1
  263. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  264. data/lib/capybara/spec/views/with_title.erb +1 -1
  265. data/lib/capybara/spec/views/with_unload_alert.erb +3 -1
  266. data/lib/capybara/spec/views/with_windows.erb +7 -1
  267. data/lib/capybara/spec/views/within_frames.erb +6 -3
  268. data/lib/capybara/version.rb +2 -1
  269. data/lib/capybara/window.rb +39 -21
  270. data/lib/capybara.rb +208 -186
  271. data/spec/basic_node_spec.rb +52 -39
  272. data/spec/capybara_spec.rb +72 -50
  273. data/spec/css_builder_spec.rb +101 -0
  274. data/spec/css_splitter_spec.rb +38 -0
  275. data/spec/dsl_spec.rb +81 -61
  276. data/spec/filter_set_spec.rb +46 -0
  277. data/spec/fixtures/capybara.csv +1 -0
  278. data/spec/fixtures/certificate.pem +25 -0
  279. data/spec/fixtures/key.pem +27 -0
  280. data/spec/fixtures/selenium_driver_rspec_failure.rb +7 -3
  281. data/spec/fixtures/selenium_driver_rspec_success.rb +7 -3
  282. data/spec/minitest_spec.rb +164 -0
  283. data/spec/minitest_spec_spec.rb +162 -0
  284. data/spec/per_session_config_spec.rb +68 -0
  285. data/spec/rack_test_spec.rb +189 -96
  286. data/spec/regexp_dissassembler_spec.rb +250 -0
  287. data/spec/result_spec.rb +143 -13
  288. data/spec/rspec/features_spec.rb +38 -32
  289. data/spec/rspec/scenarios_spec.rb +9 -7
  290. data/spec/rspec/shared_spec_matchers.rb +959 -0
  291. data/spec/rspec/views_spec.rb +9 -3
  292. data/spec/rspec_matchers_spec.rb +62 -0
  293. data/spec/rspec_spec.rb +127 -30
  294. data/spec/sauce_spec_chrome.rb +43 -0
  295. data/spec/selector_spec.rb +458 -37
  296. data/spec/selenium_spec_chrome.rb +196 -9
  297. data/spec/selenium_spec_chrome_remote.rb +100 -0
  298. data/spec/selenium_spec_edge.rb +47 -0
  299. data/spec/selenium_spec_firefox.rb +210 -0
  300. data/spec/selenium_spec_firefox_remote.rb +80 -0
  301. data/spec/selenium_spec_ie.rb +150 -0
  302. data/spec/selenium_spec_safari.rb +148 -0
  303. data/spec/server_spec.rb +200 -101
  304. data/spec/session_spec.rb +91 -0
  305. data/spec/shared_selenium_node.rb +83 -0
  306. data/spec/shared_selenium_session.rb +558 -0
  307. data/spec/spec_helper.rb +94 -2
  308. data/spec/xpath_builder_spec.rb +93 -0
  309. metadata +420 -60
  310. data/lib/capybara/query.rb +0 -7
  311. data/lib/capybara/spec/session/assert_current_path.rb +0 -60
  312. data/lib/capybara/spec/session/assert_selector.rb +0 -148
  313. data/lib/capybara/spec/session/assert_text.rb +0 -196
  314. data/lib/capybara/spec/session/assert_title.rb +0 -70
  315. data/lib/capybara/spec/session/source_spec.rb +0 -0
  316. data/lib/capybara/spec/session/within_frame_spec.rb +0 -53
  317. data/spec/rspec/matchers_spec.rb +0 -827
  318. data/spec/selenium_spec.rb +0 -151
@@ -1,29 +1,48 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Capybara::SpecHelper.spec Capybara::Selector do
2
4
  before do
3
5
  @session.visit('/form')
4
6
  end
5
7
 
6
- describe ":label selector" do
7
- it "finds a label by text" do
8
+ describe ':label selector' do
9
+ it 'finds a label by text' do
8
10
  expect(@session.find(:label, 'Customer Name').text).to eq 'Customer Name'
9
11
  end
10
12
 
11
- it "finds a label by for attribute string" do
13
+ it 'finds a label by for attribute string' do
12
14
  expect(@session.find(:label, for: 'form_other_title')['for']).to eq 'form_other_title'
13
15
  end
14
16
 
15
- it "finds a label from nested input using :for filter" do
17
+ it 'finds a label for for attribute regex' do
18
+ expect(@session.find(:label, for: /_other_title/)['for']).to eq 'form_other_title'
19
+ end
20
+
21
+ it 'finds a label from nested input using :for filter with id string' do
22
+ expect(@session.find(:label, for: 'nested_label').text).to eq 'Nested Label'
23
+ end
24
+
25
+ it 'finds a label from nested input using :for filter with id regexp' do
26
+ expect(@session.find(:label, for: /nested_lab/).text).to eq 'Nested Label'
27
+ end
28
+
29
+ it 'finds a label from nested input using :for filter with element' do
16
30
  input = @session.find(:id, 'nested_label')
17
31
  expect(@session.find(:label, for: input).text).to eq 'Nested Label'
18
32
  end
19
33
 
20
- it "finds the label for an non-nested element when using :for filter" do
34
+ it 'finds a label from nested input using :for filter with element when no id on label' do
35
+ input = @session.find(:css, '#wrapper_label').find(:css, 'input')
36
+ expect(@session.find(:label, for: input).text).to eq 'Wrapper Label'
37
+ end
38
+
39
+ it 'finds the label for an non-nested element when using :for filter' do
21
40
  select = @session.find(:id, 'form_other_title')
22
41
  expect(@session.find(:label, for: select)['for']).to eq 'form_other_title'
23
42
  end
24
43
 
25
- context "with exact option" do
26
- it "matches substrings" do
44
+ context 'with exact option' do
45
+ it 'matches substrings' do
27
46
  expect(@session.find(:label, 'Customer Na', exact: false).text).to eq 'Customer Name'
28
47
  end
29
48
 
@@ -32,4 +51,48 @@ Capybara::SpecHelper.spec Capybara::Selector do
32
51
  end
33
52
  end
34
53
  end
35
- end
54
+
55
+ describe 'field selectors' do
56
+ context 'with :id option' do
57
+ it 'can find specifically by id' do
58
+ expect(@session.find(:field, id: 'customer_email').value).to eq 'ben@ben.com'
59
+ end
60
+
61
+ it 'can find by regex' do
62
+ expect(@session.find(:field, id: /ustomer.emai/).value).to eq 'ben@ben.com'
63
+ end
64
+
65
+ it 'can find by case-insensitive id' do
66
+ expect(@session.find(:field, id: /StOmer.emAI/i).value).to eq 'ben@ben.com'
67
+ end
68
+ end
69
+
70
+ it 'can find specifically by name string' do
71
+ expect(@session.find(:field, name: 'form[other_title]')['id']).to eq 'form_other_title'
72
+ end
73
+
74
+ it 'can find specifically by name regex' do
75
+ expect(@session.find(:field, name: /form\[other_.*\]/)['id']).to eq 'form_other_title'
76
+ end
77
+
78
+ it 'can find specifically by placeholder string' do
79
+ expect(@session.find(:field, placeholder: 'FirstName')['id']).to eq 'form_first_name'
80
+ end
81
+
82
+ it 'can find specifically by placeholder regex' do
83
+ expect(@session.find(:field, placeholder: /FirstN.*/)['id']).to eq 'form_first_name'
84
+ end
85
+
86
+ it 'can find by type' do
87
+ expect(@session.find(:field, 'Confusion', type: 'checkbox')['id']).to eq 'confusion_checkbox'
88
+ expect(@session.find(:field, 'Confusion', type: 'text')['id']).to eq 'confusion_text'
89
+ expect(@session.find(:field, 'Confusion', type: 'textarea')['id']).to eq 'confusion_textarea'
90
+ end
91
+
92
+ it 'can find by class' do
93
+ expect(@session.find(:field, class: 'confusion-checkbox')['id']).to eq 'confusion_checkbox'
94
+ expect(@session).to have_selector(:field, class: 'confusion', count: 3)
95
+ expect(@session.find(:field, class: %w[confusion confusion-textarea])['id']).to eq 'confusion_textarea'
96
+ end
97
+ end
98
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#sibling' do
4
+ before do
5
+ @session.visit('/with_html')
6
+ end
7
+
8
+ after do
9
+ Capybara::Selector.remove(:monkey)
10
+ end
11
+
12
+ it 'should find a prior sibling element using the given locator' do
13
+ el = @session.find(:css, '#mid_sibling')
14
+ expect(el.sibling('//div[@data-pre]')[:id]).to eq('pre_sibling')
15
+ end
16
+
17
+ it 'should find a following sibling element using the given locator' do
18
+ el = @session.find(:css, '#mid_sibling')
19
+ expect(el.sibling('//div[@data-post]')[:id]).to eq('post_sibling')
20
+ end
21
+
22
+ it 'should raise an error if there are multiple matches' do
23
+ el = @session.find(:css, '#mid_sibling')
24
+ expect { el.sibling('//div') }.to raise_error(Capybara::Ambiguous)
25
+ end
26
+
27
+ context 'with css selectors' do
28
+ it 'should find the first element using the given locator' do
29
+ el = @session.find(:css, '#mid_sibling')
30
+ expect(el.sibling(:css, '#pre_sibling')).to have_text('Pre Sibling')
31
+ expect(el.sibling(:css, '#post_sibling')).to have_text('Post Sibling')
32
+ end
33
+ end
34
+
35
+ context 'with custom selector' do
36
+ it 'should use the custom selector' do
37
+ Capybara.add_selector(:data_attribute) do
38
+ xpath { |attr| ".//*[@data-#{attr}]" }
39
+ end
40
+ el = @session.find(:css, '#mid_sibling')
41
+ expect(el.sibling(:data_attribute, 'pre').text).to eq('Pre Sibling')
42
+ expect(el.sibling(:data_attribute, 'post').text).to eq('Post Sibling')
43
+ end
44
+ end
45
+
46
+ it 'should raise ElementNotFound with a useful default message if nothing was found' do
47
+ el = @session.find(:css, '#child')
48
+ expect do
49
+ el.sibling(:xpath, '//div[@id="nosuchthing"]')
50
+ end.to raise_error(Capybara::ElementNotFound, 'Unable to find xpath "//div[@id=\\"nosuchthing\\"]" that is a sibling of visible css "#child"')
51
+ end
52
+ end
@@ -1,59 +1,74 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#text' do
3
- it "should print the text of the page" do
4
+ it 'should print the text of the page' do
4
5
  @session.visit('/with_simple_html')
5
6
  expect(@session.text).to eq('Bar')
6
7
  end
7
8
 
8
- it "ignores invisible text by default" do
9
+ it 'ignores invisible text by default' do
9
10
  @session.visit('/with_html')
10
- expect(@session.find(:id, "hidden-text").text).to eq('Some of this text is')
11
+ expect(@session.find(:id, 'hidden-text').text).to eq('Some of this text is')
11
12
  end
12
13
 
13
- it "shows invisible text if `:all` given" do
14
+ it 'shows invisible text if `:all` given' do
14
15
  @session.visit('/with_html')
15
- expect(@session.find(:id, "hidden-text").text(:all)).to eq('Some of this text is hidden!')
16
+ expect(@session.find(:id, 'hidden-text').text(:all)).to eq('Some of this text is hidden!')
16
17
  end
17
18
 
18
- it "ignores invisible text if `:visible` given" do
19
+ it 'ignores invisible text if `:visible` given' do
19
20
  Capybara.ignore_hidden_elements = false
20
21
  @session.visit('/with_html')
21
- expect(@session.find(:id, "hidden-text").text(:visible)).to eq('Some of this text is')
22
+ expect(@session.find(:id, 'hidden-text').text(:visible)).to eq('Some of this text is')
22
23
  end
23
24
 
24
- it "ignores invisible text if `Capybara.ignore_hidden_elements = true`" do
25
+ it 'ignores invisible text if `Capybara.ignore_hidden_elements = true`' do
25
26
  @session.visit('/with_html')
26
- expect(@session.find(:id, "hidden-text").text).to eq('Some of this text is')
27
+ expect(@session.find(:id, 'hidden-text').text).to eq('Some of this text is')
27
28
  Capybara.ignore_hidden_elements = false
28
- expect(@session.find(:id, "hidden-text").text).to eq('Some of this text is hidden!')
29
+ expect(@session.find(:id, 'hidden-text').text).to eq('Some of this text is hidden!')
29
30
  end
30
31
 
31
- it "ignores invisible text if `Capybara.visible_text_only = true`" do
32
+ it 'ignores invisible text if `Capybara.visible_text_only = true`' do
32
33
  @session.visit('/with_html')
33
34
  Capybara.visible_text_only = true
34
- expect(@session.find(:id, "hidden-text").text).to eq('Some of this text is')
35
+ expect(@session.find(:id, 'hidden-text').text).to eq('Some of this text is')
35
36
  Capybara.ignore_hidden_elements = false
36
- expect(@session.find(:id, "hidden-text").text).to eq('Some of this text is')
37
+ expect(@session.find(:id, 'hidden-text').text).to eq('Some of this text is')
37
38
  end
38
-
39
- it "ignores invisible text if ancestor is invisible" do
39
+
40
+ it 'ignores invisible text if ancestor is invisible' do
40
41
  @session.visit('/with_html')
41
- expect(@session.find(:id, "hidden_via_ancestor", visible: false).text).to eq('')
42
+ expect(@session.find(:id, 'hidden_via_ancestor', visible: false).text).to eq('')
42
43
  end
43
44
 
44
- context "with css as default selector" do
45
+ context 'with css as default selector' do
45
46
  before { Capybara.default_selector = :css }
46
- it "should print the text of the page" do
47
+
48
+ after { Capybara.default_selector = :xpath }
49
+
50
+ it 'should print the text of the page' do
47
51
  @session.visit('/with_simple_html')
48
52
  expect(@session.text).to eq('Bar')
49
53
  end
50
- after { Capybara.default_selector = :xpath }
51
54
  end
52
55
 
53
- it "should strip whitespace" do
56
+ it 'should be correctly normalized when visible' do
57
+ @session.visit('/with_html')
58
+ el = @session.find(:css, '#normalized')
59
+ expect(el.text).to eq "Some text\nMore text\nAnd more text\nEven more text on multiple lines"
60
+ end
61
+
62
+ it 'should be a textContent with irrelevant whitespace collapsed when non-visible' do
63
+ @session.visit('/with_html')
64
+ el = @session.find(:css, '#non_visible_normalized', visible: false)
65
+ expect(el.text(:all)).to eq 'Some textMore text And more text Even more text on multiple lines'
66
+ end
67
+
68
+ it 'should strip correctly' do
54
69
  @session.visit('/with_html')
55
- n = @session.find(:css, '#second')
56
- expect(@session.find(:css, '#second').text).to match \
57
- /\ADuis aute .* text with whitespace .* est laborum\.\z/
70
+ el = @session.find(:css, '#ws')
71
+ expect(el.text).to eq ' '
72
+ expect(el.text(:all)).to eq ' '
58
73
  end
59
74
  end
@@ -1,17 +1,29 @@
1
1
  # frozen_string_literal: true
2
- Capybara::SpecHelper.spec '#title' do
3
2
 
4
- it "should get the title of the page" do
3
+ Capybara::SpecHelper.spec '#title' do
4
+ it 'should get the title of the page' do
5
5
  @session.visit('/with_title')
6
6
  expect(@session.title).to eq('Test Title')
7
7
  end
8
8
 
9
- context "with css as default selector" do
9
+ context 'with css as default selector' do
10
10
  before { Capybara.default_selector = :css }
11
- it "should get the title of the page" do
11
+
12
+ after { Capybara.default_selector = :xpath }
13
+
14
+ it 'should get the title of the page' do
12
15
  @session.visit('/with_title')
13
16
  expect(@session.title).to eq('Test Title')
14
17
  end
15
- after { Capybara.default_selector = :xpath }
18
+ end
19
+
20
+ context 'within iframe', requires: [:frames] do
21
+ it 'should get the title of the top level browsing context' do
22
+ @session.visit('/within_frames')
23
+ expect(@session.title).to eq('With Frames')
24
+ @session.within_frame('frameOne') do
25
+ expect(@session.title).to eq('With Frames')
26
+ end
27
+ end
16
28
  end
17
29
  end
@@ -1,41 +1,100 @@
1
1
  # frozen_string_literal: true
2
- Capybara::SpecHelper.spec "#uncheck" do
2
+
3
+ Capybara::SpecHelper.spec '#uncheck' do
3
4
  before do
4
5
  @session.visit('/form')
5
6
  end
6
7
 
7
- it "should uncheck a checkbox by id" do
8
- @session.uncheck("form_pets_hamster")
8
+ it 'should uncheck a checkbox by id' do
9
+ @session.uncheck('form_pets_hamster')
10
+ @session.click_button('awesome')
11
+ expect(extract_results(@session)['pets']).to include('dog')
12
+ expect(extract_results(@session)['pets']).not_to include('hamster')
13
+ end
14
+
15
+ it 'should uncheck a checkbox by label' do
16
+ @session.uncheck('Hamster')
17
+ @session.click_button('awesome')
18
+ expect(extract_results(@session)['pets']).to include('dog')
19
+ expect(extract_results(@session)['pets']).not_to include('hamster')
20
+ end
21
+
22
+ it 'should work without a locator string' do
23
+ @session.uncheck(id: 'form_pets_hamster')
9
24
  @session.click_button('awesome')
10
25
  expect(extract_results(@session)['pets']).to include('dog')
11
26
  expect(extract_results(@session)['pets']).not_to include('hamster')
12
27
  end
13
28
 
14
- it "should uncheck a checkbox by label" do
15
- @session.uncheck("Hamster")
29
+ it 'should be able to uncheck itself if no locator specified' do
30
+ cb = @session.find(:id, 'form_pets_hamster')
31
+ cb.uncheck
16
32
  @session.click_button('awesome')
17
33
  expect(extract_results(@session)['pets']).to include('dog')
18
34
  expect(extract_results(@session)['pets']).not_to include('hamster')
19
35
  end
20
36
 
21
- it "casts to string" do
22
- @session.uncheck(:"form_pets_hamster")
37
+ it 'casts to string' do
38
+ @session.uncheck(:form_pets_hamster)
23
39
  @session.click_button('awesome')
24
40
  expect(extract_results(@session)['pets']).to include('dog')
25
41
  expect(extract_results(@session)['pets']).not_to include('hamster')
26
42
  end
27
43
 
28
- context "with :exact option" do
29
- it "should accept partial matches when false" do
30
- @session.uncheck('Ham', :exact => false)
44
+ context 'with :exact option' do
45
+ it 'should accept partial matches when false' do
46
+ @session.uncheck('Ham', exact: false)
31
47
  @session.click_button('awesome')
32
48
  expect(extract_results(@session)['pets']).not_to include('hamster')
33
49
  end
34
50
 
35
- it "should not accept partial matches when true" do
51
+ it 'should not accept partial matches when true' do
36
52
  expect do
37
- @session.uncheck('Ham', :exact => true)
53
+ @session.uncheck('Ham', exact: true)
38
54
  end.to raise_error(Capybara::ElementNotFound)
39
55
  end
40
56
  end
57
+
58
+ context 'when checkbox hidden' do
59
+ context 'with Capybara.automatic_label_click == true' do
60
+ around do |spec|
61
+ old_click_label, Capybara.automatic_label_click = Capybara.automatic_label_click, true
62
+ spec.run
63
+ Capybara.automatic_label_click = old_click_label
64
+ end
65
+
66
+ it 'should uncheck via clicking the label with :for attribute if possible' do
67
+ expect(@session.find(:checkbox, 'form_cars_jaguar', checked: true, visible: :hidden)).to be_truthy
68
+ @session.uncheck('form_cars_jaguar')
69
+ @session.click_button('awesome')
70
+ expect(extract_results(@session)['cars']).not_to include('jaguar')
71
+ end
72
+
73
+ it 'should uncheck via clicking the wrapping label if possible' do
74
+ expect(@session.find(:checkbox, 'form_cars_koenigsegg', checked: true, visible: :hidden)).to be_truthy
75
+ @session.uncheck('form_cars_koenigsegg')
76
+ @session.click_button('awesome')
77
+ expect(extract_results(@session)['cars']).not_to include('koenigsegg')
78
+ end
79
+
80
+ it 'should not click the label if unneeded' do
81
+ expect(@session.find(:checkbox, 'form_cars_tesla', unchecked: true, visible: :hidden)).to be_truthy
82
+ @session.uncheck('form_cars_tesla')
83
+ @session.click_button('awesome')
84
+ expect(extract_results(@session)['cars']).not_to include('tesla')
85
+ end
86
+
87
+ it 'should raise original error when no label available' do
88
+ expect { @session.uncheck('form_cars_porsche') }.to raise_error(Capybara::ElementNotFound, /Unable to find visible checkbox "form_cars_porsche"/)
89
+ end
90
+
91
+ it 'should raise error if not allowed to click label' do
92
+ expect { @session.uncheck('form_cars_jaguar', allow_label_click: false) }.to raise_error(Capybara::ElementNotFound, /Unable to find visible checkbox "form_cars_jaguar"/)
93
+ end
94
+
95
+ it 'should include node filter description in error if necessary' do
96
+ expect { @session.uncheck('form_cars_maserati', allow_label_click: false) }.to raise_error(Capybara::ElementNotFound, 'Unable to find visible checkbox "form_cars_maserati" that is not disabled')
97
+ end
98
+ end
99
+ end
41
100
  end
@@ -1,113 +1,114 @@
1
1
  # frozen_string_literal: true
2
- Capybara::SpecHelper.spec "#unselect" do
2
+
3
+ Capybara::SpecHelper.spec '#unselect' do
3
4
  before do
4
5
  @session.visit('/form')
5
6
  end
6
7
 
7
- context "with multiple select" do
8
- it "should unselect an option from a select box by id" do
9
- @session.unselect('Commando', :from => 'form_underwear')
8
+ context 'with multiple select' do
9
+ it 'should unselect an option from a select box by id' do
10
+ @session.unselect('Commando', from: 'form_underwear')
10
11
  @session.click_button('awesome')
11
12
  expect(extract_results(@session)['underwear']).to include('Briefs', 'Boxerbriefs')
12
13
  expect(extract_results(@session)['underwear']).not_to include('Commando')
13
14
  end
14
15
 
15
- it "should unselect an option without a select box" do
16
+ it 'should unselect an option without a select box' do
16
17
  @session.unselect('Commando')
17
18
  @session.click_button('awesome')
18
19
  expect(extract_results(@session)['underwear']).to include('Briefs', 'Boxerbriefs')
19
20
  expect(extract_results(@session)['underwear']).not_to include('Commando')
20
21
  end
21
22
 
22
- it "should unselect an option from a select box by label" do
23
- @session.unselect('Commando', :from => 'Underwear')
23
+ it 'should unselect an option from a select box by label' do
24
+ @session.unselect('Commando', from: 'Underwear')
24
25
  @session.click_button('awesome')
25
26
  expect(extract_results(@session)['underwear']).to include('Briefs', 'Boxerbriefs')
26
27
  expect(extract_results(@session)['underwear']).not_to include('Commando')
27
28
  end
28
29
 
29
- it "should favour exact matches to option labels" do
30
- @session.unselect("Briefs", :from => 'Underwear')
30
+ it 'should favour exact matches to option labels' do
31
+ @session.unselect('Briefs', from: 'Underwear')
31
32
  @session.click_button('awesome')
32
33
  expect(extract_results(@session)['underwear']).to include('Commando', 'Boxerbriefs')
33
34
  expect(extract_results(@session)['underwear']).not_to include('Briefs')
34
35
  end
35
36
 
36
- it "should escape quotes" do
37
- @session.unselect("Frenchman's Pantalons", :from => 'Underwear')
37
+ it 'should escape quotes' do
38
+ @session.unselect("Frenchman's Pantalons", from: 'Underwear')
38
39
  @session.click_button('awesome')
39
40
  expect(extract_results(@session)['underwear']).not_to include("Frenchman's Pantalons")
40
41
  end
41
42
 
42
- it "casts to string" do
43
- @session.unselect(:"Briefs", :from => :'Underwear')
43
+ it 'casts to string' do
44
+ @session.unselect(:Briefs, from: :Underwear)
44
45
  @session.click_button('awesome')
45
46
  expect(extract_results(@session)['underwear']).to include('Commando', 'Boxerbriefs')
46
47
  expect(extract_results(@session)['underwear']).not_to include('Briefs')
47
48
  end
48
49
  end
49
50
 
50
- context "with single select" do
51
- it "should raise an error" do
52
- expect { @session.unselect("English", :from => 'form_locale') }.to raise_error(Capybara::UnselectNotAllowed)
51
+ context 'with single select' do
52
+ it 'should raise an error' do
53
+ expect { @session.unselect('English', from: 'form_locale') }.to raise_error(Capybara::UnselectNotAllowed)
53
54
  end
54
55
  end
55
56
 
56
57
  context "with a locator that doesn't exist" do
57
- it "should raise an error" do
58
- msg = "Unable to find select box \"does not exist\""
58
+ it 'should raise an error' do
59
+ msg = /Unable to find select box "does not exist"/
59
60
  expect do
60
- @session.unselect('foo', :from => 'does not exist')
61
+ @session.unselect('foo', from: 'does not exist')
61
62
  end.to raise_error(Capybara::ElementNotFound, msg)
62
63
  end
63
64
  end
64
65
 
65
66
  context "with an option that doesn't exist" do
66
- it "should raise an error" do
67
- msg = "Unable to find option \"Does not Exist\""
67
+ it 'should raise an error' do
68
+ msg = /^Unable to find option "Does not Exist" within/
68
69
  expect do
69
- @session.unselect('Does not Exist', :from => 'form_underwear')
70
+ @session.unselect('Does not Exist', from: 'form_underwear')
70
71
  end.to raise_error(Capybara::ElementNotFound, msg)
71
72
  end
72
73
  end
73
74
 
74
- context "with :exact option" do
75
- context "when `false`" do
76
- it "can match select box approximately" do
77
- @session.unselect("Boxerbriefs", :from => "Under", :exact => false)
78
- @session.click_button("awesome")
79
- expect(extract_results(@session)["underwear"]).not_to include("Boxerbriefs")
75
+ context 'with :exact option' do
76
+ context 'when `false`' do
77
+ it 'can match select box approximately' do
78
+ @session.unselect('Boxerbriefs', from: 'Under', exact: false)
79
+ @session.click_button('awesome')
80
+ expect(extract_results(@session)['underwear']).not_to include('Boxerbriefs')
80
81
  end
81
82
 
82
- it "can match option approximately" do
83
- @session.unselect("Boxerbr", :from => "Underwear", :exact => false)
84
- @session.click_button("awesome")
85
- expect(extract_results(@session)["underwear"]).not_to include("Boxerbriefs")
83
+ it 'can match option approximately' do
84
+ @session.unselect('Boxerbr', from: 'Underwear', exact: false)
85
+ @session.click_button('awesome')
86
+ expect(extract_results(@session)['underwear']).not_to include('Boxerbriefs')
86
87
  end
87
88
 
88
- it "can match option approximately when :from not given" do
89
- @session.unselect("Boxerbr", :exact => false)
90
- @session.click_button("awesome")
91
- expect(extract_results(@session)["underwear"]).not_to include("Boxerbriefs")
89
+ it 'can match option approximately when :from not given' do
90
+ @session.unselect('Boxerbr', exact: false)
91
+ @session.click_button('awesome')
92
+ expect(extract_results(@session)['underwear']).not_to include('Boxerbriefs')
92
93
  end
93
94
  end
94
95
 
95
- context "when `true`" do
96
- it "can match select box approximately" do
96
+ context 'when `true`' do
97
+ it 'can match select box approximately' do
97
98
  expect do
98
- @session.unselect("Boxerbriefs", :from => "Under", :exact => true)
99
+ @session.unselect('Boxerbriefs', from: 'Under', exact: true)
99
100
  end.to raise_error(Capybara::ElementNotFound)
100
101
  end
101
102
 
102
- it "can match option approximately" do
103
+ it 'can match option approximately' do
103
104
  expect do
104
- @session.unselect("Boxerbr", :from => "Underwear", :exact => true)
105
+ @session.unselect('Boxerbr', from: 'Underwear', exact: true)
105
106
  end.to raise_error(Capybara::ElementNotFound)
106
107
  end
107
108
 
108
- it "can match option approximately when :from not given" do
109
+ it 'can match option approximately when :from not given' do
109
110
  expect do
110
- @session.unselect("Boxerbr", :exact => true)
111
+ @session.unselect('Boxerbr', exact: true)
111
112
  end.to raise_error(Capybara::ElementNotFound)
112
113
  end
113
114
  end