capybara 3.32.2

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 (313) hide show
  1. checksums.yaml +7 -0
  2. data/.yardopts +1 -0
  3. data/History.md +1813 -0
  4. data/License.txt +22 -0
  5. data/README.md +1099 -0
  6. data/lib/capybara.rb +511 -0
  7. data/lib/capybara/config.rb +94 -0
  8. data/lib/capybara/cucumber.rb +27 -0
  9. data/lib/capybara/driver/base.rb +170 -0
  10. data/lib/capybara/driver/node.rb +139 -0
  11. data/lib/capybara/dsl.rb +65 -0
  12. data/lib/capybara/helpers.rb +108 -0
  13. data/lib/capybara/minitest.rb +386 -0
  14. data/lib/capybara/minitest/spec.rb +264 -0
  15. data/lib/capybara/node/actions.rb +420 -0
  16. data/lib/capybara/node/base.rb +143 -0
  17. data/lib/capybara/node/document.rb +48 -0
  18. data/lib/capybara/node/document_matchers.rb +67 -0
  19. data/lib/capybara/node/element.rb +606 -0
  20. data/lib/capybara/node/finders.rb +325 -0
  21. data/lib/capybara/node/matchers.rb +883 -0
  22. data/lib/capybara/node/simple.rb +208 -0
  23. data/lib/capybara/queries/ancestor_query.rb +27 -0
  24. data/lib/capybara/queries/base_query.rb +106 -0
  25. data/lib/capybara/queries/current_path_query.rb +51 -0
  26. data/lib/capybara/queries/match_query.rb +26 -0
  27. data/lib/capybara/queries/selector_query.rb +710 -0
  28. data/lib/capybara/queries/sibling_query.rb +26 -0
  29. data/lib/capybara/queries/style_query.rb +45 -0
  30. data/lib/capybara/queries/text_query.rb +110 -0
  31. data/lib/capybara/queries/title_query.rb +39 -0
  32. data/lib/capybara/rack_test/browser.rb +140 -0
  33. data/lib/capybara/rack_test/css_handlers.rb +13 -0
  34. data/lib/capybara/rack_test/driver.rb +109 -0
  35. data/lib/capybara/rack_test/errors.rb +6 -0
  36. data/lib/capybara/rack_test/form.rb +127 -0
  37. data/lib/capybara/rack_test/node.rb +325 -0
  38. data/lib/capybara/rails.rb +16 -0
  39. data/lib/capybara/registrations/drivers.rb +36 -0
  40. data/lib/capybara/registrations/patches/puma_ssl.rb +27 -0
  41. data/lib/capybara/registrations/servers.rb +44 -0
  42. data/lib/capybara/result.rb +190 -0
  43. data/lib/capybara/rspec.rb +29 -0
  44. data/lib/capybara/rspec/features.rb +23 -0
  45. data/lib/capybara/rspec/matcher_proxies.rb +82 -0
  46. data/lib/capybara/rspec/matchers.rb +201 -0
  47. data/lib/capybara/rspec/matchers/base.rb +111 -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 +77 -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 +38 -0
  59. data/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  60. data/lib/capybara/selector.rb +233 -0
  61. data/lib/capybara/selector/builders/css_builder.rb +84 -0
  62. data/lib/capybara/selector/builders/xpath_builder.rb +69 -0
  63. data/lib/capybara/selector/css.rb +102 -0
  64. data/lib/capybara/selector/definition.rb +276 -0
  65. data/lib/capybara/selector/definition/button.rb +51 -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 +27 -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 +46 -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/filter.rb +5 -0
  87. data/lib/capybara/selector/filter_set.rb +124 -0
  88. data/lib/capybara/selector/filters/base.rb +77 -0
  89. data/lib/capybara/selector/filters/expression_filter.rb +22 -0
  90. data/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/lib/capybara/selector/filters/node_filter.rb +31 -0
  92. data/lib/capybara/selector/regexp_disassembler.rb +214 -0
  93. data/lib/capybara/selector/selector.rb +147 -0
  94. data/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  96. data/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  97. data/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  98. data/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  99. data/lib/capybara/selenium/driver.rb +496 -0
  100. data/lib/capybara/selenium/driver_specializations/chrome_driver.rb +119 -0
  101. data/lib/capybara/selenium/driver_specializations/edge_driver.rb +126 -0
  102. data/lib/capybara/selenium/driver_specializations/firefox_driver.rb +89 -0
  103. data/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  104. data/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  105. data/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  106. data/lib/capybara/selenium/extensions/find.rb +110 -0
  107. data/lib/capybara/selenium/extensions/html5_drag.rb +228 -0
  108. data/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  109. data/lib/capybara/selenium/extensions/scroll.rb +78 -0
  110. data/lib/capybara/selenium/logger_suppressor.rb +34 -0
  111. data/lib/capybara/selenium/node.rb +610 -0
  112. data/lib/capybara/selenium/nodes/chrome_node.rb +119 -0
  113. data/lib/capybara/selenium/nodes/edge_node.rb +104 -0
  114. data/lib/capybara/selenium/nodes/firefox_node.rb +131 -0
  115. data/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  116. data/lib/capybara/selenium/nodes/safari_node.rb +118 -0
  117. data/lib/capybara/selenium/patches/action_pauser.rb +26 -0
  118. data/lib/capybara/selenium/patches/atoms.rb +18 -0
  119. data/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  120. data/lib/capybara/selenium/patches/logs.rb +47 -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.rb +126 -0
  124. data/lib/capybara/server/animation_disabler.rb +58 -0
  125. data/lib/capybara/server/checker.rb +44 -0
  126. data/lib/capybara/server/middleware.rb +69 -0
  127. data/lib/capybara/session.rb +942 -0
  128. data/lib/capybara/session/config.rb +124 -0
  129. data/lib/capybara/session/matchers.rb +87 -0
  130. data/lib/capybara/spec/fixtures/another_test_file.txt +1 -0
  131. data/lib/capybara/spec/fixtures/capybara.jpg +3 -0
  132. data/lib/capybara/spec/fixtures/no_extension +1 -0
  133. data/lib/capybara/spec/fixtures/test_file.txt +1 -0
  134. data/lib/capybara/spec/public/jquery-ui.js +13 -0
  135. data/lib/capybara/spec/public/jquery.js +5 -0
  136. data/lib/capybara/spec/public/offset.js +6 -0
  137. data/lib/capybara/spec/public/test.js +268 -0
  138. data/lib/capybara/spec/session/accept_alert_spec.rb +81 -0
  139. data/lib/capybara/spec/session/accept_confirm_spec.rb +32 -0
  140. data/lib/capybara/spec/session/accept_prompt_spec.rb +78 -0
  141. data/lib/capybara/spec/session/all_spec.rb +278 -0
  142. data/lib/capybara/spec/session/ancestor_spec.rb +88 -0
  143. data/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +140 -0
  144. data/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
  145. data/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  146. data/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  147. data/lib/capybara/spec/session/assert_text_spec.rb +258 -0
  148. data/lib/capybara/spec/session/assert_title_spec.rb +93 -0
  149. data/lib/capybara/spec/session/attach_file_spec.rb +216 -0
  150. data/lib/capybara/spec/session/body_spec.rb +23 -0
  151. data/lib/capybara/spec/session/check_spec.rb +235 -0
  152. data/lib/capybara/spec/session/choose_spec.rb +121 -0
  153. data/lib/capybara/spec/session/click_button_spec.rb +506 -0
  154. data/lib/capybara/spec/session/click_link_or_button_spec.rb +129 -0
  155. data/lib/capybara/spec/session/click_link_spec.rb +229 -0
  156. data/lib/capybara/spec/session/current_scope_spec.rb +31 -0
  157. data/lib/capybara/spec/session/current_url_spec.rb +115 -0
  158. data/lib/capybara/spec/session/dismiss_confirm_spec.rb +36 -0
  159. data/lib/capybara/spec/session/dismiss_prompt_spec.rb +21 -0
  160. data/lib/capybara/spec/session/element/assert_match_selector_spec.rb +38 -0
  161. data/lib/capybara/spec/session/element/match_css_spec.rb +31 -0
  162. data/lib/capybara/spec/session/element/match_xpath_spec.rb +25 -0
  163. data/lib/capybara/spec/session/element/matches_selector_spec.rb +120 -0
  164. data/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
  165. data/lib/capybara/spec/session/evaluate_script_spec.rb +49 -0
  166. data/lib/capybara/spec/session/execute_script_spec.rb +28 -0
  167. data/lib/capybara/spec/session/fill_in_spec.rb +286 -0
  168. data/lib/capybara/spec/session/find_button_spec.rb +74 -0
  169. data/lib/capybara/spec/session/find_by_id_spec.rb +33 -0
  170. data/lib/capybara/spec/session/find_field_spec.rb +113 -0
  171. data/lib/capybara/spec/session/find_link_spec.rb +70 -0
  172. data/lib/capybara/spec/session/find_spec.rb +531 -0
  173. data/lib/capybara/spec/session/first_spec.rb +156 -0
  174. data/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
  175. data/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
  176. data/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +116 -0
  177. data/lib/capybara/spec/session/frame/within_frame_spec.rb +112 -0
  178. data/lib/capybara/spec/session/go_back_spec.rb +12 -0
  179. data/lib/capybara/spec/session/go_forward_spec.rb +14 -0
  180. data/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
  181. data/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  182. data/lib/capybara/spec/session/has_any_selectors_spec.rb +25 -0
  183. data/lib/capybara/spec/session/has_button_spec.rb +69 -0
  184. data/lib/capybara/spec/session/has_css_spec.rb +374 -0
  185. data/lib/capybara/spec/session/has_current_path_spec.rb +138 -0
  186. data/lib/capybara/spec/session/has_field_spec.rb +349 -0
  187. data/lib/capybara/spec/session/has_link_spec.rb +39 -0
  188. data/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
  189. data/lib/capybara/spec/session/has_select_spec.rb +310 -0
  190. data/lib/capybara/spec/session/has_selector_spec.rb +202 -0
  191. data/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  192. data/lib/capybara/spec/session/has_table_spec.rb +198 -0
  193. data/lib/capybara/spec/session/has_text_spec.rb +394 -0
  194. data/lib/capybara/spec/session/has_title_spec.rb +71 -0
  195. data/lib/capybara/spec/session/has_xpath_spec.rb +149 -0
  196. data/lib/capybara/spec/session/headers_spec.rb +8 -0
  197. data/lib/capybara/spec/session/html_spec.rb +47 -0
  198. data/lib/capybara/spec/session/matches_style_spec.rb +35 -0
  199. data/lib/capybara/spec/session/node_spec.rb +1292 -0
  200. data/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  201. data/lib/capybara/spec/session/refresh_spec.rb +33 -0
  202. data/lib/capybara/spec/session/reset_session_spec.rb +148 -0
  203. data/lib/capybara/spec/session/response_code_spec.rb +8 -0
  204. data/lib/capybara/spec/session/save_and_open_page_spec.rb +21 -0
  205. data/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +43 -0
  206. data/lib/capybara/spec/session/save_page_spec.rb +110 -0
  207. data/lib/capybara/spec/session/save_screenshot_spec.rb +55 -0
  208. data/lib/capybara/spec/session/screenshot_spec.rb +18 -0
  209. data/lib/capybara/spec/session/scroll_spec.rb +117 -0
  210. data/lib/capybara/spec/session/select_spec.rb +229 -0
  211. data/lib/capybara/spec/session/selectors_spec.rb +98 -0
  212. data/lib/capybara/spec/session/sibling_spec.rb +52 -0
  213. data/lib/capybara/spec/session/source_spec.rb +0 -0
  214. data/lib/capybara/spec/session/text_spec.rb +74 -0
  215. data/lib/capybara/spec/session/title_spec.rb +29 -0
  216. data/lib/capybara/spec/session/uncheck_spec.rb +100 -0
  217. data/lib/capybara/spec/session/unselect_spec.rb +116 -0
  218. data/lib/capybara/spec/session/visit_spec.rb +204 -0
  219. data/lib/capybara/spec/session/window/become_closed_spec.rb +89 -0
  220. data/lib/capybara/spec/session/window/current_window_spec.rb +28 -0
  221. data/lib/capybara/spec/session/window/open_new_window_spec.rb +31 -0
  222. data/lib/capybara/spec/session/window/switch_to_window_spec.rb +132 -0
  223. data/lib/capybara/spec/session/window/window_opened_by_spec.rb +99 -0
  224. data/lib/capybara/spec/session/window/window_spec.rb +203 -0
  225. data/lib/capybara/spec/session/window/windows_spec.rb +34 -0
  226. data/lib/capybara/spec/session/window/within_window_spec.rb +157 -0
  227. data/lib/capybara/spec/session/within_spec.rb +199 -0
  228. data/lib/capybara/spec/spec_helper.rb +134 -0
  229. data/lib/capybara/spec/test_app.rb +226 -0
  230. data/lib/capybara/spec/views/animated.erb +49 -0
  231. data/lib/capybara/spec/views/buttons.erb +5 -0
  232. data/lib/capybara/spec/views/fieldsets.erb +30 -0
  233. data/lib/capybara/spec/views/form.erb +685 -0
  234. data/lib/capybara/spec/views/frame_child.erb +18 -0
  235. data/lib/capybara/spec/views/frame_one.erb +10 -0
  236. data/lib/capybara/spec/views/frame_parent.erb +9 -0
  237. data/lib/capybara/spec/views/frame_two.erb +9 -0
  238. data/lib/capybara/spec/views/header_links.erb +8 -0
  239. data/lib/capybara/spec/views/host_links.erb +13 -0
  240. data/lib/capybara/spec/views/initial_alert.erb +10 -0
  241. data/lib/capybara/spec/views/obscured.erb +47 -0
  242. data/lib/capybara/spec/views/offset.erb +32 -0
  243. data/lib/capybara/spec/views/path.erb +13 -0
  244. data/lib/capybara/spec/views/popup_one.erb +9 -0
  245. data/lib/capybara/spec/views/popup_two.erb +9 -0
  246. data/lib/capybara/spec/views/postback.erb +14 -0
  247. data/lib/capybara/spec/views/react.erb +45 -0
  248. data/lib/capybara/spec/views/scroll.erb +20 -0
  249. data/lib/capybara/spec/views/spatial.erb +31 -0
  250. data/lib/capybara/spec/views/tables.erb +130 -0
  251. data/lib/capybara/spec/views/with_animation.erb +74 -0
  252. data/lib/capybara/spec/views/with_base_tag.erb +11 -0
  253. data/lib/capybara/spec/views/with_count.erb +8 -0
  254. data/lib/capybara/spec/views/with_dragula.erb +22 -0
  255. data/lib/capybara/spec/views/with_fixed_header_footer.erb +17 -0
  256. data/lib/capybara/spec/views/with_hover.erb +24 -0
  257. data/lib/capybara/spec/views/with_hover1.erb +10 -0
  258. data/lib/capybara/spec/views/with_html.erb +208 -0
  259. data/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  260. data/lib/capybara/spec/views/with_html_entities.erb +2 -0
  261. data/lib/capybara/spec/views/with_js.erb +160 -0
  262. data/lib/capybara/spec/views/with_jstree.erb +26 -0
  263. data/lib/capybara/spec/views/with_namespace.erb +20 -0
  264. data/lib/capybara/spec/views/with_scope.erb +42 -0
  265. data/lib/capybara/spec/views/with_scope_other.erb +6 -0
  266. data/lib/capybara/spec/views/with_simple_html.erb +2 -0
  267. data/lib/capybara/spec/views/with_slow_unload.erb +17 -0
  268. data/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  269. data/lib/capybara/spec/views/with_title.erb +5 -0
  270. data/lib/capybara/spec/views/with_unload_alert.erb +14 -0
  271. data/lib/capybara/spec/views/with_windows.erb +54 -0
  272. data/lib/capybara/spec/views/within_frames.erb +15 -0
  273. data/lib/capybara/version.rb +5 -0
  274. data/lib/capybara/window.rb +146 -0
  275. data/spec/basic_node_spec.rb +154 -0
  276. data/spec/capybara_spec.rb +112 -0
  277. data/spec/css_builder_spec.rb +101 -0
  278. data/spec/css_splitter_spec.rb +38 -0
  279. data/spec/dsl_spec.rb +276 -0
  280. data/spec/filter_set_spec.rb +46 -0
  281. data/spec/fixtures/capybara.csv +1 -0
  282. data/spec/fixtures/certificate.pem +25 -0
  283. data/spec/fixtures/key.pem +27 -0
  284. data/spec/fixtures/selenium_driver_rspec_failure.rb +13 -0
  285. data/spec/fixtures/selenium_driver_rspec_success.rb +13 -0
  286. data/spec/minitest_spec.rb +163 -0
  287. data/spec/minitest_spec_spec.rb +162 -0
  288. data/spec/per_session_config_spec.rb +68 -0
  289. data/spec/rack_test_spec.rb +268 -0
  290. data/spec/regexp_dissassembler_spec.rb +250 -0
  291. data/spec/result_spec.rb +196 -0
  292. data/spec/rspec/features_spec.rb +99 -0
  293. data/spec/rspec/scenarios_spec.rb +19 -0
  294. data/spec/rspec/shared_spec_matchers.rb +947 -0
  295. data/spec/rspec/views_spec.rb +14 -0
  296. data/spec/rspec_matchers_spec.rb +62 -0
  297. data/spec/rspec_spec.rb +145 -0
  298. data/spec/sauce_spec_chrome.rb +43 -0
  299. data/spec/selector_spec.rb +513 -0
  300. data/spec/selenium_spec_chrome.rb +188 -0
  301. data/spec/selenium_spec_chrome_remote.rb +96 -0
  302. data/spec/selenium_spec_edge.rb +47 -0
  303. data/spec/selenium_spec_firefox.rb +208 -0
  304. data/spec/selenium_spec_firefox_remote.rb +80 -0
  305. data/spec/selenium_spec_ie.rb +150 -0
  306. data/spec/selenium_spec_safari.rb +148 -0
  307. data/spec/server_spec.rb +292 -0
  308. data/spec/session_spec.rb +91 -0
  309. data/spec/shared_selenium_node.rb +83 -0
  310. data/spec/shared_selenium_session.rb +476 -0
  311. data/spec/spec_helper.rb +100 -0
  312. data/spec/xpath_builder_spec.rb +93 -0
  313. metadata +753 -0
@@ -0,0 +1,258 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#assert_text' do
4
+ it 'should be true if the given text is on the page' do
5
+ @session.visit('/with_html')
6
+ expect(@session.assert_text('est')).to eq(true)
7
+ expect(@session.assert_text('Lorem')).to eq(true)
8
+ expect(@session.assert_text('Redirect')).to eq(true)
9
+ expect(@session.assert_text(:Redirect)).to eq(true)
10
+ expect(@session.assert_text('text with whitespace')).to eq(true)
11
+ end
12
+
13
+ it 'should support collapsing whitespace' do
14
+ @session.visit('/with_html')
15
+ expect(@session.assert_text('text with whitespace', normalize_ws: true)).to eq(true)
16
+ end
17
+
18
+ context 'with enabled default collapsing whitespace' do
19
+ before { Capybara.default_normalize_ws = true }
20
+
21
+ it 'should be true if the given unnormalized text is on the page' do
22
+ @session.visit('/with_html')
23
+ expect(@session.assert_text('text with whitespace', normalize_ws: false)).to eq(true)
24
+ end
25
+
26
+ it 'should support collapsing whitespace' do
27
+ @session.visit('/with_html')
28
+ expect(@session.assert_text('text with whitespace')).to eq(true)
29
+ end
30
+ end
31
+
32
+ it 'should take scopes into account' do
33
+ @session.visit('/with_html')
34
+ @session.within("//a[@title='awesome title']") do
35
+ expect(@session.assert_text('labore')).to eq(true)
36
+ end
37
+ end
38
+
39
+ it 'should raise if scoped to an element which does not have the text' do
40
+ @session.visit('/with_html')
41
+ @session.within("//a[@title='awesome title']") do
42
+ expect do
43
+ @session.assert_text('monkey')
44
+ end.to raise_error(Capybara::ExpectationNotMet, 'expected to find text "monkey" in "labore"')
45
+ end
46
+ end
47
+
48
+ it 'should be true if :all given and text is invisible.' do
49
+ @session.visit('/with_html')
50
+ expect(@session.assert_text(:all, 'Some of this text is hidden!')).to eq(true)
51
+ end
52
+
53
+ it 'should be true if `Capybara.ignore_hidden_elements = true` and text is invisible.' do
54
+ Capybara.ignore_hidden_elements = false
55
+ @session.visit('/with_html')
56
+ expect(@session.assert_text('Some of this text is hidden!')).to eq(true)
57
+ end
58
+
59
+ it 'should raise error with a helpful message if the requested text is present but invisible' do
60
+ @session.visit('/with_html')
61
+ el = @session.find(:css, '#hidden-text')
62
+ expect do
63
+ el.assert_text(:visible, 'Some of this text is hidden!')
64
+ end.to raise_error(Capybara::ExpectationNotMet, /it was found 1 time including non-visible text/)
65
+ end
66
+
67
+ it 'should raise error with a helpful message if the requested text is present but with incorrect case' do
68
+ @session.visit('/with_html')
69
+ expect do
70
+ @session.assert_text('Text With Whitespace')
71
+ end.to raise_error(Capybara::ExpectationNotMet, /it was found 1 time using a case insensitive search/)
72
+ end
73
+
74
+ it 'should raise error with helpful message if requested text is present but invisible and with incorrect case', requires: [:js] do
75
+ @session.visit('/with_html')
76
+ el = @session.find(:css, '#uppercase')
77
+ expect do
78
+ el.assert_text('text here')
79
+ end.to raise_error(Capybara::ExpectationNotMet, /it was found 1 time using a case insensitive search and it was found 1 time including non-visible text/)
80
+ end
81
+
82
+ it 'should raise the correct error if requested text is missing but contains regex special characters' do
83
+ @session.visit('/with_html')
84
+ expect do
85
+ @session.assert_text('[]*.')
86
+ end.to raise_error(Capybara::ExpectationNotMet, /expected to find text "\[\]\*\."/)
87
+ end
88
+
89
+ it 'should be true if the text in the page matches given regexp' do
90
+ @session.visit('/with_html')
91
+ expect(@session.assert_text(/Lorem/)).to eq(true)
92
+ end
93
+
94
+ it "should raise error if the text in the page doesn't match given regexp" do
95
+ @session.visit('/with_html')
96
+ expect do
97
+ @session.assert_text(/xxxxyzzz/)
98
+ end.to raise_error(Capybara::ExpectationNotMet, %r{\Aexpected to find text matching /xxxxyzzz/ in "This is a test\\nHeader Class(.+)"\Z})
99
+ end
100
+
101
+ it 'should escape any characters that would have special meaning in a regexp' do
102
+ @session.visit('/with_html')
103
+ expect do
104
+ @session.assert_text('.orem')
105
+ end.to raise_error(Capybara::ExpectationNotMet)
106
+ end
107
+
108
+ it 'should wait for text to appear', requires: [:js] do
109
+ Capybara.default_max_wait_time = 2
110
+ @session.visit('/with_js')
111
+ @session.click_link('Click me')
112
+ expect(@session.assert_text('Has been clicked')).to eq(true)
113
+ end
114
+
115
+ context 'with between' do
116
+ it 'should be true if the text occurs within the range given' do
117
+ @session.visit('/with_count')
118
+ expect(@session.assert_text('count', between: 1..3)).to eq(true)
119
+ end
120
+
121
+ it 'should be false if the text occurs more or fewer times than range' do
122
+ @session.visit('/with_html')
123
+ expect do
124
+ @session.find(:css, '.number').assert_text(/\d/, between: 0..1)
125
+ end.to raise_error(Capybara::ExpectationNotMet, 'expected to find text matching /\\d/ between 0 and 1 times but found 2 times in "42"')
126
+ end
127
+ end
128
+
129
+ context 'with wait', requires: [:js] do
130
+ it 'should find element if it appears before given wait duration' do
131
+ Capybara.using_wait_time(0) do
132
+ @session.visit('/with_js')
133
+ @session.find(:css, '#reload-list').click
134
+ @session.find(:css, '#the-list').assert_text("Foo\nBar", wait: 0.9)
135
+ end
136
+ end
137
+
138
+ it 'should raise error if it appears after given wait duration' do
139
+ Capybara.using_wait_time(0) do
140
+ @session.visit('/with_js')
141
+ @session.find(:css, '#reload-list').click
142
+ el = @session.find(:css, '#the-list', visible: false)
143
+ expect do
144
+ el.assert_text(:all, 'Foo Bar', wait: 0.3)
145
+ end.to raise_error(Capybara::ExpectationNotMet)
146
+ end
147
+ end
148
+ end
149
+
150
+ context 'with multiple count filters' do
151
+ before do
152
+ @session.visit('/with_html')
153
+ end
154
+
155
+ it 'ignores other filters when :count is specified' do
156
+ o = { count: 5,
157
+ minimum: 6,
158
+ maximum: 0,
159
+ between: 0..4 }
160
+ expect { @session.assert_text('Header', **o) }.not_to raise_error
161
+ end
162
+
163
+ context 'with no :count expectation' do
164
+ it 'fails if :minimum is not met' do
165
+ o = { minimum: 6,
166
+ maximum: 5,
167
+ between: 2..7 }
168
+ expect { @session.assert_text('Header', **o) }.to raise_error(Capybara::ExpectationNotMet)
169
+ end
170
+
171
+ it 'fails if :maximum is not met' do
172
+ o = { minimum: 0,
173
+ maximum: 0,
174
+ between: 2..7 }
175
+ expect { @session.assert_text('Header', **o) }.to raise_error(Capybara::ExpectationNotMet)
176
+ end
177
+
178
+ it 'fails if :between is not met' do
179
+ o = { minimum: 0,
180
+ maximum: 5,
181
+ between: 0..4 }
182
+ expect { @session.assert_text('Header', **o) }.to raise_error(Capybara::ExpectationNotMet)
183
+ end
184
+
185
+ it 'succeeds if all combineable expectations are met' do
186
+ o = { minimum: 0,
187
+ maximum: 5,
188
+ between: 2..7 }
189
+ expect { @session.assert_text('Header', **o) }.not_to raise_error
190
+ end
191
+ end
192
+ end
193
+ end
194
+
195
+ Capybara::SpecHelper.spec '#assert_no_text' do
196
+ it 'should raise error if the given text is on the page at least once' do
197
+ @session.visit('/with_html')
198
+ expect do
199
+ @session.assert_no_text('Lorem')
200
+ end.to raise_error(Capybara::ExpectationNotMet, /\Aexpected not to find text "Lorem" in "This is a test.*"\z/)
201
+ end
202
+
203
+ it 'should be true if scoped to an element which does not have the text' do
204
+ @session.visit('/with_html')
205
+ @session.within("//a[@title='awesome title']") do
206
+ expect(@session.assert_no_text('monkey')).to eq(true)
207
+ end
208
+ end
209
+
210
+ it 'should be true if the given text is on the page but not visible' do
211
+ @session.visit('/with_html')
212
+ expect(@session.assert_no_text('Inside element with hidden ancestor')).to eq(true)
213
+ end
214
+
215
+ it 'should raise error if :all given and text is invisible.' do
216
+ @session.visit('/with_html')
217
+ el = @session.find(:css, '#hidden-text', visible: false)
218
+ expect do
219
+ el.assert_no_text(:all, 'Some of this text is hidden!')
220
+ end.to raise_error(Capybara::ExpectationNotMet, 'expected not to find text "Some of this text is hidden!" in "Some of this text is hidden!"')
221
+ end
222
+
223
+ it 'should raise error if :all given and text is invisible.' do
224
+ @session.visit('/with_html')
225
+ el = @session.find(:css, '#some-hidden-text', visible: false)
226
+ expect do
227
+ el.assert_no_text(:visible, 'hidden')
228
+ end.to raise_error(Capybara::ExpectationNotMet, 'expected not to find text "hidden" in "Some of this text is not hidden"')
229
+ end
230
+
231
+ it "should be true if the text in the page doesn't match given regexp" do
232
+ @session.visit('/with_html')
233
+ @session.assert_no_text(/xxxxyzzz/)
234
+ end
235
+
236
+ context 'with count' do
237
+ it 'should be true if the text occurs within the range given' do
238
+ @session.visit('/with_count')
239
+ expect(@session.assert_text('count', count: 2)).to eq(true)
240
+ end
241
+
242
+ it 'should be false if the text occurs more or fewer times than range' do
243
+ @session.visit('/with_html')
244
+ expect do
245
+ @session.find(:css, '.number').assert_text(/\d/, count: 1)
246
+ end.to raise_error(Capybara::ExpectationNotMet, 'expected to find text matching /\\d/ 1 time but found 2 times in "42"')
247
+ end
248
+ end
249
+
250
+ context 'with wait', requires: [:js] do
251
+ it 'should not find element if it appears after given wait duration' do
252
+ @session.visit('/with_js')
253
+ @session.click_link('Click me')
254
+ @session.find(:css, '#reload-list').click
255
+ @session.find(:css, '#the-list').assert_no_text('Foo Bar', wait: 0.3)
256
+ end
257
+ end
258
+ end
@@ -0,0 +1,93 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#assert_title' do
4
+ before do
5
+ @session.visit('/with_js')
6
+ end
7
+
8
+ it "should not raise if the page's title contains the given string" do
9
+ expect do
10
+ @session.assert_title('js')
11
+ end.not_to raise_error
12
+ end
13
+
14
+ it 'should not raise when given an empty string' do
15
+ expect do
16
+ @session.assert_title('')
17
+ end.not_to raise_error
18
+ end
19
+
20
+ it 'should allow regexp matches' do
21
+ expect do
22
+ @session.assert_title(/w[a-z]{3}_js/)
23
+ end.not_to raise_error
24
+
25
+ expect do
26
+ @session.assert_title(/w[a-z]{10}_js/)
27
+ end.to raise_error(Capybara::ExpectationNotMet, 'expected "with_js" to match /w[a-z]{10}_js/')
28
+ end
29
+
30
+ it 'should wait for title', requires: [:js] do
31
+ @session.click_link('Change title')
32
+ expect do
33
+ @session.assert_title('changed title', wait: 3)
34
+ end.not_to raise_error
35
+ end
36
+
37
+ it "should raise error if the title doesn't contain the given string" do
38
+ expect do
39
+ @session.assert_title('monkey')
40
+ end.to raise_error(Capybara::ExpectationNotMet, 'expected "with_js" to include "monkey"')
41
+ end
42
+
43
+ it 'should not normalize given title' do
44
+ @session.visit('/with_js')
45
+ expect { @session.assert_title(' with_js ') }.to raise_error(Capybara::ExpectationNotMet)
46
+ end
47
+
48
+ it 'should match correctly normalized title' do
49
+ uri = Addressable::URI.parse('/with_title')
50
+ uri.query_values = { title: '   with space  title ' }
51
+ @session.visit(uri.to_s)
52
+ @session.assert_title(' with space title')
53
+ expect { @session.assert_title('with space title') }.to raise_error(Capybara::ExpectationNotMet)
54
+ end
55
+
56
+ it 'should not normalize given title in error message' do
57
+ expect do
58
+ @session.assert_title(2)
59
+ end.to raise_error(Capybara::ExpectationNotMet, 'expected "with_js" to include "2"')
60
+ end
61
+ end
62
+
63
+ Capybara::SpecHelper.spec '#assert_no_title' do
64
+ before do
65
+ @session.visit('/with_js')
66
+ end
67
+
68
+ it 'should raise error if the title contains the given string' do
69
+ expect do
70
+ @session.assert_no_title('with_j')
71
+ end.to raise_error(Capybara::ExpectationNotMet, 'expected "with_js" not to include "with_j"')
72
+ end
73
+
74
+ it 'should allow regexp matches' do
75
+ expect do
76
+ @session.assert_no_title(/w[a-z]{3}_js/)
77
+ end.to raise_error(Capybara::ExpectationNotMet, 'expected "with_js" not to match /w[a-z]{3}_js/')
78
+ @session.assert_no_title(/monkey/)
79
+ end
80
+
81
+ it 'should wait for title to disappear', requires: [:js] do
82
+ @session.click_link('Change title')
83
+ expect do
84
+ @session.assert_no_title('with_js', wait: 3)
85
+ end.not_to raise_error
86
+ end
87
+
88
+ it "should not raise if the title doesn't contain the given string" do
89
+ expect do
90
+ @session.assert_no_title('monkey')
91
+ end.not_to raise_error
92
+ end
93
+ end
@@ -0,0 +1,216 @@
1
+ # frozen_string_literal: true
2
+
3
+ Capybara::SpecHelper.spec '#attach_file' do
4
+ let(:test_file_path) { File.expand_path('../fixtures/test_file.txt', File.dirname(__FILE__)) }
5
+ let(:another_test_file_path) { File.expand_path('../fixtures/another_test_file.txt', File.dirname(__FILE__)) }
6
+ let(:test_jpg_file_path) { File.expand_path('../fixtures/capybara.jpg', File.dirname(__FILE__)) }
7
+ let(:no_extension_file_path) { File.expand_path('../fixtures/no_extension', File.dirname(__FILE__)) }
8
+
9
+ before do
10
+ @session.visit('/form')
11
+ end
12
+
13
+ context 'with normal form' do
14
+ it 'should set a file path by id' do
15
+ @session.attach_file 'form_image', with_os_path_separators(__FILE__)
16
+ @session.click_button('awesome')
17
+ expect(extract_results(@session)['image']).to end_with(File.basename(__FILE__))
18
+ end
19
+
20
+ it 'should set a file path by label' do
21
+ @session.attach_file 'Image', with_os_path_separators(__FILE__)
22
+ @session.click_button('awesome')
23
+ expect(extract_results(@session)['image']).to end_with(File.basename(__FILE__))
24
+ end
25
+
26
+ it 'should be able to set on element if no locator passed' do
27
+ ff = @session.find(:file_field, 'Image')
28
+ ff.attach_file(with_os_path_separators(__FILE__))
29
+ @session.click_button('awesome')
30
+ expect(extract_results(@session)['image']).to end_with(File.basename(__FILE__))
31
+ end
32
+
33
+ it 'casts to string' do
34
+ @session.attach_file :form_image, with_os_path_separators(__FILE__)
35
+ @session.click_button('awesome')
36
+ expect(extract_results(@session)['image']).to end_with(File.basename(__FILE__))
37
+ end
38
+ end
39
+
40
+ context 'with multipart form' do
41
+ it 'should set a file path by id' do
42
+ @session.attach_file 'form_document', with_os_path_separators(test_file_path)
43
+ @session.click_button('Upload Single')
44
+ expect(@session).to have_content(File.read(test_file_path))
45
+ end
46
+
47
+ it 'should set a file path by label' do
48
+ @session.attach_file 'Single Document', with_os_path_separators(test_file_path)
49
+ @session.click_button('Upload Single')
50
+ expect(@session).to have_content(File.read(test_file_path))
51
+ end
52
+
53
+ it 'should not break if no file is submitted' do
54
+ @session.click_button('Upload Single')
55
+ expect(@session).to have_content('No file uploaded')
56
+ end
57
+
58
+ it 'should send content type text/plain when uploading a text file' do
59
+ @session.attach_file 'Single Document', with_os_path_separators(test_file_path)
60
+ @session.click_button 'Upload Single'
61
+ expect(@session).to have_content('text/plain')
62
+ end
63
+
64
+ it 'should send content type image/jpeg when uploading an image' do
65
+ @session.attach_file 'Single Document', with_os_path_separators(test_jpg_file_path)
66
+ @session.click_button 'Upload Single'
67
+ expect(@session).to have_content('image/jpeg')
68
+ end
69
+
70
+ it 'should not break when uploading a file without extension' do
71
+ @session.attach_file 'Single Document', with_os_path_separators(no_extension_file_path)
72
+ @session.click_button 'Upload Single'
73
+ expect(@session).to have_content(File.read(no_extension_file_path))
74
+ end
75
+
76
+ it 'should not break when using HTML5 multiple file input' do
77
+ @session.attach_file 'Multiple Documents', with_os_path_separators(test_file_path)
78
+ @session.click_button('Upload Multiple')
79
+ expect(@session).to have_content(File.read(test_file_path))
80
+ expect(@session.body).to include('1 | ') # number of files
81
+ end
82
+
83
+ it 'should not break when using HTML5 multiple file input uploading multiple files' do
84
+ @session.attach_file('Multiple Documents',
85
+ [test_file_path, another_test_file_path].map { |f| with_os_path_separators(f) })
86
+ @session.click_button('Upload Multiple')
87
+ expect(@session).to have_content('2 | ') # number of files
88
+ expect(@session.body).to include(File.read(test_file_path))
89
+ expect(@session.body).to include(File.read(another_test_file_path))
90
+ end
91
+
92
+ it 'should not send anything when attaching no files to a multiple upload field' do
93
+ @session.click_button('Upload Empty Multiple')
94
+ expect(@session).to have_content('Successfully ignored empty file field')
95
+ end
96
+
97
+ it 'should not append files to already attached' do
98
+ @session.attach_file 'Multiple Documents', with_os_path_separators(test_file_path)
99
+ @session.attach_file 'Multiple Documents', with_os_path_separators(another_test_file_path)
100
+ @session.click_button('Upload Multiple')
101
+ expect(@session).to have_content('1 | ') # number of files
102
+ expect(@session.body).to include(File.read(another_test_file_path))
103
+ expect(@session.body).not_to include(File.read(test_file_path))
104
+ end
105
+
106
+ it 'should fire change once when uploading multiple files from empty', requires: [:js] do
107
+ @session.visit('with_js')
108
+ @session.attach_file('multiple-file',
109
+ [test_file_path, another_test_file_path].map { |f| with_os_path_separators(f) })
110
+ expect(@session).to have_css('.file_change', count: 1)
111
+ end
112
+
113
+ it 'should fire change once for each set of files uploaded', requires: [:js] do
114
+ @session.visit('with_js')
115
+ @session.attach_file('multiple-file', [test_jpg_file_path].map { |f| with_os_path_separators(f) })
116
+ @session.attach_file('multiple-file',
117
+ [test_file_path, another_test_file_path].map { |f| with_os_path_separators(f) })
118
+ expect(@session).to have_css('.file_change', count: 2)
119
+ end
120
+ end
121
+
122
+ context "with a locator that doesn't exist" do
123
+ it 'should raise an error' do
124
+ msg = /Unable to find file field "does not exist"/
125
+ expect do
126
+ @session.attach_file('does not exist', with_os_path_separators(test_file_path))
127
+ end.to raise_error(Capybara::ElementNotFound, msg)
128
+ end
129
+ end
130
+
131
+ context "with a path that doesn't exist" do
132
+ it 'should raise an error' do
133
+ expect { @session.attach_file('Image', '/no_such_file.png') }.to raise_error(Capybara::FileNotFound)
134
+ end
135
+ end
136
+
137
+ context 'with :exact option' do
138
+ it 'should set a file path by partial label when false' do
139
+ @session.attach_file 'Imag', with_os_path_separators(__FILE__), exact: false
140
+ @session.click_button('awesome')
141
+ expect(extract_results(@session)['image']).to end_with(File.basename(__FILE__))
142
+ end
143
+
144
+ it 'should not allow partial matches when true' do
145
+ expect do
146
+ @session.attach_file 'Imag', with_os_path_separators(__FILE__), exact: true
147
+ end.to raise_error(Capybara::ElementNotFound)
148
+ end
149
+ end
150
+
151
+ context 'with :make_visible option', requires: %i[js es_args] do
152
+ it 'applies a default style change when true' do
153
+ @session.visit('/with_js')
154
+ expect do
155
+ @session.attach_file('hidden_file', with_os_path_separators(__FILE__))
156
+ end.to raise_error Capybara::ElementNotFound
157
+ expect do
158
+ @session.attach_file('hidden_file', with_os_path_separators(__FILE__), make_visible: true)
159
+ end.not_to raise_error
160
+ end
161
+
162
+ it 'accepts a hash of styles to be applied' do
163
+ @session.visit('/with_js')
164
+ expect do
165
+ @session.attach_file('hidden_file',
166
+ with_os_path_separators(__FILE__),
167
+ make_visible: { opacity: 1, display: 'block' })
168
+ end.not_to raise_error
169
+ end
170
+
171
+ it 'raises an error when the file input is not made visible' do
172
+ @session.visit('/with_js')
173
+ expect do
174
+ @session.attach_file('hidden_file', with_os_path_separators(__FILE__), make_visible: { color: 'red' })
175
+ end.to raise_error(Capybara::ExpectationNotMet)
176
+ end
177
+
178
+ it 'resets the style when done' do
179
+ @session.visit('/with_js')
180
+ @session.attach_file('hidden_file', with_os_path_separators(__FILE__), make_visible: true)
181
+ expect(@session.evaluate_script('arguments[0].style.display', @session.find(:css, '#hidden_file', visible: :all))).to eq 'none'
182
+ end
183
+
184
+ it 'should fire change' do
185
+ @session.visit('/with_js')
186
+ @session.attach_file('hidden_file', with_os_path_separators(__FILE__), make_visible: true)
187
+ expect(@session).to have_css('.file_change')
188
+ end
189
+ end
190
+
191
+ context 'with a block', requires: %i[js] do
192
+ it 'can upload by clicking the file input' do
193
+ @session.attach_file(with_os_path_separators(__FILE__)) do
194
+ @session.find(:file_field, 'form[image]').click
195
+ end
196
+ @session.click_button('awesome')
197
+ expect(extract_results(@session)['image']).to end_with(File.basename(__FILE__))
198
+ end
199
+
200
+ it 'can upload by clicking the label' do
201
+ @session.attach_file(with_os_path_separators(__FILE__)) do
202
+ @session.find(:label, 'Hidden Image').click
203
+ end
204
+ @session.click_button('awesome')
205
+ expect(extract_results(@session)['hidden_image']).to end_with(File.basename(__FILE__))
206
+ end
207
+
208
+ it 'should fire change' do
209
+ @session.visit('/with_js')
210
+ @session.attach_file(with_os_path_separators(__FILE__)) do
211
+ @session.find(:label, 'Label for hidden file input').click
212
+ end
213
+ expect(@session).to have_css('.file_change')
214
+ end
215
+ end
216
+ end