capybara 3.0.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 (312) hide show
  1. checksums.yaml +4 -4
  2. data/.yardopts +1 -1
  3. data/History.md +891 -12
  4. data/License.txt +1 -1
  5. data/README.md +257 -84
  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 +38 -9
  10. data/lib/capybara/dsl.rb +9 -7
  11. data/lib/capybara/helpers.rb +57 -8
  12. data/lib/capybara/minitest/spec.rb +185 -84
  13. data/lib/capybara/minitest.rb +264 -145
  14. data/lib/capybara/node/actions.rb +248 -124
  15. data/lib/capybara/node/base.rb +35 -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 +350 -113
  19. data/lib/capybara/node/finders.rb +104 -82
  20. data/lib/capybara/node/matchers.rb +363 -157
  21. data/lib/capybara/node/simple.rb +54 -15
  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 +9 -10
  25. data/lib/capybara/queries/base_query.rb +25 -18
  26. data/lib/capybara/queries/current_path_query.rb +16 -6
  27. data/lib/capybara/queries/match_query.rb +11 -0
  28. data/lib/capybara/queries/selector_query.rb +617 -104
  29. data/lib/capybara/queries/sibling_query.rb +9 -7
  30. data/lib/capybara/queries/style_query.rb +45 -0
  31. data/lib/capybara/queries/text_query.rb +40 -22
  32. data/lib/capybara/queries/title_query.rb +2 -2
  33. data/lib/capybara/rack_test/browser.rb +106 -31
  34. data/lib/capybara/rack_test/driver.rb +16 -7
  35. data/lib/capybara/rack_test/errors.rb +6 -0
  36. data/lib/capybara/rack_test/form.rb +74 -49
  37. data/lib/capybara/rack_test/node.rb +120 -47
  38. data/lib/capybara/rails.rb +1 -1
  39. data/lib/capybara/registration_container.rb +41 -0
  40. data/lib/capybara/registrations/drivers.rb +42 -0
  41. data/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  42. data/lib/capybara/registrations/servers.rb +66 -0
  43. data/lib/capybara/result.rb +87 -53
  44. data/lib/capybara/rspec/features.rb +8 -10
  45. data/lib/capybara/rspec/matcher_proxies.rb +39 -18
  46. data/lib/capybara/rspec/matchers/base.rb +113 -0
  47. data/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  48. data/lib/capybara/rspec/matchers/compound.rb +88 -0
  49. data/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  50. data/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  51. data/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  52. data/lib/capybara/rspec/matchers/have_selector.rb +69 -0
  53. data/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  54. data/lib/capybara/rspec/matchers/have_text.rb +33 -0
  55. data/lib/capybara/rspec/matchers/have_title.rb +29 -0
  56. data/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  57. data/lib/capybara/rspec/matchers/match_style.rb +43 -0
  58. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  59. data/lib/capybara/rspec/matchers.rb +142 -315
  60. data/lib/capybara/rspec.rb +3 -2
  61. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  62. data/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  63. data/lib/capybara/selector/css.rb +85 -8
  64. data/lib/capybara/selector/definition/button.rb +68 -0
  65. data/lib/capybara/selector/definition/checkbox.rb +26 -0
  66. data/lib/capybara/selector/definition/css.rb +10 -0
  67. data/lib/capybara/selector/definition/datalist_input.rb +35 -0
  68. data/lib/capybara/selector/definition/datalist_option.rb +25 -0
  69. data/lib/capybara/selector/definition/element.rb +28 -0
  70. data/lib/capybara/selector/definition/field.rb +40 -0
  71. data/lib/capybara/selector/definition/fieldset.rb +14 -0
  72. data/lib/capybara/selector/definition/file_field.rb +13 -0
  73. data/lib/capybara/selector/definition/fillable_field.rb +33 -0
  74. data/lib/capybara/selector/definition/frame.rb +17 -0
  75. data/lib/capybara/selector/definition/id.rb +6 -0
  76. data/lib/capybara/selector/definition/label.rb +62 -0
  77. data/lib/capybara/selector/definition/link.rb +55 -0
  78. data/lib/capybara/selector/definition/link_or_button.rb +16 -0
  79. data/lib/capybara/selector/definition/option.rb +27 -0
  80. data/lib/capybara/selector/definition/radio_button.rb +27 -0
  81. data/lib/capybara/selector/definition/select.rb +81 -0
  82. data/lib/capybara/selector/definition/table.rb +109 -0
  83. data/lib/capybara/selector/definition/table_row.rb +21 -0
  84. data/lib/capybara/selector/definition/xpath.rb +5 -0
  85. data/lib/capybara/selector/definition.rb +280 -0
  86. data/lib/capybara/selector/filter.rb +1 -0
  87. data/lib/capybara/selector/filter_set.rb +72 -28
  88. data/lib/capybara/selector/filters/base.rb +45 -2
  89. data/lib/capybara/selector/filters/expression_filter.rb +5 -6
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +18 -4
  92. data/lib/capybara/selector/regexp_disassembler.rb +211 -0
  93. data/lib/capybara/selector/selector.rb +89 -200
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/lib/capybara/selector.rb +474 -534
  96. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  97. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  98. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  99. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  100. data/lib/capybara/selenium/driver.rb +270 -245
  101. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  102. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
  103. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
  104. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  105. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  106. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  107. data/lib/capybara/selenium/extensions/find.rb +110 -0
  108. data/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
  109. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  110. data/lib/capybara/selenium/extensions/scroll.rb +76 -0
  111. data/lib/capybara/selenium/node.rb +460 -170
  112. data/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
  113. data/lib/capybara/selenium/nodes/edge_node.rb +110 -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/atoms.rb +18 -0
  118. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  119. data/lib/capybara/selenium/patches/logs.rb +45 -0
  120. data/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
  121. data/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  122. data/lib/capybara/server/animation_disabler.rb +80 -0
  123. data/lib/capybara/server/checker.rb +44 -0
  124. data/lib/capybara/server/middleware.rb +71 -0
  125. data/lib/capybara/server.rb +58 -67
  126. data/lib/capybara/session/config.rb +40 -6
  127. data/lib/capybara/session/matchers.rb +26 -19
  128. data/lib/capybara/session.rb +252 -194
  129. data/lib/capybara/spec/public/jquery.js +5 -5
  130. data/lib/capybara/spec/public/offset.js +6 -0
  131. data/lib/capybara/spec/public/test.js +126 -8
  132. data/lib/capybara/spec/session/accept_alert_spec.rb +11 -11
  133. data/lib/capybara/spec/session/accept_confirm_spec.rb +3 -3
  134. data/lib/capybara/spec/session/accept_prompt_spec.rb +9 -10
  135. data/lib/capybara/spec/session/active_element_spec.rb +31 -0
  136. data/lib/capybara/spec/session/all_spec.rb +135 -44
  137. data/lib/capybara/spec/session/ancestor_spec.rb +24 -19
  138. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +67 -38
  139. data/lib/capybara/spec/session/{assert_current_path.rb → assert_current_path_spec.rb} +20 -18
  140. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  141. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  142. data/lib/capybara/spec/session/{assert_text.rb → assert_text_spec.rb} +76 -52
  143. data/lib/capybara/spec/session/{assert_title.rb → assert_title_spec.rb} +12 -12
  144. data/lib/capybara/spec/session/attach_file_spec.rb +126 -72
  145. data/lib/capybara/spec/session/body_spec.rb +11 -13
  146. data/lib/capybara/spec/session/check_spec.rb +112 -51
  147. data/lib/capybara/spec/session/choose_spec.rb +62 -30
  148. data/lib/capybara/spec/session/click_button_spec.rb +227 -161
  149. data/lib/capybara/spec/session/click_link_or_button_spec.rb +49 -30
  150. data/lib/capybara/spec/session/click_link_spec.rb +89 -55
  151. data/lib/capybara/spec/session/current_scope_spec.rb +8 -8
  152. data/lib/capybara/spec/session/current_url_spec.rb +44 -37
  153. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +3 -3
  154. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +2 -2
  155. data/lib/capybara/spec/session/element/{assert_match_selector.rb → assert_match_selector_spec.rb} +11 -9
  156. data/lib/capybara/spec/session/element/match_css_spec.rb +18 -10
  157. data/lib/capybara/spec/session/element/match_xpath_spec.rb +8 -6
  158. data/lib/capybara/spec/session/element/matches_selector_spec.rb +70 -56
  159. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +7 -7
  160. data/lib/capybara/spec/session/evaluate_script_spec.rb +28 -8
  161. data/lib/capybara/spec/session/execute_script_spec.rb +8 -7
  162. data/lib/capybara/spec/session/fill_in_spec.rb +110 -44
  163. data/lib/capybara/spec/session/find_button_spec.rb +23 -23
  164. data/lib/capybara/spec/session/find_by_id_spec.rb +8 -8
  165. data/lib/capybara/spec/session/find_field_spec.rb +33 -31
  166. data/lib/capybara/spec/session/find_link_spec.rb +42 -14
  167. data/lib/capybara/spec/session/find_spec.rb +251 -142
  168. data/lib/capybara/spec/session/first_spec.rb +45 -44
  169. data/lib/capybara/spec/session/frame/frame_title_spec.rb +6 -6
  170. data/lib/capybara/spec/session/frame/frame_url_spec.rb +6 -6
  171. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +32 -20
  172. data/lib/capybara/spec/session/frame/within_frame_spec.rb +46 -19
  173. data/lib/capybara/spec/session/go_back_spec.rb +1 -1
  174. data/lib/capybara/spec/session/go_forward_spec.rb +1 -1
  175. data/lib/capybara/spec/session/has_all_selectors_spec.rb +23 -23
  176. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  177. data/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
  178. data/lib/capybara/spec/session/has_button_spec.rb +98 -12
  179. data/lib/capybara/spec/session/has_css_spec.rb +271 -137
  180. data/lib/capybara/spec/session/has_current_path_spec.rb +50 -35
  181. data/lib/capybara/spec/session/has_element_spec.rb +47 -0
  182. data/lib/capybara/spec/session/has_field_spec.rb +137 -58
  183. data/lib/capybara/spec/session/has_link_spec.rb +46 -6
  184. data/lib/capybara/spec/session/has_none_selectors_spec.rb +33 -31
  185. data/lib/capybara/spec/session/has_select_spec.rb +84 -50
  186. data/lib/capybara/spec/session/has_selector_spec.rb +117 -69
  187. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  188. data/lib/capybara/spec/session/has_table_spec.rb +181 -4
  189. data/lib/capybara/spec/session/has_text_spec.rb +101 -53
  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 +37 -0
  195. data/lib/capybara/spec/session/node_spec.rb +958 -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 +65 -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 +119 -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 +41 -22
  212. data/lib/capybara/spec/session/unselect_spec.rb +37 -37
  213. data/lib/capybara/spec/session/visit_spec.rb +79 -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 +11 -8
  221. data/lib/capybara/spec/session/window/within_window_spec.rb +17 -16
  222. data/lib/capybara/spec/session/within_spec.rb +82 -44
  223. data/lib/capybara/spec/spec_helper.rb +46 -52
  224. data/lib/capybara/spec/test_app.rb +148 -41
  225. data/lib/capybara/spec/views/animated.erb +49 -0
  226. data/lib/capybara/spec/views/form.erb +156 -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 +46 -11
  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.erb +2 -2
  255. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  256. data/lib/capybara/spec/views/with_shadow.erb +31 -0
  257. data/lib/capybara/spec/views/with_slow_unload.erb +2 -1
  258. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  259. data/lib/capybara/spec/views/with_unload_alert.erb +1 -0
  260. data/lib/capybara/spec/views/with_windows.erb +1 -1
  261. data/lib/capybara/spec/views/within_frames.erb +1 -1
  262. data/lib/capybara/version.rb +1 -1
  263. data/lib/capybara/window.rb +32 -26
  264. data/lib/capybara.rb +128 -104
  265. data/spec/basic_node_spec.rb +59 -34
  266. data/spec/capybara_spec.rb +65 -51
  267. data/spec/counter_spec.rb +35 -0
  268. data/spec/css_builder_spec.rb +101 -0
  269. data/spec/css_splitter_spec.rb +38 -0
  270. data/spec/dsl_spec.rb +84 -55
  271. data/spec/filter_set_spec.rb +24 -7
  272. data/spec/fixtures/certificate.pem +25 -0
  273. data/spec/fixtures/key.pem +27 -0
  274. data/spec/fixtures/selenium_driver_rspec_failure.rb +5 -5
  275. data/spec/fixtures/selenium_driver_rspec_success.rb +5 -5
  276. data/spec/minitest_spec.rb +49 -5
  277. data/spec/minitest_spec_spec.rb +92 -62
  278. data/spec/per_session_config_spec.rb +6 -6
  279. data/spec/rack_test_spec.rb +183 -115
  280. data/spec/regexp_dissassembler_spec.rb +250 -0
  281. data/spec/result_spec.rb +99 -39
  282. data/spec/rspec/features_spec.rb +28 -25
  283. data/spec/rspec/scenarios_spec.rb +10 -6
  284. data/spec/rspec/shared_spec_matchers.rb +418 -364
  285. data/spec/rspec/views_spec.rb +4 -3
  286. data/spec/rspec_matchers_spec.rb +35 -10
  287. data/spec/rspec_spec.rb +109 -85
  288. data/spec/sauce_spec_chrome.rb +43 -0
  289. data/spec/selector_spec.rb +392 -62
  290. data/spec/selenium_spec_chrome.rb +183 -41
  291. data/spec/selenium_spec_chrome_remote.rb +96 -0
  292. data/spec/selenium_spec_edge.rb +41 -8
  293. data/spec/selenium_spec_firefox.rb +228 -0
  294. data/spec/selenium_spec_firefox_remote.rb +94 -0
  295. data/spec/selenium_spec_ie.rb +129 -11
  296. data/spec/selenium_spec_safari.rb +162 -0
  297. data/spec/server_spec.rb +192 -81
  298. data/spec/session_spec.rb +52 -16
  299. data/spec/shared_selenium_node.rb +79 -0
  300. data/spec/shared_selenium_session.rb +460 -123
  301. data/spec/spec_helper.rb +124 -2
  302. data/spec/whitespace_normalizer_spec.rb +54 -0
  303. data/spec/xpath_builder_spec.rb +93 -0
  304. metadata +344 -45
  305. data/.yard/templates_custom/default/class/html/selectors.erb +0 -38
  306. data/.yard/templates_custom/default/class/html/setup.rb +0 -17
  307. data/.yard/yard_extensions.rb +0 -78
  308. data/lib/capybara/rspec/compound.rb +0 -90
  309. data/lib/capybara/spec/session/assert_selector.rb +0 -149
  310. data/lib/capybara/spec/session/source_spec.rb +0 -0
  311. data/lib/capybara/spec/views/with_title.erb +0 -5
  312. data/spec/selenium_spec_marionette.rb +0 -143
@@ -1,94 +1,97 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # NOTE: This file uses `sleep` to sync up parts of the tests. This is only implemented like this
4
+ # because of the methods being tested. In tests using Capybara this type of behavior should be implemented
5
+ # using Capybara provided assertions with builtin waiting behavior.
6
+
3
7
  Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
4
- before(:each) do
5
- @window = @session.current_window
8
+ let!(:orig_window) { @session.current_window }
9
+ before do
6
10
  @session.visit('/with_windows')
7
11
  end
8
- after(:each) do
9
- (@session.windows - [@window]).each do |w|
12
+
13
+ after do
14
+ (@session.windows - [orig_window]).each do |w|
10
15
  @session.switch_to_window w
11
16
  w.close
12
17
  end
13
- @session.switch_to_window(@window)
18
+ @session.switch_to_window(orig_window)
14
19
  end
15
20
 
16
21
  describe '#exists?' do
17
- before(:each) do
18
- @other_window = @session.window_opened_by do
22
+ it 'should become false after window was closed' do
23
+ other_window = @session.window_opened_by do
19
24
  @session.find(:css, '#openWindow').click
20
25
  end
21
- end
22
26
 
23
- it "should become false after window was closed" do
24
27
  expect do
25
- @session.switch_to_window @other_window
26
- @other_window.close
27
- end.to change { @other_window.exists? }.from(true).to(false)
28
+ @session.switch_to_window other_window
29
+ other_window.close
30
+ end.to change(other_window, :exists?).from(true).to(false)
28
31
  end
29
32
  end
30
33
 
31
34
  describe '#closed?' do
32
- it "should become true after window was closed" do
33
- @other_window = @session.window_opened_by do
35
+ it 'should become true after window was closed' do
36
+ other_window = @session.window_opened_by do
34
37
  @session.find(:css, '#openWindow').click
35
38
  end
36
39
  expect do
37
- @session.switch_to_window @other_window
38
- @other_window.close
39
- end.to change { @other_window.closed? }.from(false).to(true)
40
+ @session.switch_to_window other_window
41
+ other_window.close
42
+ end.to change { other_window.closed? }.from(false).to(true)
40
43
  end
41
44
  end
42
45
 
43
46
  describe '#current?' do
44
- before(:each) do
45
- @other_window = @session.window_opened_by do
47
+ let(:other_window) do
48
+ @session.window_opened_by do
46
49
  @session.find(:css, '#openWindow').click
47
50
  end
48
51
  end
49
52
 
50
53
  it 'should become true after switching to window' do
51
54
  expect do
52
- @session.switch_to_window(@other_window)
53
- end.to change { @other_window.current? }.from(false).to(true)
55
+ @session.switch_to_window(other_window)
56
+ end.to change(other_window, :current?).from(false).to(true)
54
57
  end
55
58
 
56
59
  it 'should return false if window is closed' do
57
- @session.switch_to_window(@other_window)
58
- @other_window.close
59
- expect(@other_window.current?).to eq(false)
60
+ @session.switch_to_window(other_window)
61
+ other_window.close
62
+ expect(other_window.current?).to be(false)
60
63
  end
61
64
  end
62
65
 
63
66
  describe '#close' do
64
- before(:each) do
65
- @other_window = @session.window_opened_by do
67
+ let!(:other_window) do
68
+ @session.window_opened_by do
66
69
  @session.find(:css, '#openWindow').click
67
70
  end
68
71
  end
69
72
 
70
73
  it 'should switch to original window if invoked not for current window' do
71
74
  expect(@session.windows.size).to eq(2)
72
- expect(@session.current_window).to eq(@window)
73
- @other_window.close
75
+ expect(@session.current_window).to eq(orig_window)
76
+ other_window.close
74
77
  expect(@session.windows.size).to eq(1)
75
- expect(@session.current_window).to eq(@window)
78
+ expect(@session.current_window).to eq(orig_window)
76
79
  end
77
80
 
78
81
  it 'should make subsequent invocations of other methods raise no_such_window_error if invoked for current window' do
79
- @session.switch_to_window(@other_window)
80
- expect(@session.current_window).to eq(@other_window)
81
- @other_window.close
82
+ @session.switch_to_window(other_window)
83
+ expect(@session.current_window).to eq(other_window)
84
+ other_window.close
82
85
  expect do
83
86
  @session.find(:css, '#some_id')
84
87
  end.to raise_error(@session.driver.no_such_window_error)
85
- @session.switch_to_window(@window)
88
+ @session.switch_to_window(orig_window)
86
89
  end
87
90
  end
88
91
 
89
92
  describe '#size' do
90
93
  def win_size
91
- @session.evaluate_script("[window.outerWidth || window.innerWidth, window.outerHeight || window.innerHeight]")
94
+ @session.evaluate_script('[window.outerWidth || window.innerWidth, window.outerHeight || window.innerHeight]')
92
95
  end
93
96
 
94
97
  it 'should return size of whole window', requires: %i[windows js] do
@@ -96,42 +99,57 @@ Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
96
99
  end
97
100
 
98
101
  it 'should switch to original window if invoked not for current window' do
99
- @other_window = @session.window_opened_by do
102
+ other_window = @session.window_opened_by do
100
103
  @session.find(:css, '#openWindow').click
101
104
  end
102
105
  sleep 1
103
- size = @session.within_window(@other_window) do
106
+ size = @session.within_window(other_window) do
104
107
  win_size
105
108
  end
106
- expect(@other_window.size).to eq(size)
107
- expect(@session.current_window).to eq(@window)
109
+ expect(other_window.size).to eq(size)
110
+ expect(@session.current_window).to eq(orig_window)
108
111
  end
109
112
  end
110
113
 
111
114
  describe '#resize_to' do
115
+ let!(:initial_size) { @session.current_window.size }
116
+
117
+ after do
118
+ @session.current_window.resize_to(*initial_size)
119
+ sleep 1
120
+ end
121
+
112
122
  it 'should be able to resize window', requires: %i[windows js] do
113
- width, height = @session.current_window.size
123
+ width, height = initial_size
114
124
  @session.current_window.resize_to(width - 100, height - 100)
115
125
  sleep 1
116
126
  expect(@session.current_window.size).to eq([width - 100, height - 100])
117
127
  end
118
128
 
119
129
  it 'should stay on current window if invoked not for current window', requires: %i[windows js] do
120
- @other_window = @session.window_opened_by do
130
+ other_window = @session.window_opened_by do
121
131
  @session.find(:css, '#openWindow').click
122
132
  end
123
- @other_window.resize_to(400, 300)
124
- expect(@session.current_window).to eq(@window)
125
133
 
126
- # #size returns values larger than availWidth, availHeight with Chromedriver
127
- @session.within_window(@other_window) do
128
- expect(@session.current_window.size).to eq([400, 300])
129
- # expect(@session.evaluate_script("[window.outerWidth, window.outerHeight]")).to eq([400,300])
134
+ other_window.resize_to(600, 400)
135
+ expect(@session.current_window).to eq(orig_window)
136
+
137
+ @session.within_window(other_window) do
138
+ expect(@session.current_window.size).to eq([600, 400])
130
139
  end
131
140
  end
132
141
  end
133
142
 
134
143
  describe '#maximize' do
144
+ let! :initial_size do
145
+ @session.current_window.size
146
+ end
147
+
148
+ after do
149
+ @session.current_window.resize_to(*initial_size)
150
+ sleep 0.5
151
+ end
152
+
135
153
  it 'should be able to maximize window', requires: %i[windows js] do
136
154
  start_width, start_height = 400, 300
137
155
  @session.current_window.resize_to(start_width, start_height)
@@ -148,22 +166,38 @@ Capybara::SpecHelper.spec Capybara::Window, requires: [:windows] do
148
166
  end
149
167
 
150
168
  it 'should stay on current window if invoked not for current window', requires: %i[windows js] do
151
- cur_window_size = @session.current_window.size
152
- @other_window = @session.window_opened_by do
169
+ other_window = @session.window_opened_by do
153
170
  @session.find(:css, '#openWindow').click
154
171
  end
155
-
156
- @other_window.resize_to(400, 300)
172
+ other_window.resize_to(400, 300)
157
173
  sleep 0.5
158
- @other_window.maximize
174
+ other_window.maximize
159
175
  sleep 0.5 # The timing on maximize is finicky on Travis -- wait a bit for maximize to occur
160
176
 
161
- expect(@session.current_window).to eq(@window)
162
- expect(@session.current_window.size).to eq(cur_window_size)
177
+ expect(@session.current_window).to eq(orig_window)
178
+ # Maximizing the browser affects all tabs so this may not be valid in real browsers
179
+ # expect(@session.current_window.size).to eq(initial_size)
163
180
 
164
- ow_width, ow_height = @other_window.size
181
+ ow_width, ow_height = other_window.size
165
182
  expect(ow_width).to be > 400
166
183
  expect(ow_height).to be > 300
167
184
  end
168
185
  end
186
+
187
+ describe '#fullscreen' do
188
+ let! :initial_size do
189
+ @session.current_window.size
190
+ end
191
+
192
+ after do
193
+ @session.current_window.resize_to(*initial_size)
194
+ sleep 1
195
+ end
196
+
197
+ it 'should be able to fullscreen the window' do
198
+ expect do
199
+ @session.current_window.fullscreen
200
+ end.not_to raise_error
201
+ end
202
+ end
169
203
  end
@@ -1,7 +1,11 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # NOTE: This file uses `sleep` to sync up parts of the tests. This is only implemented like this
4
+ # because of the methods being tested. In tests using Capybara this type of behavior should be implemented
5
+ # using Capybara provided assertions with builtin waiting behavior.
6
+
3
7
  Capybara::SpecHelper.spec '#windows', requires: [:windows] do
4
- before(:each) do
8
+ before do
5
9
  @window = @session.current_window
6
10
  @session.visit('/with_windows')
7
11
  @session.find(:css, '#openTwoWindows').click
@@ -10,11 +14,9 @@ Capybara::SpecHelper.spec '#windows', requires: [:windows] do
10
14
  raise Capybara::CapybaraError if @session.windows.size != 3
11
15
  end
12
16
  end
13
- after(:each) do
14
- (@session.windows - [@window]).each do |w|
15
- @session.switch_to_window w
16
- w.close
17
- end
17
+
18
+ after do
19
+ (@session.windows - [@window]).each(&:close)
18
20
  @session.switch_to_window(@window)
19
21
  end
20
22
 
@@ -22,10 +24,11 @@ Capybara::SpecHelper.spec '#windows', requires: [:windows] do
22
24
  expect(@session.windows.map { |window| window.instance_of?(Capybara::Window) }).to eq([true] * 3)
23
25
  end
24
26
 
25
- it 'should switchable windows' do
27
+ it 'should be able to switch to windows' do
28
+ sleep 1 # give windows enough time to fully load
26
29
  titles = @session.windows.map do |window|
27
30
  @session.within_window(window) { @session.title }
28
31
  end
29
- expect(titles).to match_array(['With Windows', 'Title of the first popup', 'Title of popup two'])
32
+ expect(titles).to match_array(['With Windows', 'Title of the first popup', 'Title of popup two']) # rubocop:disable RSpec/MatchArray
30
33
  end
31
34
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
4
- before(:each) do
4
+ before do
5
5
  @window = @session.current_window
6
6
  @session.visit('/with_windows')
7
7
  @session.find(:css, '#openTwoWindows').click
@@ -10,7 +10,8 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
10
10
  raise Capybara::CapybaraError if @session.windows.size != 3
11
11
  end
12
12
  end
13
- after(:each) do
13
+
14
+ after do
14
15
  (@session.windows - [@window]).each do |w|
15
16
  @session.switch_to_window w
16
17
  w.close
@@ -18,8 +19,8 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
18
19
  @session.switch_to_window(@window)
19
20
  end
20
21
 
21
- context "with an instance of Capybara::Window" do
22
- it "should not invoke driver#switch_to_window when given current window" do
22
+ context 'with an instance of Capybara::Window' do
23
+ it 'should not invoke driver#switch_to_window when given current window' do
23
24
  allow(@session.driver).to receive(:switch_to_window).and_call_original
24
25
  @session.within_window @window do
25
26
  expect(@session.title).to eq('With Windows')
@@ -27,7 +28,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
27
28
  expect(@session.driver).not_to have_received(:switch_to_window)
28
29
  end
29
30
 
30
- it "should be able to switch to another window" do
31
+ it 'should be able to switch to another window' do
31
32
  window = (@session.windows - [@window]).first
32
33
  @session.within_window window do
33
34
  expect(@session).to have_title(/Title of the first popup|Title of popup two/)
@@ -35,7 +36,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
35
36
  expect(@session.title).to eq('With Windows')
36
37
  end
37
38
 
38
- it "returns value from the block" do
39
+ it 'returns value from the block' do
39
40
  window = (@session.windows - [@window]).first
40
41
  value = @session.within_window window do
41
42
  43252003274489856000
@@ -43,7 +44,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
43
44
  expect(value).to eq(43252003274489856000)
44
45
  end
45
46
 
46
- it "should switch back if exception was raised inside block" do
47
+ it 'should switch back if exception was raised inside block' do
47
48
  window = (@session.windows - [@window]).first
48
49
  expect do
49
50
  @session.within_window(window) do
@@ -57,7 +58,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
57
58
  expect(@session.send(:scopes)).to eq([nil])
58
59
  end
59
60
 
60
- it "should leave correct scopes after execution in case of error", requires: %i[windows frames] do
61
+ it 'should leave correct scopes after execution in case of error', requires: %i[windows frames] do
61
62
  window = (@session.windows - [@window]).first
62
63
  expect do
63
64
  @session.within_frame 'frameOne' do
@@ -85,14 +86,14 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
85
86
  end
86
87
  end
87
88
 
88
- context "with lambda" do
89
- it "should find the div in another window" do
89
+ context 'with lambda' do
90
+ it 'should find the div in another window' do
90
91
  @session.within_window(-> { @session.title == 'Title of the first popup' }) do
91
92
  expect(@session).to have_css('#divInPopupOne')
92
93
  end
93
94
  end
94
95
 
95
- it "should find divs in both windows" do
96
+ it 'should find divs in both windows' do
96
97
  @session.within_window(-> { @session.title == 'Title of popup two' }) do
97
98
  expect(@session).to have_css('#divInPopupTwo')
98
99
  end
@@ -102,7 +103,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
102
103
  expect(@session.title).to eq('With Windows')
103
104
  end
104
105
 
105
- it "should be able to nest within_window" do
106
+ it 'should be able to nest within_window' do
106
107
  @session.within_window(-> { @session.title == 'Title of popup two' }) do
107
108
  expect(@session).to have_css('#divInPopupTwo')
108
109
  @session.within_window(-> { @session.title == 'Title of the first popup' }) do
@@ -116,7 +117,7 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
116
117
  expect(@session.title).to eq('With Windows')
117
118
  end
118
119
 
119
- it "should work inside a normal scope" do
120
+ it 'should work inside a normal scope' do
120
121
  expect(@session).to have_css('#openWindow')
121
122
  @session.within(:css, '#scope') do
122
123
  @session.within_window(-> { @session.title == 'Title of the first popup' }) do
@@ -132,18 +133,18 @@ Capybara::SpecHelper.spec '#within_window', requires: [:windows] do
132
133
  @session.within_window(-> { @session.title == 'Invalid title' }) do
133
134
  expect(@session).to have_css('#divInPopupOne')
134
135
  end
135
- end.to raise_error(Capybara::WindowError, "Could not find a window matching block/lambda")
136
+ end.to raise_error(Capybara::WindowError, 'Could not find a window matching block/lambda')
136
137
  expect(@session.current_window).to eq(@window)
137
138
  expect(@session).to have_css('#doesNotOpenWindows')
138
139
  expect(@session.send(:scopes)).to eq([nil])
139
140
  end
140
141
 
141
- it "returns value from the block" do
142
+ it 'returns value from the block' do
142
143
  value = @session.within_window(-> { @session.title == 'Title of popup two' }) { 42 }
143
144
  expect(value).to eq(42)
144
145
  end
145
146
 
146
- it "should switch back if exception was raised inside block" do
147
+ it 'should switch back if exception was raised inside block' do
147
148
  expect do
148
149
  @session.within_window(-> { @session.title == 'Title of popup two' }) do
149
150
  raise 'some error'
@@ -5,31 +5,67 @@ Capybara::SpecHelper.spec '#within' do
5
5
  @session.visit('/with_scope')
6
6
  end
7
7
 
8
- context "with CSS selector" do
9
- it "should click links in the given scope" do
10
- @session.within(:css, "#for_bar li", text: 'With Simple HTML') do
8
+ context 'with CSS selector' do
9
+ it 'should click links in the given scope' do
10
+ @session.within(:css, '#for_bar li:first-child') do
11
11
  @session.click_link('Go')
12
12
  end
13
13
  expect(@session).to have_content('Bar')
14
14
  end
15
15
 
16
- it "should assert content in the given scope" do
17
- @session.within(:css, "#for_foo") do
16
+ it 'should assert content in the given scope' do
17
+ @session.within(:css, '#for_foo') do
18
18
  expect(@session).not_to have_content('First Name')
19
19
  end
20
20
  expect(@session).to have_content('First Name')
21
21
  end
22
22
 
23
- it "should accept additional options" do
24
- @session.within(:css, "#for_bar li", text: 'With Simple HTML') do
23
+ it 'should accept additional options' do
24
+ @session.within(:css, '#for_bar li', text: 'With Simple HTML') do
25
25
  @session.click_link('Go')
26
26
  end
27
27
  expect(@session).to have_content('Bar')
28
28
  end
29
+
30
+ it 'should reload the node if the page is changed' do
31
+ @session.within(:css, '#for_foo') do
32
+ @session.visit('/with_scope_other')
33
+ expect(@session).to have_content('Different text')
34
+ end
35
+ end
36
+
37
+ it 'should reload multiple nodes if the page is changed' do
38
+ @session.within(:css, '#for_bar') do
39
+ @session.within(:css, 'form[action="/redirect"]') do
40
+ @session.refresh
41
+ expect(@session).to have_content('First Name')
42
+ end
43
+ end
44
+ end
45
+
46
+ it 'should error if the page is changed and a matching node no longer exists' do
47
+ @session.within(:css, '#for_foo') do
48
+ @session.visit('/')
49
+ expect { @session.text }.to raise_error(StandardError)
50
+ end
51
+ end
52
+
53
+ it 'should pass scope element to the block' do
54
+ @session.within(:css, '#another_foo') do |scope|
55
+ expect(scope).to match_css('#another_foo')
56
+ end
57
+ end
58
+
59
+ it 'should scope click', requires: [:js] do
60
+ @session.within(:css, '#another_foo') do |scope|
61
+ @session.click
62
+ expect(scope).to have_text('I was clicked')
63
+ end
64
+ end
29
65
  end
30
66
 
31
- context "with XPath selector" do
32
- it "should click links in the given scope" do
67
+ context 'with XPath selector' do
68
+ it 'should click links in the given scope' do
33
69
  @session.within(:xpath, "//div[@id='for_bar']//li[contains(.,'With Simple HTML')]") do
34
70
  @session.click_link('Go')
35
71
  end
@@ -37,8 +73,8 @@ Capybara::SpecHelper.spec '#within' do
37
73
  end
38
74
  end
39
75
 
40
- context "with the default selector" do
41
- it "should use XPath" do
76
+ context 'with the default selector' do
77
+ it 'should use XPath' do
42
78
  @session.within("//div[@id='for_bar']//li[contains(.,'With Simple HTML')]") do
43
79
  @session.click_link('Go')
44
80
  end
@@ -46,9 +82,9 @@ Capybara::SpecHelper.spec '#within' do
46
82
  end
47
83
  end
48
84
 
49
- context "with Node rather than selector" do
50
- it "should click links in the given scope" do
51
- node_of_interest = @session.find(:css, "#for_bar li", text: 'With Simple HTML')
85
+ context 'with Node rather than selector' do
86
+ it 'should click links in the given scope' do
87
+ node_of_interest = @session.find(:css, '#for_bar li', text: 'With Simple HTML')
52
88
 
53
89
  @session.within(node_of_interest) do
54
90
  @session.click_link('Go')
@@ -57,19 +93,21 @@ Capybara::SpecHelper.spec '#within' do
57
93
  end
58
94
  end
59
95
 
60
- context "with the default selector set to CSS" do
96
+ context 'with the default selector set to CSS' do
61
97
  before { Capybara.default_selector = :css }
62
- it "should use CSS" do
63
- @session.within("#for_bar li", text: 'With Simple HTML') do
98
+
99
+ after { Capybara.default_selector = :xpath }
100
+
101
+ it 'should use CSS' do
102
+ @session.within('#for_bar li', text: 'With Simple HTML') do
64
103
  @session.click_link('Go')
65
104
  end
66
105
  expect(@session).to have_content('Bar')
67
106
  end
68
- after { Capybara.default_selector = :xpath }
69
107
  end
70
108
 
71
- context "with nested scopes" do
72
- it "should respect the inner scope" do
109
+ context 'with nested scopes' do
110
+ it 'should respect the inner scope' do
73
111
  @session.within("//div[@id='for_bar']") do
74
112
  @session.within(".//li[contains(.,'Bar')]") do
75
113
  @session.click_link('Go')
@@ -78,7 +116,7 @@ Capybara::SpecHelper.spec '#within' do
78
116
  expect(@session).to have_content('Another World')
79
117
  end
80
118
 
81
- it "should respect the outer scope" do
119
+ it 'should respect the outer scope' do
82
120
  @session.within("//div[@id='another_foo']") do
83
121
  @session.within(".//li[contains(.,'With Simple HTML')]") do
84
122
  @session.click_link('Go')
@@ -88,14 +126,14 @@ Capybara::SpecHelper.spec '#within' do
88
126
  end
89
127
  end
90
128
 
91
- it "should raise an error if the scope is not found on the page" do
129
+ it 'should raise an error if the scope is not found on the page' do
92
130
  expect do
93
131
  @session.within("//div[@id='doesnotexist']") do
94
132
  end
95
133
  end.to raise_error(Capybara::ElementNotFound)
96
134
  end
97
135
 
98
- it "should restore the scope when an error is raised" do
136
+ it 'should restore the scope when an error is raised' do
99
137
  expect do
100
138
  @session.within("//div[@id='for_bar']") do
101
139
  expect do
@@ -103,12 +141,12 @@ Capybara::SpecHelper.spec '#within' do
103
141
  @session.within(".//div[@id='doesnotexist']") do
104
142
  end
105
143
  end.to raise_error(Capybara::ElementNotFound)
106
- end.to_not change { @session.has_xpath?(".//div[@id='another_foo']") }.from(false)
144
+ end.not_to change { @session.has_xpath?(".//div[@id='another_foo']") }.from(false)
107
145
  end
108
- end.to_not change { @session.has_xpath?(".//div[@id='another_foo']") }.from(true)
146
+ end.not_to change { @session.has_xpath?(".//div[@id='another_foo']") }.from(true)
109
147
  end
110
148
 
111
- it "should fill in a field and click a button" do
149
+ it 'should fill in a field and click a button' do
112
150
  @session.within("//li[contains(.,'Bar')]") do
113
151
  @session.click_button('Go')
114
152
  end
@@ -121,9 +159,9 @@ Capybara::SpecHelper.spec '#within' do
121
159
  expect(extract_results(@session)['first_name']).to eq('Dagobert')
122
160
  end
123
161
 
124
- it "should have #within_element as an alias" do
162
+ it 'should have #within_element as an alias' do
125
163
  expect(Capybara::Session.instance_method(:within)).to eq Capybara::Session.instance_method(:within_element)
126
- @session.within_element(:css, "#for_foo") do
164
+ @session.within_element(:css, '#for_foo') do
127
165
  expect(@session).not_to have_content('First Name')
128
166
  end
129
167
  end
@@ -134,18 +172,18 @@ Capybara::SpecHelper.spec '#within_fieldset' do
134
172
  @session.visit('/fieldsets')
135
173
  end
136
174
 
137
- it "should restrict scope to a fieldset given by id" do
138
- @session.within_fieldset("villain_fieldset") do
139
- @session.fill_in("Name", with: 'Goldfinger')
140
- @session.click_button("Create")
175
+ it 'should restrict scope to a fieldset given by id' do
176
+ @session.within_fieldset('villain_fieldset') do
177
+ @session.fill_in('Name', with: 'Goldfinger')
178
+ @session.click_button('Create')
141
179
  end
142
180
  expect(extract_results(@session)['villain_name']).to eq('Goldfinger')
143
181
  end
144
182
 
145
- it "should restrict scope to a fieldset given by legend" do
146
- @session.within_fieldset("Villain") do
147
- @session.fill_in("Name", with: 'Goldfinger')
148
- @session.click_button("Create")
183
+ it 'should restrict scope to a fieldset given by legend' do
184
+ @session.within_fieldset('Villain') do
185
+ @session.fill_in('Name', with: 'Goldfinger')
186
+ @session.click_button('Create')
149
187
  end
150
188
  expect(extract_results(@session)['villain_name']).to eq('Goldfinger')
151
189
  end
@@ -156,18 +194,18 @@ Capybara::SpecHelper.spec '#within_table' do
156
194
  @session.visit('/tables')
157
195
  end
158
196
 
159
- it "should restrict scope to a fieldset given by id" do
160
- @session.within_table("girl_table") do
161
- @session.fill_in("Name", with: 'Christmas')
162
- @session.click_button("Create")
197
+ it 'should restrict scope to a fieldset given by id' do
198
+ @session.within_table('girl_table') do
199
+ @session.fill_in('Name', with: 'Christmas')
200
+ @session.click_button('Create')
163
201
  end
164
202
  expect(extract_results(@session)['girl_name']).to eq('Christmas')
165
203
  end
166
204
 
167
- it "should restrict scope to a fieldset given by legend" do
168
- @session.within_table("Villain") do
169
- @session.fill_in("Name", with: 'Quantum')
170
- @session.click_button("Create")
205
+ it 'should restrict scope to a fieldset given by legend' do
206
+ @session.within_table('Villain') do
207
+ @session.fill_in('Name', with: 'Quantum')
208
+ @session.click_button('Create')
171
209
  end
172
210
  expect(extract_results(@session)['villain_name']).to eq('Quantum')
173
211
  end