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
@@ -5,35 +5,39 @@ Capybara::SpecHelper.spec '#has_title?' do
5
5
  @session.visit('/with_js')
6
6
  end
7
7
 
8
- it "should be true if the page has the given title" do
8
+ it 'should be true if the page has the given title' do
9
9
  expect(@session).to have_title('with_js')
10
+ expect(@session.has_title?('with_js')).to be true
10
11
  end
11
12
 
12
- it "should allow regexp matches" do
13
+ it 'should allow regexp matches' do
13
14
  expect(@session).to have_title(/w[a-z]{3}_js/)
14
15
  expect(@session).not_to have_title(/monkey/)
15
16
  end
16
17
 
17
- it "should wait for title", requires: [:js] do
18
- @session.click_link("Change title")
19
- expect(@session).to have_title("changed title")
18
+ it 'should wait for title', requires: [:js] do
19
+ @session.click_link('Change title')
20
+ expect(@session).to have_title('changed title')
20
21
  end
21
22
 
22
- it "should be false if the page has not the given title" do
23
+ it 'should be false if the page has not the given title' do
23
24
  expect(@session).not_to have_title('monkey')
25
+ expect(@session.has_title?('monkey')).to be false
24
26
  end
25
27
 
26
- it "should default to exact: false matching" do
28
+ it 'should default to exact: false matching' do
27
29
  expect(@session).to have_title('with_js', exact: false)
28
30
  expect(@session).to have_title('with_', exact: false)
29
31
  end
30
32
 
31
- it "should match exactly if exact: true option passed" do
33
+ it 'should match exactly if exact: true option passed' do
32
34
  expect(@session).to have_title('with_js', exact: true)
33
35
  expect(@session).not_to have_title('with_', exact: true)
36
+ expect(@session.has_title?('with_js', exact: true)).to be true
37
+ expect(@session.has_title?('with_', exact: true)).to be false
34
38
  end
35
39
 
36
- it "should match partial if exact: false option passed" do
40
+ it 'should match partial if exact: false option passed' do
37
41
  expect(@session).to have_title('with_js', exact: false)
38
42
  expect(@session).to have_title('with_', exact: false)
39
43
  end
@@ -44,23 +48,24 @@ Capybara::SpecHelper.spec '#has_no_title?' do
44
48
  @session.visit('/with_js')
45
49
  end
46
50
 
47
- it "should be false if the page has the given title" do
51
+ it 'should be false if the page has the given title' do
48
52
  expect(@session).not_to have_no_title('with_js')
49
53
  end
50
54
 
51
- it "should allow regexp matches" do
55
+ it 'should allow regexp matches' do
52
56
  expect(@session).not_to have_no_title(/w[a-z]{3}_js/)
53
57
  expect(@session).to have_no_title(/monkey/)
54
58
  end
55
59
 
56
- it "should wait for title to disappear", requires: [:js] do
60
+ it 'should wait for title to disappear', requires: [:js] do
57
61
  Capybara.using_wait_time(5) do
58
- @session.click_link("Change title") # triggers title change after 400ms
62
+ @session.click_link('Change title') # triggers title change after 400ms
59
63
  expect(@session).to have_no_title('with_js')
60
64
  end
61
65
  end
62
66
 
63
- it "should be true if the page has not the given title" do
67
+ it 'should be true if the page has not the given title' do
64
68
  expect(@session).to have_no_title('monkey')
69
+ expect(@session.has_no_title?('monkey')).to be true
65
70
  end
66
71
  end
@@ -5,31 +5,45 @@ Capybara::SpecHelper.spec '#has_xpath?' do
5
5
  @session.visit('/with_html')
6
6
  end
7
7
 
8
- it "should be true if the given selector is on the page" do
9
- expect(@session).to have_xpath("//p")
8
+ it 'should be true if the given selector is on the page' do
9
+ expect(@session).to have_xpath('//p')
10
10
  expect(@session).to have_xpath("//p//a[@id='foo']")
11
11
  expect(@session).to have_xpath("//p[contains(.,'est')]")
12
12
  end
13
13
 
14
- it "should be false if the given selector is not on the page" do
15
- expect(@session).not_to have_xpath("//abbr")
14
+ it 'should support :id option' do
15
+ expect(@session).to have_xpath('//h2', id: 'h2one')
16
+ expect(@session).to have_xpath('//h2')
17
+ expect(@session).to have_xpath('//h2', id: /h2o/)
18
+ end
19
+
20
+ it 'should support :class option' do
21
+ expect(@session).to have_xpath('//li', class: 'guitarist')
22
+ expect(@session).to have_xpath('//li', class: /guitar/)
23
+ expect(@session).to have_xpath('//li', class: /guitar|drummer/)
24
+ expect(@session).to have_xpath('//li', class: %w[beatle guitarist])
25
+ expect(@session).to have_xpath('//li', class: /.*/)
26
+ end
27
+
28
+ it 'should be false if the given selector is not on the page' do
29
+ expect(@session).not_to have_xpath('//abbr')
16
30
  expect(@session).not_to have_xpath("//p//a[@id='doesnotexist']")
17
31
  expect(@session).not_to have_xpath("//p[contains(.,'thisstringisnotonpage')]")
18
32
  end
19
33
 
20
- it "should use xpath even if default selector is CSS" do
34
+ it 'should use xpath even if default selector is CSS' do
21
35
  Capybara.default_selector = :css
22
36
  expect(@session).not_to have_xpath("//p//a[@id='doesnotexist']")
23
37
  end
24
38
 
25
- it "should respect scopes" do
39
+ it 'should respect scopes' do
26
40
  @session.within "//p[@id='first']" do
27
41
  expect(@session).to have_xpath(".//a[@id='foo']")
28
42
  expect(@session).not_to have_xpath(".//a[@id='red']")
29
43
  end
30
44
  end
31
45
 
32
- it "should wait for content to appear", requires: [:js] do
46
+ it 'should wait for content to appear', requires: [:js] do
33
47
  Capybara.using_wait_time(3) do
34
48
  @session.visit('/with_js')
35
49
  @session.click_link('Click me') # updates page after 500ms
@@ -37,31 +51,34 @@ Capybara::SpecHelper.spec '#has_xpath?' do
37
51
  end
38
52
  end
39
53
 
40
- context "with count" do
41
- it "should be true if the content occurs the given number of times" do
42
- expect(@session).to have_xpath("//p", count: 3)
54
+ context 'with count' do
55
+ it 'should be true if the content occurs the given number of times' do
56
+ expect(@session).to have_xpath('//p', count: 3)
43
57
  expect(@session).to have_xpath("//p//a[@id='foo']", count: 1)
44
58
  expect(@session).to have_xpath("//p[contains(.,'est')]", count: 1)
45
59
  expect(@session).to have_xpath("//p//a[@id='doesnotexist']", count: 0)
60
+ expect(@session).to have_xpath('//li', class: /guitar|drummer/, count: 4)
61
+ expect(@session).to have_xpath('//li', id: /john|paul/, class: /guitar|drummer/, count: 2)
62
+ expect(@session).to have_xpath('//li', class: %w[beatle guitarist], count: 2)
46
63
  end
47
64
 
48
- it "should be false if the content occurs a different number of times than the given" do
49
- expect(@session).not_to have_xpath("//p", count: 6)
65
+ it 'should be false if the content occurs a different number of times than the given' do
66
+ expect(@session).not_to have_xpath('//p', count: 6)
50
67
  expect(@session).not_to have_xpath("//p//a[@id='foo']", count: 2)
51
68
  expect(@session).not_to have_xpath("//p[contains(.,'est')]", count: 5)
52
69
  expect(@session).not_to have_xpath("//p//a[@id='doesnotexist']", count: 1)
53
70
  end
54
71
  end
55
72
 
56
- context "with text" do
57
- it "should discard all matches where the given string is not contained" do
58
- expect(@session).to have_xpath("//p//a", text: "Redirect", count: 1)
59
- expect(@session).not_to have_xpath("//p", text: "Doesnotexist")
73
+ context 'with text' do
74
+ it 'should discard all matches where the given string is not contained' do
75
+ expect(@session).to have_xpath('//p//a', text: 'Redirect', count: 1)
76
+ expect(@session).not_to have_xpath('//p', text: 'Doesnotexist')
60
77
  end
61
78
 
62
- it "should discard all matches where the given regexp is not matched" do
63
- expect(@session).to have_xpath("//p//a", text: /re[dab]i/i, count: 1)
64
- expect(@session).not_to have_xpath("//p//a", text: /Red$/)
79
+ it 'should discard all matches where the given regexp is not matched' do
80
+ expect(@session).to have_xpath('//p//a', text: /re[dab]i/i, count: 1)
81
+ expect(@session).not_to have_xpath('//p//a', text: /Red$/)
65
82
  end
66
83
  end
67
84
  end
@@ -71,61 +88,62 @@ Capybara::SpecHelper.spec '#has_no_xpath?' do
71
88
  @session.visit('/with_html')
72
89
  end
73
90
 
74
- it "should be false if the given selector is on the page" do
75
- expect(@session).not_to have_no_xpath("//p")
91
+ it 'should be false if the given selector is on the page' do
92
+ expect(@session).not_to have_no_xpath('//p')
76
93
  expect(@session).not_to have_no_xpath("//p//a[@id='foo']")
77
94
  expect(@session).not_to have_no_xpath("//p[contains(.,'est')]")
78
95
  end
79
96
 
80
- it "should be true if the given selector is not on the page" do
81
- expect(@session).to have_no_xpath("//abbr")
97
+ it 'should be true if the given selector is not on the page' do
98
+ expect(@session).to have_no_xpath('//abbr')
82
99
  expect(@session).to have_no_xpath("//p//a[@id='doesnotexist']")
83
100
  expect(@session).to have_no_xpath("//p[contains(.,'thisstringisnotonpage')]")
84
101
  end
85
102
 
86
- it "should use xpath even if default selector is CSS" do
103
+ it 'should use xpath even if default selector is CSS' do
87
104
  Capybara.default_selector = :css
88
105
  expect(@session).to have_no_xpath("//p//a[@id='doesnotexist']")
89
106
  end
90
107
 
91
- it "should respect scopes" do
108
+ it 'should respect scopes' do
92
109
  @session.within "//p[@id='first']" do
93
110
  expect(@session).not_to have_no_xpath(".//a[@id='foo']")
94
111
  expect(@session).to have_no_xpath(".//a[@id='red']")
95
112
  end
96
113
  end
97
114
 
98
- it "should wait for content to disappear", requires: [:js] do
115
+ it 'should wait for content to disappear', requires: [:js] do
116
+ Capybara.default_max_wait_time = 2
99
117
  @session.visit('/with_js')
100
118
  @session.click_link('Click me')
101
119
  expect(@session).to have_no_xpath("//p[@id='change']")
102
120
  end
103
121
 
104
- context "with count" do
105
- it "should be false if the content occurs the given number of times" do
106
- expect(@session).not_to have_no_xpath("//p", count: 3)
122
+ context 'with count' do
123
+ it 'should be false if the content occurs the given number of times' do
124
+ expect(@session).not_to have_no_xpath('//p', count: 3)
107
125
  expect(@session).not_to have_no_xpath("//p//a[@id='foo']", count: 1)
108
126
  expect(@session).not_to have_no_xpath("//p[contains(.,'est')]", count: 1)
109
127
  expect(@session).not_to have_no_xpath("//p//a[@id='doesnotexist']", count: 0)
110
128
  end
111
129
 
112
- it "should be true if the content occurs a different number of times than the given" do
113
- expect(@session).to have_no_xpath("//p", count: 6)
130
+ it 'should be true if the content occurs a different number of times than the given' do
131
+ expect(@session).to have_no_xpath('//p', count: 6)
114
132
  expect(@session).to have_no_xpath("//p//a[@id='foo']", count: 2)
115
133
  expect(@session).to have_no_xpath("//p[contains(.,'est')]", count: 5)
116
134
  expect(@session).to have_no_xpath("//p//a[@id='doesnotexist']", count: 1)
117
135
  end
118
136
  end
119
137
 
120
- context "with text" do
121
- it "should discard all matches where the given string is contained" do
122
- expect(@session).not_to have_no_xpath("//p//a", text: "Redirect", count: 1)
123
- expect(@session).to have_no_xpath("//p", text: "Doesnotexist")
138
+ context 'with text' do
139
+ it 'should discard all matches where the given string is contained' do
140
+ expect(@session).not_to have_no_xpath('//p//a', text: 'Redirect', count: 1)
141
+ expect(@session).to have_no_xpath('//p', text: 'Doesnotexist')
124
142
  end
125
143
 
126
- it "should discard all matches where the given regexp is matched" do
127
- expect(@session).not_to have_no_xpath("//p//a", text: /re[dab]i/i, count: 1)
128
- expect(@session).to have_no_xpath("//p//a", text: /Red$/)
144
+ it 'should discard all matches where the given regexp is matched' do
145
+ expect(@session).not_to have_no_xpath('//p//a', text: /re[dab]i/i, count: 1)
146
+ expect(@session).to have_no_xpath('//p//a', text: /Red$/)
129
147
  end
130
148
  end
131
149
  end
@@ -1,7 +1,7 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  Capybara::SpecHelper.spec '#response_headers' do
4
- it "should return response headers", requires: [:response_headers] do
4
+ it 'should return response headers', requires: [:response_headers] do
5
5
  @session.visit('/with_simple_html')
6
6
  expect(@session.response_headers['Content-Type']).to match %r{text/html}
7
7
  end
@@ -1,39 +1,46 @@
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 '#html' do
4
- it "should return the unmodified page body" do
8
+ it 'should return the unmodified page body' do
5
9
  @session.visit('/')
6
10
  expect(@session.html).to include('Hello world!')
7
11
  end
8
12
 
9
- it "should return the current state of the page", requires: [:js] do
13
+ it 'should return the current state of the page', requires: [:js] do
10
14
  @session.visit('/with_js')
15
+ sleep 1
11
16
  expect(@session.html).to include('I changed it')
12
17
  expect(@session.html).not_to include('This is text')
13
18
  end
14
19
  end
15
20
 
16
21
  Capybara::SpecHelper.spec '#source' do
17
- it "should return the unmodified page source" do
22
+ it 'should return the unmodified page source' do
18
23
  @session.visit('/')
19
24
  expect(@session.source).to include('Hello world!')
20
25
  end
21
26
 
22
- it "should return the current state of the page", requires: [:js] do
27
+ it 'should return the current state of the page', requires: [:js] do
23
28
  @session.visit('/with_js')
29
+ sleep 1
24
30
  expect(@session.source).to include('I changed it')
25
31
  expect(@session.source).not_to include('This is text')
26
32
  end
27
33
  end
28
34
 
29
35
  Capybara::SpecHelper.spec '#body' do
30
- it "should return the unmodified page source" do
36
+ it 'should return the unmodified page source' do
31
37
  @session.visit('/')
32
38
  expect(@session.body).to include('Hello world!')
33
39
  end
34
40
 
35
- it "should return the current state of the page", requires: [:js] do
41
+ it 'should return the current state of the page', requires: [:js] do
36
42
  @session.visit('/with_js')
43
+ sleep 1
37
44
  expect(@session.body).to include('I changed it')
38
45
  expect(@session.body).not_to include('This is text')
39
46
  end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#matches_style?', requires: [:css] do
4
+ before do
5
+ @session.visit('/with_html')
6
+ end
7
+
8
+ it 'should be true if the element has the given style' do
9
+ expect(@session.find(:css, '#first')).to match_style(display: 'block')
10
+ expect(@session.find(:css, '#first').matches_style?(display: 'block')).to be true
11
+ expect(@session.find(:css, '#second')).to match_style('display' => 'inline')
12
+ expect(@session.find(:css, '#second').matches_style?('display' => 'inline')).to be true
13
+ end
14
+
15
+ it 'should be false if the element does not have the given style' do
16
+ expect(@session.find(:css, '#first').matches_style?('display' => 'inline')).to be false
17
+ expect(@session.find(:css, '#second').matches_style?(display: 'block')).to be false
18
+ end
19
+
20
+ it 'allows Regexp for value matching' do
21
+ expect(@session.find(:css, '#first')).to match_style(display: /^bl/)
22
+ expect(@session.find(:css, '#first').matches_style?('display' => /^bl/)).to be true
23
+ expect(@session.find(:css, '#first').matches_style?(display: /^in/)).to be false
24
+ end
25
+
26
+ # rubocop:disable Capybara/MatchStyle
27
+ it 'deprecated has_style?' do
28
+ expect { have_style(display: /^bl/) }.to \
29
+ output(/have_style is deprecated/).to_stderr
30
+
31
+ el = @session.find(:css, '#first')
32
+ allow(Capybara::Helpers).to receive(:warn).and_return(nil)
33
+ el.has_style?('display' => /^bl/)
34
+ expect(Capybara::Helpers).to have_received(:warn)
35
+ end
36
+ # rubocop:enable Capybara/MatchStyle
37
+ end