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,43 +1,42 @@
1
1
  # frozen_string_literal: true
2
- require "capybara/spec/test_app"
2
+
3
+ require 'capybara/spec/test_app'
3
4
 
4
5
  Capybara::SpecHelper.spec '#current_url, #current_path, #current_host' do
5
- before :all do
6
- @servers = 2.times.map { Capybara::Server.new(TestApp.new).boot }
6
+ before :all do # rubocop:disable RSpec/BeforeAfterAll
7
+ @servers = Array.new(2) { Capybara::Server.new(TestApp.new).boot }
7
8
  # sanity check
8
- expect(@servers[0].port).not_to eq(@servers[1].port)
9
- expect(@servers.map { |s| s.port }).not_to include 80
9
+ expect(@servers[0].port).not_to eq(@servers[1].port) # rubocop:disable RSpec/ExpectInHook
10
+ expect(@servers.map(&:port)).not_to include 80 # rubocop:disable RSpec/ExpectInHook
10
11
  end
11
12
 
12
13
  def bases
13
14
  @servers.map { |s| "http://#{s.host}:#{s.port}" }
14
15
  end
15
16
 
16
- def should_be_on server_index, path="/host", scheme="http"
17
- #This delay is to give fully async drivers (selenium w/chromedriver) time for the browser
18
- #to get to its destination - should be removed when we have a waiting current_url matcher
19
- sleep 0.1 # remove and adjust tests when a waiting current_url/path matcher is implemented
17
+ def should_be_on(server_index, path = '/host', scheme = 'http')
20
18
  # Check that we are on /host on the given server
21
19
  s = @servers[server_index]
20
+
21
+ expect(@session).to have_current_path("#{scheme}://#{s.host}:#{s.port}#{path}", url: true)
22
+
22
23
  expect(@session.current_url.chomp('?')).to eq("#{scheme}://#{s.host}:#{s.port}#{path}")
23
24
  expect(@session.current_host).to eq("#{scheme}://#{s.host}") # no port
24
- expect(@session.current_path).to eq(path)
25
- if path == '/host'
26
- # Server should agree with us
27
- expect(@session).to have_content("Current host is #{scheme}://#{s.host}:#{s.port}")
28
- end
25
+ expect(@session.current_path).to eq(path.split('#')[0])
26
+ # Server should agree with us
27
+ expect(@session).to have_content("Current host is #{scheme}://#{s.host}:#{s.port}") if path == '/host'
29
28
  end
30
29
 
31
30
  def visit_host_links
32
31
  @session.visit("#{bases[0]}/host_links?absolute_host=#{bases[1]}")
33
32
  end
34
33
 
35
- it "is affected by visiting a page directly" do
34
+ it 'is affected by visiting a page directly' do
36
35
  @session.visit("#{bases[0]}/host")
37
36
  should_be_on 0
38
37
  end
39
38
 
40
- it "returns to the app host when visiting a relative url" do
39
+ it 'returns to the app host when visiting a relative url' do
41
40
  Capybara.app_host = bases[1]
42
41
  @session.visit("#{bases[0]}/host")
43
42
  should_be_on 0
@@ -46,62 +45,81 @@ Capybara::SpecHelper.spec '#current_url, #current_path, #current_host' do
46
45
  Capybara.app_host = nil
47
46
  end
48
47
 
49
- it "is affected by setting Capybara.app_host" do
48
+ it 'is affected by setting Capybara.app_host' do
50
49
  Capybara.app_host = bases[0]
51
- @session.visit("/host")
50
+ @session.visit('/host')
52
51
  should_be_on 0
53
52
  Capybara.app_host = bases[1]
54
- @session.visit("/host")
53
+ @session.visit('/host')
55
54
  should_be_on 1
56
55
  Capybara.app_host = nil
57
56
  end
58
57
 
59
- it "is unaffected by following a relative link" do
58
+ it 'is unaffected by following a relative link' do
60
59
  visit_host_links
61
- @session.click_link("Relative Host")
60
+ @session.click_link('Relative Host')
62
61
  should_be_on 0
63
62
  end
64
63
 
65
- it "is affected by following an absolute link" do
64
+ it 'is affected by following an absolute link' do
66
65
  visit_host_links
67
- @session.click_link("Absolute Host")
66
+ @session.click_link('Absolute Host')
68
67
  should_be_on 1
69
68
  end
70
69
 
71
- it "is unaffected by posting through a relative form" do
70
+ it 'is unaffected by posting through a relative form' do
72
71
  visit_host_links
73
- @session.click_button("Relative Host")
72
+ @session.click_button('Relative Host')
74
73
  should_be_on 0
75
74
  end
76
75
 
77
- it "is affected by posting through an absolute form" do
76
+ it 'is affected by posting through an absolute form' do
78
77
  visit_host_links
79
- @session.click_button("Absolute Host")
78
+ @session.click_button('Absolute Host')
80
79
  should_be_on 1
81
80
  end
82
81
 
83
- it "is affected by following a redirect" do
82
+ it 'is affected by following a redirect' do
84
83
  @session.visit("#{bases[0]}/redirect")
85
- should_be_on 0, "/landed"
84
+ should_be_on 0, '/landed'
86
85
  end
87
86
 
88
- it "is affected by pushState", requires: [:js] do
89
- @session.visit("/with_js")
87
+ it 'maintains fragment' do
88
+ @session.visit("#{bases[0]}/redirect#fragment")
89
+ should_be_on 0, '/landed#fragment'
90
+ end
91
+
92
+ it 'redirects to a fragment' do
93
+ @session.visit("#{bases[0]}/redirect_with_fragment")
94
+ should_be_on 0, '/landed#with_fragment'
95
+ end
96
+
97
+ it 'is affected by pushState', requires: [:js] do
98
+ @session.visit('/with_js')
90
99
  @session.execute_script("window.history.pushState({}, '', '/pushed')")
91
- expect(@session.current_path).to eq("/pushed")
100
+ expect(@session.current_path).to eq('/pushed')
92
101
  end
93
102
 
94
- it "is affected by replaceState", requires: [:js] do
95
- @session.visit("/with_js")
103
+ it 'is affected by replaceState', requires: [:js] do
104
+ @session.visit('/with_js')
96
105
  @session.execute_script("window.history.replaceState({}, '', '/replaced')")
97
- expect(@session.current_path).to eq("/replaced")
106
+ expect(@session.current_path).to eq('/replaced')
98
107
  end
99
108
 
100
- it "doesn't raise exception on a nil current_url" do
101
- skip "Only makes sense when there is a real driver" unless @session.respond_to?(:driver)
102
- allow(@session.driver).to receive(:current_url) { nil }
103
- @session.visit("/")
109
+ it "doesn't raise exception on a nil current_url", requires: [:driver] do
110
+ allow(@session.driver).to receive(:current_url).and_return(nil)
111
+ @session.visit('/')
104
112
  expect { @session.current_url }.not_to raise_exception
105
113
  expect { @session.current_path }.not_to raise_exception
106
114
  end
115
+
116
+ context 'within iframe', requires: [:frames] do
117
+ it 'should get the url of the top level browsing context' do
118
+ @session.visit('/within_frames')
119
+ expect(@session.current_url).to match(/within_frames\z/)
120
+ @session.within_frame('frameOne') do
121
+ expect(@session.current_url).to match(/within_frames\z/)
122
+ end
123
+ end
124
+ end
107
125
  end
@@ -1,17 +1,18 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#dismiss_confirm', requires: [:modals] do
3
4
  before do
4
5
  @session.visit('/with_js')
5
6
  end
6
7
 
7
- it "should dismiss the confirm" do
8
+ it 'should dismiss the confirm' do
8
9
  @session.dismiss_confirm do
9
10
  @session.click_link('Open confirm')
10
11
  end
11
12
  expect(@session).to have_xpath("//a[@id='open-confirm' and @confirmed='false']")
12
13
  end
13
14
 
14
- it "should dismiss the confirm if the message matches" do
15
+ it 'should dismiss the confirm if the message matches' do
15
16
  @session.dismiss_confirm 'Confirm opened' do
16
17
  @session.click_link('Open confirm')
17
18
  end
@@ -26,8 +27,7 @@ Capybara::SpecHelper.spec '#dismiss_confirm', requires: [:modals] do
26
27
  end.to raise_error(Capybara::ModalNotFound)
27
28
  end
28
29
 
29
-
30
- it "should return the message presented" do
30
+ it 'should return the message presented' do
31
31
  message = @session.dismiss_confirm do
32
32
  @session.click_link('Open confirm')
33
33
  end
@@ -1,17 +1,18 @@
1
1
  # frozen_string_literal: true
2
+
2
3
  Capybara::SpecHelper.spec '#dismiss_prompt', requires: [:modals] do
3
4
  before do
4
5
  @session.visit('/with_js')
5
6
  end
6
7
 
7
- it "should dismiss the prompt" do
8
+ it 'should dismiss the prompt' do
8
9
  @session.dismiss_prompt do
9
10
  @session.click_link('Open prompt')
10
11
  end
11
12
  expect(@session).to have_xpath("//a[@id='open-prompt' and @response='dismissed']")
12
13
  end
13
14
 
14
- it "should return the message presented" do
15
+ it 'should return the message presented' do
15
16
  message = @session.dismiss_prompt do
16
17
  @session.click_link('Open prompt')
17
18
  end
@@ -1,22 +1,24 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Capybara::SpecHelper.spec '#assert_matches_selector' do
2
4
  before do
3
5
  @session.visit('/with_html')
4
6
  @element = @session.find(:css, 'span', text: '42')
5
7
  end
6
8
 
7
- it "should be true if the given selector matches the element" do
9
+ it 'should be true if the given selector matches the element' do
8
10
  expect(@element.assert_matches_selector(:css, '.number')).to be true
9
11
  end
10
12
 
11
- it "should be false if the given selector does not match the element" do
13
+ it 'should be false if the given selector does not match the element' do
12
14
  expect { @element.assert_matches_selector(:css, '.not_number') }.to raise_error(Capybara::ElementNotFound)
13
15
  end
14
16
 
15
- it "should not be callable on the session" do
17
+ it 'should not be callable on the session' do
16
18
  expect { @session.assert_matches_selector(:css, '.number') }.to raise_error(NoMethodError)
17
19
  end
18
20
 
19
- it "should wait for match to occur", requires: [:js] do
21
+ it 'should wait for match to occur', requires: [:js] do
20
22
  @session.visit('/with_js')
21
23
  input = @session.find(:css, '#disable-on-click')
22
24
 
@@ -25,12 +27,12 @@ Capybara::SpecHelper.spec '#assert_matches_selector' do
25
27
  expect(input.assert_matches_selector(:css, 'input:disabled')).to be true
26
28
  end
27
29
 
28
- it "should not accept count options" do
29
- expect { @element.assert_matches_selector(:css, '.number', count: 1) }.to raise_error(ArgumentError)
30
+ it 'should not accept count options' do
31
+ expect { @element.assert_matches_selector(:css, '.number', count: 1) }.to raise_error(ArgumentError, /count/)
30
32
  end
31
33
 
32
- it "should accept a filter block" do
33
- @element.assert_matches_selector(:css, 'span') { |el| el[:class] == "number" }
34
- @element.assert_not_matches_selector(:css,'span') { |el| el[:class] == "not_number" }
34
+ it 'should accept a filter block' do
35
+ @element.assert_matches_selector(:css, 'span') { |el| el[:class] == 'number' }
36
+ @element.assert_not_matches_selector(:css, 'span') { |el| el[:class] == 'not_number' }
35
37
  end
36
38
  end
@@ -1,23 +1,31 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Capybara::SpecHelper.spec '#match_css?' do
2
4
  before do
3
5
  @session.visit('/with_html')
4
6
  @element = @session.find(:css, 'span', text: '42')
5
7
  end
6
8
 
7
- it "should be true if the given selector matches the element" do
8
- expect(@element).to match_css("span")
9
- expect(@element).to match_css("span.number")
9
+ it 'should be true if the given selector matches the element' do
10
+ expect(@element).to match_css('span')
11
+ expect(@element).to match_css('span.number')
10
12
  end
11
13
 
12
- it "should be false if the given selector does not match" do
13
- expect(@element).not_to match_css("div")
14
- expect(@element).not_to match_css("p a#doesnotexist")
15
- expect(@element).not_to match_css("p.nosuchclass")
14
+ it 'should be false if the given selector does not match' do
15
+ expect(@element).not_to match_css('div')
16
+ expect(@element).not_to match_css('p a#doesnotexist')
17
+ expect(@element).not_to match_css('p.nosuchclass')
16
18
  end
17
19
 
18
- it "should accept an optional filter block" do
20
+ it 'should accept an optional filter block' do
19
21
  # This would be better done with
20
- expect(@element).to match_css('span') { |el| el[:class] == "number" }
21
- expect(@element).not_to match_css('span') { |el| el[:class] == "not_number" }
22
+ expect(@element).to match_css('span') { |el| el[:class] == 'number' }
23
+ expect(@element).not_to match_css('span') { |el| el[:class] == 'not_number' }
24
+ end
25
+
26
+ it 'should work with root element found via ancestor' do
27
+ el = @session.find(:css, 'body').find(:xpath, '..')
28
+ expect(el).to match_css('html')
29
+ expect { expect(el).to not_match_css('html') }.to raise_exception(RSpec::Expectations::ExpectationNotMetError)
22
30
  end
23
31
  end
@@ -1,23 +1,25 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Capybara::SpecHelper.spec '#match_xpath?' do
2
4
  before do
3
5
  @session.visit('/with_html')
4
6
  @element = @session.find(:css, 'span.number')
5
7
  end
6
8
 
7
- it "should be true if the given selector is on the page" do
8
- expect(@element).to match_xpath("//span")
9
+ it 'should be true if the given selector is on the page' do
10
+ expect(@element).to match_xpath('//span')
9
11
  expect(@element).to match_xpath("//span[@class='number']")
10
12
  end
11
13
 
12
- it "should be false if the given selector is not on the page" do
13
- expect(@element).not_to match_xpath("//abbr")
14
- expect(@element).not_to match_xpath("//div")
14
+ it 'should be false if the given selector is not on the page' do
15
+ expect(@element).not_to match_xpath('//abbr')
16
+ expect(@element).not_to match_xpath('//div')
15
17
  expect(@element).not_to match_xpath("//span[@class='not_a_number']")
16
18
  end
17
19
 
18
- it "should use xpath even if default selector is CSS" do
20
+ it 'should use xpath even if default selector is CSS' do
19
21
  Capybara.default_selector = :css
20
22
  expect(@element).not_to have_xpath("//span[@class='not_a_number']")
21
23
  expect(@element).not_to have_xpath("//div[@class='number']")
22
24
  end
23
- end
25
+ end
@@ -1,46 +1,60 @@
1
+ # frozen_string_literal: true
2
+
1
3
  Capybara::SpecHelper.spec '#match_selector?' do
4
+ let(:element) { @session.find(:xpath, '//span', text: '42') }
5
+
2
6
  before do
3
7
  @session.visit('/with_html')
4
- @element = @session.find('//span', text: '42')
5
8
  end
6
9
 
7
- it "should be true if the element matches the given selector" do
8
- expect(@element).to match_selector(:xpath, "//span")
9
- expect(@element).to match_selector(:css, 'span.number')
10
- expect(@element.matches_selector?(:css, 'span.number')).to be true
10
+ it 'should be true if the element matches the given selector' do
11
+ expect(element).to match_selector(:xpath, '//span')
12
+ expect(element).to match_selector(:css, 'span.number')
13
+ expect(element.matches_selector?(:css, 'span.number')).to be true
11
14
  end
12
15
 
13
- it "should be false if the element does not match the given selector" do
14
- expect(@element).not_to match_selector(:xpath, "//div")
15
- expect(@element).not_to match_selector(:css, "span.not_a_number")
16
- expect(@element.matches_selector?(:css, "span.not_a_number")).to be false
16
+ it 'should be false if the element does not match the given selector' do
17
+ expect(element).not_to match_selector(:xpath, '//div')
18
+ expect(element).not_to match_selector(:css, 'span.not_a_number')
19
+ expect(element.matches_selector?(:css, 'span.not_a_number')).to be false
17
20
  end
18
21
 
19
- it "should use default selector" do
22
+ it 'should use default selector' do
20
23
  Capybara.default_selector = :css
21
- expect(@element).not_to match_selector("span.not_a_number")
22
- expect(@element).to match_selector("span.number")
24
+ expect(element).not_to match_selector('span.not_a_number')
25
+ expect(element).to match_selector('span.number')
26
+ end
27
+
28
+ it 'should work with elements located via a sibling selector' do
29
+ sibling = element.sibling(:css, 'span', text: 'Other span')
30
+ expect(sibling).to match_selector(:xpath, '//span')
31
+ expect(sibling).to match_selector(:css, 'span')
23
32
  end
24
33
 
25
- context "with text" do
26
- it "should discard all matches where the given string is not contained" do
27
- expect(@element).to match_selector("//span", text: "42")
28
- expect(@element).not_to match_selector("//span", text: "Doesnotexist")
34
+ it 'should work with the html element' do
35
+ html = @session.find('/html')
36
+ expect(html).to match_selector(:css, 'html')
37
+ end
38
+
39
+ context 'with text' do
40
+ it 'should discard all matches where the given string is not contained' do
41
+ expect(element).to match_selector('//span', text: '42')
42
+ expect(element).not_to match_selector('//span', text: 'Doesnotexist')
29
43
  end
30
44
  end
31
45
 
32
- it "should have css sugar" do
33
- expect(@element.matches_css?('span.number')).to be true
34
- expect(@element.matches_css?('span.not_a_number')).to be false
35
- expect(@element.matches_css?('span.number', text: "42")).to be true
36
- expect(@element.matches_css?('span.number', text: "Nope")).to be false
46
+ it 'should have css sugar' do
47
+ expect(element.matches_css?('span.number')).to be true
48
+ expect(element.matches_css?('span.not_a_number')).to be false
49
+ expect(element.matches_css?('span.number', text: '42')).to be true
50
+ expect(element.matches_css?('span.number', text: 'Nope')).to be false
37
51
  end
38
52
 
39
- it "should have xpath sugar" do
40
- expect(@element.matches_xpath?("//span")).to be true
41
- expect(@element.matches_xpath?("//div")).to be false
42
- expect(@element.matches_xpath?("//span", text: '42')).to be true
43
- expect(@element.matches_xpath?("//span", text: 'Nope')).to be false
53
+ it 'should have xpath sugar' do
54
+ expect(element.matches_xpath?('//span')).to be true
55
+ expect(element.matches_xpath?('//div')).to be false
56
+ expect(element.matches_xpath?('//span', text: '42')).to be true
57
+ expect(element.matches_xpath?('//span', text: 'Nope')).to be false
44
58
  end
45
59
 
46
60
  it 'should accept selector filters' do
@@ -52,55 +66,55 @@ Capybara::SpecHelper.spec '#match_selector?' do
52
66
  it 'should accept a custom filter block' do
53
67
  @session.visit('/form')
54
68
  cbox = @session.find(:css, '#form_pets_dog')
55
- expect(cbox).to match_selector(:checkbox){ |node| node[:id] == "form_pets_dog"}
56
- expect(cbox).not_to match_selector(:checkbox){ |node| node[:id] != "form_pets_dog"}
57
- expect(cbox.matches_selector?(:checkbox){ |node| node[:id] == "form_pets_dog"}).to be true
58
- expect(cbox.matches_selector?(:checkbox){ |node| node[:id] != "form_pets_dog"}).to be false
69
+ expect(cbox).to match_selector(:checkbox) { |node| node[:id] == 'form_pets_dog' }
70
+ expect(cbox).not_to match_selector(:checkbox) { |node| node[:id] != 'form_pets_dog' }
71
+ expect(cbox.matches_selector?(:checkbox) { |node| node[:id] == 'form_pets_dog' }).to be true
72
+ expect(cbox.matches_selector?(:checkbox) { |node| node[:id] != 'form_pets_dog' }).to be false
59
73
  end
60
74
  end
61
75
 
62
76
  Capybara::SpecHelper.spec '#not_matches_selector?' do
77
+ let(:element) { @session.find(:css, 'span', text: 42) }
63
78
  before do
64
79
  @session.visit('/with_html')
65
- @element = @session.find(:css, "span", text: 42)
66
80
  end
67
81
 
68
- it "should be false if the given selector matches the element" do
69
- expect(@element).not_to not_match_selector(:xpath, "//span")
70
- expect(@element).not_to not_match_selector(:css, "span.number")
71
- expect(@element.not_matches_selector?(:css, "span.number")).to be false
82
+ it 'should be false if the given selector matches the element' do
83
+ expect(element).not_to not_match_selector(:xpath, '//span')
84
+ expect(element).not_to not_match_selector(:css, 'span.number')
85
+ expect(element.not_matches_selector?(:css, 'span.number')).to be false
72
86
  end
73
87
 
74
- it "should be true if the given selector does not match the element" do
75
- expect(@element).to not_match_selector(:xpath, "//abbr")
76
- expect(@element).to not_match_selector(:css, "p a#doesnotexist")
77
- expect(@element.not_matches_selector?(:css, "p a#doesnotexist")).to be true
88
+ it 'should be true if the given selector does not match the element' do
89
+ expect(element).to not_match_selector(:xpath, '//abbr')
90
+ expect(element).to not_match_selector(:css, 'p a#doesnotexist')
91
+ expect(element.not_matches_selector?(:css, 'p a#doesnotexist')).to be true
78
92
  end
79
93
 
80
- it "should use default selector" do
94
+ it 'should use default selector' do
81
95
  Capybara.default_selector = :css
82
- expect(@element).to not_match_selector("p a#doesnotexist")
83
- expect(@element).not_to not_match_selector("span.number")
96
+ expect(element).to not_match_selector('p a#doesnotexist')
97
+ expect(element).not_to not_match_selector('span.number')
84
98
  end
85
99
 
86
- context "with text" do
87
- it "should discard all matches where the given string is contained" do
88
- expect(@element).not_to not_match_selector(:css, "span.number", text: "42")
89
- expect(@element).to not_match_selector(:css, "span.number", text: "Doesnotexist")
100
+ context 'with text' do
101
+ it 'should discard all matches where the given string is contained' do
102
+ expect(element).not_to not_match_selector(:css, 'span.number', text: '42')
103
+ expect(element).to not_match_selector(:css, 'span.number', text: 'Doesnotexist')
90
104
  end
91
105
  end
92
106
 
93
- it "should have CSS sugar" do
94
- expect(@element.not_matches_css?("span.number")).to be false
95
- expect(@element.not_matches_css?("p a#doesnotexist")).to be true
96
- expect(@element.not_matches_css?("span.number", text: "42")).to be false
97
- expect(@element.not_matches_css?("span.number", text: "Doesnotexist")).to be true
107
+ it 'should have CSS sugar' do
108
+ expect(element.not_matches_css?('span.number')).to be false
109
+ expect(element.not_matches_css?('p a#doesnotexist')).to be true
110
+ expect(element.not_matches_css?('span.number', text: '42')).to be false
111
+ expect(element.not_matches_css?('span.number', text: 'Doesnotexist')).to be true
98
112
  end
99
113
 
100
- it "should have xpath sugar" do
101
- expect(@element.not_matches_xpath?("//span")).to be false
102
- expect(@element.not_matches_xpath?("//div")).to be true
103
- expect(@element.not_matches_xpath?("//span", text: "42")).to be false
104
- expect(@element.not_matches_xpath?("//span", text: "Doesnotexist")).to be true
114
+ it 'should have xpath sugar' do
115
+ expect(element.not_matches_xpath?('//span')).to be false
116
+ expect(element.not_matches_xpath?('//div')).to be true
117
+ expect(element.not_matches_xpath?('//span', text: '42')).to be false
118
+ expect(element.not_matches_xpath?('//span', text: 'Doesnotexist')).to be true
105
119
  end
106
- end if Gem::Version.new(RSpec::Expectations::Version::STRING) >= Gem::Version.new('3.1')
120
+ end
@@ -1,18 +1,19 @@
1
1
  # frozen_string_literal: true
2
- Capybara::SpecHelper.spec "#evaluate_async_script", requires: [:js] do
3
- it "should evaluate the given script and return whatever it produces" do
2
+
3
+ Capybara::SpecHelper.spec '#evaluate_async_script', requires: [:js] do
4
+ it 'should evaluate the given script and return whatever it produces' do
4
5
  @session.visit('/with_js')
5
- expect(@session.evaluate_async_script("arguments[0](4)")).to eq(4)
6
+ expect(@session.evaluate_async_script('arguments[0](4)')).to eq(4)
6
7
  end
7
8
 
8
- it "should support passing elements as arguments to the script", requires: [:js, :es_args] do
9
+ it 'should support passing elements as arguments to the script', requires: %i[js es_args] do
9
10
  @session.visit('/with_js')
10
11
  el = @session.find(:css, '#drag p')
11
- result = @session.evaluate_async_script("arguments[2]([arguments[0].innerText, arguments[1]])", el, "Doodle Funk")
12
- expect(result).to eq ["This is a draggable element.", "Doodle Funk"]
12
+ result = @session.evaluate_async_script('arguments[2]([arguments[0].innerText, arguments[1]])', el, 'Doodle Funk')
13
+ expect(result).to eq ['This is a draggable element.', 'Doodle Funk']
13
14
  end
14
15
 
15
- it "should support returning elements after asynchronous operation", requires: [:js, :es_args] do
16
+ it 'should support returning elements after asynchronous operation', requires: %i[js es_args] do
16
17
  @session.visit('/with_js')
17
18
  @session.find(:css, '#change') # ensure page has loaded and element is available
18
19
  el = @session.evaluate_async_script("var cb = arguments[0]; setTimeout(function(){ cb(document.getElementById('change')) }, 100)")
@@ -1,28 +1,49 @@
1
1
  # frozen_string_literal: true
2
- Capybara::SpecHelper.spec "#evaluate_script", requires: [:js] do
3
- it "should evaluate the given script and return whatever it produces" do
2
+
3
+ Capybara::SpecHelper.spec '#evaluate_script', requires: [:js] do
4
+ it 'should evaluate the given script and return whatever it produces' do
5
+ @session.visit('/with_js')
6
+ expect(@session.evaluate_script('1+3')).to eq(4)
7
+ end
8
+
9
+ it 'should ignore leading whitespace' do
4
10
  @session.visit('/with_js')
5
- expect(@session.evaluate_script("1+3")).to eq(4)
11
+ expect(@session.evaluate_script('
12
+ 1 + 3
13
+ ')).to eq(4)
6
14
  end
7
15
 
8
- it "should pass arguments to the script", requires: [:js, :es_args] do
16
+ it 'should pass arguments to the script', requires: %i[js es_args] do
9
17
  @session.visit('/with_js')
10
- @session.evaluate_script("document.getElementById('change').textContent = arguments[0]", "Doodle Funk")
18
+ expect(@session).to have_css('#change')
19
+ @session.evaluate_script("document.getElementById('change').textContent = arguments[0]", 'Doodle Funk')
11
20
  expect(@session).to have_css('#change', text: 'Doodle Funk')
12
21
  end
13
22
 
14
- it "should support passing elements as arguments to the script", requires: [:js, :es_args] do
23
+ it 'should support passing elements as arguments to the script', requires: %i[js es_args] do
15
24
  @session.visit('/with_js')
16
25
  el = @session.find(:css, '#change')
17
- @session.evaluate_script("arguments[0].textContent = arguments[1]", el, "Doodle Funk")
26
+ @session.evaluate_script('arguments[0].textContent = arguments[1]', el, 'Doodle Funk')
18
27
  expect(@session).to have_css('#change', text: 'Doodle Funk')
19
28
  end
20
29
 
21
- it "should support returning elements", requires: [:js, :es_args] do
30
+ it 'should support returning elements', requires: %i[js es_args] do
22
31
  @session.visit('/with_js')
23
32
  @session.find(:css, '#change') # ensure page has loaded and element is available
24
33
  el = @session.evaluate_script("document.getElementById('change')")
25
34
  expect(el).to be_instance_of(Capybara::Node::Element)
26
35
  expect(el).to eq(@session.find(:css, '#change'))
27
36
  end
37
+
38
+ it 'should support multi statement via IIFE' do
39
+ @session.visit('/with_js')
40
+ @session.find(:css, '#change')
41
+ el = @session.evaluate_script(<<~JS)
42
+ (function(){
43
+ var el = document.getElementById('change');
44
+ return el;
45
+ })()
46
+ JS
47
+ expect(el).to eq(@session.find(:css, '#change'))
48
+ end
28
49
  end