mega-max-rb 0.0.1

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 (319) hide show
  1. checksums.yaml +7 -0
  2. data/capybara-3.40.0/History.md +2043 -0
  3. data/capybara-3.40.0/License.txt +22 -0
  4. data/capybara-3.40.0/README.md +1264 -0
  5. data/capybara-3.40.0/lib/capybara/config.rb +104 -0
  6. data/capybara-3.40.0/lib/capybara/cucumber.rb +27 -0
  7. data/capybara-3.40.0/lib/capybara/driver/base.rb +178 -0
  8. data/capybara-3.40.0/lib/capybara/driver/node.rb +143 -0
  9. data/capybara-3.40.0/lib/capybara/dsl.rb +59 -0
  10. data/capybara-3.40.0/lib/capybara/helpers.rb +127 -0
  11. data/capybara-3.40.0/lib/capybara/minitest/spec.rb +279 -0
  12. data/capybara-3.40.0/lib/capybara/minitest.rb +398 -0
  13. data/capybara-3.40.0/lib/capybara/node/actions.rb +420 -0
  14. data/capybara-3.40.0/lib/capybara/node/base.rb +144 -0
  15. data/capybara-3.40.0/lib/capybara/node/document.rb +48 -0
  16. data/capybara-3.40.0/lib/capybara/node/document_matchers.rb +67 -0
  17. data/capybara-3.40.0/lib/capybara/node/element.rb +613 -0
  18. data/capybara-3.40.0/lib/capybara/node/finders.rb +335 -0
  19. data/capybara-3.40.0/lib/capybara/node/matchers.rb +908 -0
  20. data/capybara-3.40.0/lib/capybara/node/simple.rb +216 -0
  21. data/capybara-3.40.0/lib/capybara/node/whitespace_normalizer.rb +81 -0
  22. data/capybara-3.40.0/lib/capybara/queries/active_element_query.rb +18 -0
  23. data/capybara-3.40.0/lib/capybara/queries/ancestor_query.rb +28 -0
  24. data/capybara-3.40.0/lib/capybara/queries/base_query.rb +106 -0
  25. data/capybara-3.40.0/lib/capybara/queries/current_path_query.rb +61 -0
  26. data/capybara-3.40.0/lib/capybara/queries/match_query.rb +26 -0
  27. data/capybara-3.40.0/lib/capybara/queries/selector_query.rb +761 -0
  28. data/capybara-3.40.0/lib/capybara/queries/sibling_query.rb +27 -0
  29. data/capybara-3.40.0/lib/capybara/queries/style_query.rb +45 -0
  30. data/capybara-3.40.0/lib/capybara/queries/text_query.rb +116 -0
  31. data/capybara-3.40.0/lib/capybara/queries/title_query.rb +39 -0
  32. data/capybara-3.40.0/lib/capybara/rack_test/browser.rb +200 -0
  33. data/capybara-3.40.0/lib/capybara/rack_test/css_handlers.rb +13 -0
  34. data/capybara-3.40.0/lib/capybara/rack_test/driver.rb +110 -0
  35. data/capybara-3.40.0/lib/capybara/rack_test/errors.rb +6 -0
  36. data/capybara-3.40.0/lib/capybara/rack_test/form.rb +149 -0
  37. data/capybara-3.40.0/lib/capybara/rack_test/node.rb +324 -0
  38. data/capybara-3.40.0/lib/capybara/rails.rb +16 -0
  39. data/capybara-3.40.0/lib/capybara/registration_container.rb +41 -0
  40. data/capybara-3.40.0/lib/capybara/registrations/drivers.rb +42 -0
  41. data/capybara-3.40.0/lib/capybara/registrations/patches/puma_ssl.rb +29 -0
  42. data/capybara-3.40.0/lib/capybara/registrations/servers.rb +66 -0
  43. data/capybara-3.40.0/lib/capybara/result.rb +186 -0
  44. data/capybara-3.40.0/lib/capybara/rspec/features.rb +23 -0
  45. data/capybara-3.40.0/lib/capybara/rspec/matcher_proxies.rb +82 -0
  46. data/capybara-3.40.0/lib/capybara/rspec/matchers/base.rb +113 -0
  47. data/capybara-3.40.0/lib/capybara/rspec/matchers/become_closed.rb +33 -0
  48. data/capybara-3.40.0/lib/capybara/rspec/matchers/compound.rb +88 -0
  49. data/capybara-3.40.0/lib/capybara/rspec/matchers/count_sugar.rb +37 -0
  50. data/capybara-3.40.0/lib/capybara/rspec/matchers/have_ancestor.rb +28 -0
  51. data/capybara-3.40.0/lib/capybara/rspec/matchers/have_current_path.rb +29 -0
  52. data/capybara-3.40.0/lib/capybara/rspec/matchers/have_selector.rb +69 -0
  53. data/capybara-3.40.0/lib/capybara/rspec/matchers/have_sibling.rb +27 -0
  54. data/capybara-3.40.0/lib/capybara/rspec/matchers/have_text.rb +33 -0
  55. data/capybara-3.40.0/lib/capybara/rspec/matchers/have_title.rb +29 -0
  56. data/capybara-3.40.0/lib/capybara/rspec/matchers/match_selector.rb +27 -0
  57. data/capybara-3.40.0/lib/capybara/rspec/matchers/match_style.rb +43 -0
  58. data/capybara-3.40.0/lib/capybara/rspec/matchers/spatial_sugar.rb +39 -0
  59. data/capybara-3.40.0/lib/capybara/rspec/matchers.rb +207 -0
  60. data/capybara-3.40.0/lib/capybara/rspec.rb +31 -0
  61. data/capybara-3.40.0/lib/capybara/selector/builders/css_builder.rb +84 -0
  62. data/capybara-3.40.0/lib/capybara/selector/builders/xpath_builder.rb +71 -0
  63. data/capybara-3.40.0/lib/capybara/selector/css.rb +102 -0
  64. data/capybara-3.40.0/lib/capybara/selector/definition/button.rb +68 -0
  65. data/capybara-3.40.0/lib/capybara/selector/definition/checkbox.rb +26 -0
  66. data/capybara-3.40.0/lib/capybara/selector/definition/css.rb +10 -0
  67. data/capybara-3.40.0/lib/capybara/selector/definition/datalist_input.rb +35 -0
  68. data/capybara-3.40.0/lib/capybara/selector/definition/datalist_option.rb +25 -0
  69. data/capybara-3.40.0/lib/capybara/selector/definition/element.rb +28 -0
  70. data/capybara-3.40.0/lib/capybara/selector/definition/field.rb +40 -0
  71. data/capybara-3.40.0/lib/capybara/selector/definition/fieldset.rb +14 -0
  72. data/capybara-3.40.0/lib/capybara/selector/definition/file_field.rb +13 -0
  73. data/capybara-3.40.0/lib/capybara/selector/definition/fillable_field.rb +33 -0
  74. data/capybara-3.40.0/lib/capybara/selector/definition/frame.rb +17 -0
  75. data/capybara-3.40.0/lib/capybara/selector/definition/id.rb +6 -0
  76. data/capybara-3.40.0/lib/capybara/selector/definition/label.rb +62 -0
  77. data/capybara-3.40.0/lib/capybara/selector/definition/link.rb +55 -0
  78. data/capybara-3.40.0/lib/capybara/selector/definition/link_or_button.rb +16 -0
  79. data/capybara-3.40.0/lib/capybara/selector/definition/option.rb +27 -0
  80. data/capybara-3.40.0/lib/capybara/selector/definition/radio_button.rb +27 -0
  81. data/capybara-3.40.0/lib/capybara/selector/definition/select.rb +81 -0
  82. data/capybara-3.40.0/lib/capybara/selector/definition/table.rb +109 -0
  83. data/capybara-3.40.0/lib/capybara/selector/definition/table_row.rb +21 -0
  84. data/capybara-3.40.0/lib/capybara/selector/definition/xpath.rb +5 -0
  85. data/capybara-3.40.0/lib/capybara/selector/definition.rb +280 -0
  86. data/capybara-3.40.0/lib/capybara/selector/filter.rb +5 -0
  87. data/capybara-3.40.0/lib/capybara/selector/filter_set.rb +121 -0
  88. data/capybara-3.40.0/lib/capybara/selector/filters/base.rb +77 -0
  89. data/capybara-3.40.0/lib/capybara/selector/filters/expression_filter.rb +22 -0
  90. data/capybara-3.40.0/lib/capybara/selector/filters/locator_filter.rb +29 -0
  91. data/capybara-3.40.0/lib/capybara/selector/filters/node_filter.rb +31 -0
  92. data/capybara-3.40.0/lib/capybara/selector/regexp_disassembler.rb +211 -0
  93. data/capybara-3.40.0/lib/capybara/selector/selector.rb +159 -0
  94. data/capybara-3.40.0/lib/capybara/selector/xpath_extensions.rb +17 -0
  95. data/capybara-3.40.0/lib/capybara/selector.rb +494 -0
  96. data/capybara-3.40.0/lib/capybara/selenium/atoms/getAttribute.min.js +1 -0
  97. data/capybara-3.40.0/lib/capybara/selenium/atoms/isDisplayed.min.js +1 -0
  98. data/capybara-3.40.0/lib/capybara/selenium/atoms/src/getAttribute.js +161 -0
  99. data/capybara-3.40.0/lib/capybara/selenium/atoms/src/isDisplayed.js +454 -0
  100. data/capybara-3.40.0/lib/capybara/selenium/driver.rb +517 -0
  101. data/capybara-3.40.0/lib/capybara/selenium/driver_specializations/chrome_driver.rb +117 -0
  102. data/capybara-3.40.0/lib/capybara/selenium/driver_specializations/edge_driver.rb +128 -0
  103. data/capybara-3.40.0/lib/capybara/selenium/driver_specializations/firefox_driver.rb +84 -0
  104. data/capybara-3.40.0/lib/capybara/selenium/driver_specializations/internet_explorer_driver.rb +26 -0
  105. data/capybara-3.40.0/lib/capybara/selenium/driver_specializations/safari_driver.rb +24 -0
  106. data/capybara-3.40.0/lib/capybara/selenium/extensions/file_input_click_emulation.rb +34 -0
  107. data/capybara-3.40.0/lib/capybara/selenium/extensions/find.rb +110 -0
  108. data/capybara-3.40.0/lib/capybara/selenium/extensions/html5_drag.rb +229 -0
  109. data/capybara-3.40.0/lib/capybara/selenium/extensions/modifier_keys_stack.rb +28 -0
  110. data/capybara-3.40.0/lib/capybara/selenium/extensions/scroll.rb +76 -0
  111. data/capybara-3.40.0/lib/capybara/selenium/node.rb +636 -0
  112. data/capybara-3.40.0/lib/capybara/selenium/nodes/chrome_node.rb +125 -0
  113. data/capybara-3.40.0/lib/capybara/selenium/nodes/edge_node.rb +110 -0
  114. data/capybara-3.40.0/lib/capybara/selenium/nodes/firefox_node.rb +136 -0
  115. data/capybara-3.40.0/lib/capybara/selenium/nodes/ie_node.rb +22 -0
  116. data/capybara-3.40.0/lib/capybara/selenium/nodes/safari_node.rb +118 -0
  117. data/capybara-3.40.0/lib/capybara/selenium/patches/atoms.rb +18 -0
  118. data/capybara-3.40.0/lib/capybara/selenium/patches/is_displayed.rb +16 -0
  119. data/capybara-3.40.0/lib/capybara/selenium/patches/logs.rb +45 -0
  120. data/capybara-3.40.0/lib/capybara/selenium/patches/pause_duration_fix.rb +9 -0
  121. data/capybara-3.40.0/lib/capybara/selenium/patches/persistent_client.rb +20 -0
  122. data/capybara-3.40.0/lib/capybara/server/animation_disabler.rb +80 -0
  123. data/capybara-3.40.0/lib/capybara/server/checker.rb +44 -0
  124. data/capybara-3.40.0/lib/capybara/server/middleware.rb +71 -0
  125. data/capybara-3.40.0/lib/capybara/server.rb +126 -0
  126. data/capybara-3.40.0/lib/capybara/session/config.rb +128 -0
  127. data/capybara-3.40.0/lib/capybara/session/matchers.rb +87 -0
  128. data/capybara-3.40.0/lib/capybara/session.rb +951 -0
  129. data/capybara-3.40.0/lib/capybara/spec/fixtures/another_test_file.txt +1 -0
  130. data/capybara-3.40.0/lib/capybara/spec/fixtures/capybara.jpg +3 -0
  131. data/capybara-3.40.0/lib/capybara/spec/fixtures/no_extension +1 -0
  132. data/capybara-3.40.0/lib/capybara/spec/fixtures/test_file.txt +1 -0
  133. data/capybara-3.40.0/lib/capybara/spec/public/jquery-ui.js +13 -0
  134. data/capybara-3.40.0/lib/capybara/spec/public/jquery.js +5 -0
  135. data/capybara-3.40.0/lib/capybara/spec/public/offset.js +6 -0
  136. data/capybara-3.40.0/lib/capybara/spec/public/test.js +284 -0
  137. data/capybara-3.40.0/lib/capybara/spec/session/accept_alert_spec.rb +81 -0
  138. data/capybara-3.40.0/lib/capybara/spec/session/accept_confirm_spec.rb +32 -0
  139. data/capybara-3.40.0/lib/capybara/spec/session/accept_prompt_spec.rb +78 -0
  140. data/capybara-3.40.0/lib/capybara/spec/session/active_element_spec.rb +31 -0
  141. data/capybara-3.40.0/lib/capybara/spec/session/all_spec.rb +274 -0
  142. data/capybara-3.40.0/lib/capybara/spec/session/ancestor_spec.rb +88 -0
  143. data/capybara-3.40.0/lib/capybara/spec/session/assert_all_of_selectors_spec.rb +140 -0
  144. data/capybara-3.40.0/lib/capybara/spec/session/assert_current_path_spec.rb +75 -0
  145. data/capybara-3.40.0/lib/capybara/spec/session/assert_selector_spec.rb +143 -0
  146. data/capybara-3.40.0/lib/capybara/spec/session/assert_style_spec.rb +26 -0
  147. data/capybara-3.40.0/lib/capybara/spec/session/assert_text_spec.rb +258 -0
  148. data/capybara-3.40.0/lib/capybara/spec/session/assert_title_spec.rb +93 -0
  149. data/capybara-3.40.0/lib/capybara/spec/session/attach_file_spec.rb +222 -0
  150. data/capybara-3.40.0/lib/capybara/spec/session/body_spec.rb +23 -0
  151. data/capybara-3.40.0/lib/capybara/spec/session/check_spec.rb +251 -0
  152. data/capybara-3.40.0/lib/capybara/spec/session/choose_spec.rb +127 -0
  153. data/capybara-3.40.0/lib/capybara/spec/session/click_button_spec.rb +517 -0
  154. data/capybara-3.40.0/lib/capybara/spec/session/click_link_or_button_spec.rb +138 -0
  155. data/capybara-3.40.0/lib/capybara/spec/session/click_link_spec.rb +240 -0
  156. data/capybara-3.40.0/lib/capybara/spec/session/current_scope_spec.rb +31 -0
  157. data/capybara-3.40.0/lib/capybara/spec/session/current_url_spec.rb +125 -0
  158. data/capybara-3.40.0/lib/capybara/spec/session/dismiss_confirm_spec.rb +36 -0
  159. data/capybara-3.40.0/lib/capybara/spec/session/dismiss_prompt_spec.rb +21 -0
  160. data/capybara-3.40.0/lib/capybara/spec/session/element/assert_match_selector_spec.rb +38 -0
  161. data/capybara-3.40.0/lib/capybara/spec/session/element/match_css_spec.rb +31 -0
  162. data/capybara-3.40.0/lib/capybara/spec/session/element/match_xpath_spec.rb +25 -0
  163. data/capybara-3.40.0/lib/capybara/spec/session/element/matches_selector_spec.rb +120 -0
  164. data/capybara-3.40.0/lib/capybara/spec/session/evaluate_async_script_spec.rb +23 -0
  165. data/capybara-3.40.0/lib/capybara/spec/session/evaluate_script_spec.rb +49 -0
  166. data/capybara-3.40.0/lib/capybara/spec/session/execute_script_spec.rb +28 -0
  167. data/capybara-3.40.0/lib/capybara/spec/session/fill_in_spec.rb +292 -0
  168. data/capybara-3.40.0/lib/capybara/spec/session/find_button_spec.rb +74 -0
  169. data/capybara-3.40.0/lib/capybara/spec/session/find_by_id_spec.rb +33 -0
  170. data/capybara-3.40.0/lib/capybara/spec/session/find_field_spec.rb +113 -0
  171. data/capybara-3.40.0/lib/capybara/spec/session/find_link_spec.rb +80 -0
  172. data/capybara-3.40.0/lib/capybara/spec/session/find_spec.rb +545 -0
  173. data/capybara-3.40.0/lib/capybara/spec/session/first_spec.rb +156 -0
  174. data/capybara-3.40.0/lib/capybara/spec/session/frame/frame_title_spec.rb +23 -0
  175. data/capybara-3.40.0/lib/capybara/spec/session/frame/frame_url_spec.rb +23 -0
  176. data/capybara-3.40.0/lib/capybara/spec/session/frame/switch_to_frame_spec.rb +116 -0
  177. data/capybara-3.40.0/lib/capybara/spec/session/frame/within_frame_spec.rb +114 -0
  178. data/capybara-3.40.0/lib/capybara/spec/session/go_back_spec.rb +12 -0
  179. data/capybara-3.40.0/lib/capybara/spec/session/go_forward_spec.rb +14 -0
  180. data/capybara-3.40.0/lib/capybara/spec/session/has_all_selectors_spec.rb +69 -0
  181. data/capybara-3.40.0/lib/capybara/spec/session/has_ancestor_spec.rb +46 -0
  182. data/capybara-3.40.0/lib/capybara/spec/session/has_any_selectors_spec.rb +29 -0
  183. data/capybara-3.40.0/lib/capybara/spec/session/has_button_spec.rb +150 -0
  184. data/capybara-3.40.0/lib/capybara/spec/session/has_css_spec.rb +375 -0
  185. data/capybara-3.40.0/lib/capybara/spec/session/has_current_path_spec.rb +151 -0
  186. data/capybara-3.40.0/lib/capybara/spec/session/has_element_spec.rb +47 -0
  187. data/capybara-3.40.0/lib/capybara/spec/session/has_field_spec.rb +389 -0
  188. data/capybara-3.40.0/lib/capybara/spec/session/has_link_spec.rb +79 -0
  189. data/capybara-3.40.0/lib/capybara/spec/session/has_none_selectors_spec.rb +78 -0
  190. data/capybara-3.40.0/lib/capybara/spec/session/has_select_spec.rb +316 -0
  191. data/capybara-3.40.0/lib/capybara/spec/session/has_selector_spec.rb +217 -0
  192. data/capybara-3.40.0/lib/capybara/spec/session/has_sibling_spec.rb +50 -0
  193. data/capybara-3.40.0/lib/capybara/spec/session/has_table_spec.rb +209 -0
  194. data/capybara-3.40.0/lib/capybara/spec/session/has_text_spec.rb +375 -0
  195. data/capybara-3.40.0/lib/capybara/spec/session/has_title_spec.rb +71 -0
  196. data/capybara-3.40.0/lib/capybara/spec/session/has_xpath_spec.rb +149 -0
  197. data/capybara-3.40.0/lib/capybara/spec/session/headers_spec.rb +8 -0
  198. data/capybara-3.40.0/lib/capybara/spec/session/html_spec.rb +47 -0
  199. data/capybara-3.40.0/lib/capybara/spec/session/matches_style_spec.rb +37 -0
  200. data/capybara-3.40.0/lib/capybara/spec/session/node_spec.rb +1399 -0
  201. data/capybara-3.40.0/lib/capybara/spec/session/node_wrapper_spec.rb +39 -0
  202. data/capybara-3.40.0/lib/capybara/spec/session/refresh_spec.rb +34 -0
  203. data/capybara-3.40.0/lib/capybara/spec/session/reset_session_spec.rb +161 -0
  204. data/capybara-3.40.0/lib/capybara/spec/session/response_code_spec.rb +8 -0
  205. data/capybara-3.40.0/lib/capybara/spec/session/save_and_open_page_spec.rb +21 -0
  206. data/capybara-3.40.0/lib/capybara/spec/session/save_and_open_screenshot_spec.rb +43 -0
  207. data/capybara-3.40.0/lib/capybara/spec/session/save_page_spec.rb +110 -0
  208. data/capybara-3.40.0/lib/capybara/spec/session/save_screenshot_spec.rb +55 -0
  209. data/capybara-3.40.0/lib/capybara/spec/session/screenshot_spec.rb +18 -0
  210. data/capybara-3.40.0/lib/capybara/spec/session/scroll_spec.rb +119 -0
  211. data/capybara-3.40.0/lib/capybara/spec/session/select_spec.rb +229 -0
  212. data/capybara-3.40.0/lib/capybara/spec/session/selectors_spec.rb +98 -0
  213. data/capybara-3.40.0/lib/capybara/spec/session/sibling_spec.rb +52 -0
  214. data/capybara-3.40.0/lib/capybara/spec/session/text_spec.rb +74 -0
  215. data/capybara-3.40.0/lib/capybara/spec/session/title_spec.rb +29 -0
  216. data/capybara-3.40.0/lib/capybara/spec/session/uncheck_spec.rb +100 -0
  217. data/capybara-3.40.0/lib/capybara/spec/session/unselect_spec.rb +116 -0
  218. data/capybara-3.40.0/lib/capybara/spec/session/visit_spec.rb +224 -0
  219. data/capybara-3.40.0/lib/capybara/spec/session/window/become_closed_spec.rb +89 -0
  220. data/capybara-3.40.0/lib/capybara/spec/session/window/current_window_spec.rb +28 -0
  221. data/capybara-3.40.0/lib/capybara/spec/session/window/open_new_window_spec.rb +31 -0
  222. data/capybara-3.40.0/lib/capybara/spec/session/window/switch_to_window_spec.rb +132 -0
  223. data/capybara-3.40.0/lib/capybara/spec/session/window/window_opened_by_spec.rb +99 -0
  224. data/capybara-3.40.0/lib/capybara/spec/session/window/window_spec.rb +203 -0
  225. data/capybara-3.40.0/lib/capybara/spec/session/window/windows_spec.rb +34 -0
  226. data/capybara-3.40.0/lib/capybara/spec/session/window/within_window_spec.rb +157 -0
  227. data/capybara-3.40.0/lib/capybara/spec/session/within_spec.rb +212 -0
  228. data/capybara-3.40.0/lib/capybara/spec/spec_helper.rb +141 -0
  229. data/capybara-3.40.0/lib/capybara/spec/test_app.rb +305 -0
  230. data/capybara-3.40.0/lib/capybara/spec/views/animated.erb +49 -0
  231. data/capybara-3.40.0/lib/capybara/spec/views/buttons.erb +5 -0
  232. data/capybara-3.40.0/lib/capybara/spec/views/fieldsets.erb +30 -0
  233. data/capybara-3.40.0/lib/capybara/spec/views/form.erb +738 -0
  234. data/capybara-3.40.0/lib/capybara/spec/views/frame_child.erb +18 -0
  235. data/capybara-3.40.0/lib/capybara/spec/views/frame_one.erb +10 -0
  236. data/capybara-3.40.0/lib/capybara/spec/views/frame_parent.erb +9 -0
  237. data/capybara-3.40.0/lib/capybara/spec/views/frame_two.erb +9 -0
  238. data/capybara-3.40.0/lib/capybara/spec/views/header_links.erb +8 -0
  239. data/capybara-3.40.0/lib/capybara/spec/views/host_links.erb +13 -0
  240. data/capybara-3.40.0/lib/capybara/spec/views/initial_alert.erb +11 -0
  241. data/capybara-3.40.0/lib/capybara/spec/views/layout.erb +10 -0
  242. data/capybara-3.40.0/lib/capybara/spec/views/obscured.erb +47 -0
  243. data/capybara-3.40.0/lib/capybara/spec/views/offset.erb +33 -0
  244. data/capybara-3.40.0/lib/capybara/spec/views/path.erb +13 -0
  245. data/capybara-3.40.0/lib/capybara/spec/views/popup_one.erb +9 -0
  246. data/capybara-3.40.0/lib/capybara/spec/views/popup_two.erb +9 -0
  247. data/capybara-3.40.0/lib/capybara/spec/views/postback.erb +14 -0
  248. data/capybara-3.40.0/lib/capybara/spec/views/react.erb +45 -0
  249. data/capybara-3.40.0/lib/capybara/spec/views/scroll.erb +21 -0
  250. data/capybara-3.40.0/lib/capybara/spec/views/spatial.erb +31 -0
  251. data/capybara-3.40.0/lib/capybara/spec/views/tables.erb +130 -0
  252. data/capybara-3.40.0/lib/capybara/spec/views/with_animation.erb +81 -0
  253. data/capybara-3.40.0/lib/capybara/spec/views/with_base_tag.erb +11 -0
  254. data/capybara-3.40.0/lib/capybara/spec/views/with_count.erb +8 -0
  255. data/capybara-3.40.0/lib/capybara/spec/views/with_dragula.erb +24 -0
  256. data/capybara-3.40.0/lib/capybara/spec/views/with_fixed_header_footer.erb +18 -0
  257. data/capybara-3.40.0/lib/capybara/spec/views/with_hover.erb +24 -0
  258. data/capybara-3.40.0/lib/capybara/spec/views/with_hover1.erb +10 -0
  259. data/capybara-3.40.0/lib/capybara/spec/views/with_html.erb +210 -0
  260. data/capybara-3.40.0/lib/capybara/spec/views/with_html5_svg.erb +20 -0
  261. data/capybara-3.40.0/lib/capybara/spec/views/with_html_entities.erb +2 -0
  262. data/capybara-3.40.0/lib/capybara/spec/views/with_jquery_animation.erb +24 -0
  263. data/capybara-3.40.0/lib/capybara/spec/views/with_js.erb +162 -0
  264. data/capybara-3.40.0/lib/capybara/spec/views/with_jstree.erb +26 -0
  265. data/capybara-3.40.0/lib/capybara/spec/views/with_namespace.erb +21 -0
  266. data/capybara-3.40.0/lib/capybara/spec/views/with_scope.erb +42 -0
  267. data/capybara-3.40.0/lib/capybara/spec/views/with_scope_other.erb +6 -0
  268. data/capybara-3.40.0/lib/capybara/spec/views/with_shadow.erb +31 -0
  269. data/capybara-3.40.0/lib/capybara/spec/views/with_simple_html.erb +2 -0
  270. data/capybara-3.40.0/lib/capybara/spec/views/with_slow_unload.erb +18 -0
  271. data/capybara-3.40.0/lib/capybara/spec/views/with_sortable_js.erb +21 -0
  272. data/capybara-3.40.0/lib/capybara/spec/views/with_unload_alert.erb +15 -0
  273. data/capybara-3.40.0/lib/capybara/spec/views/with_windows.erb +54 -0
  274. data/capybara-3.40.0/lib/capybara/spec/views/within_frames.erb +15 -0
  275. data/capybara-3.40.0/lib/capybara/version.rb +5 -0
  276. data/capybara-3.40.0/lib/capybara/window.rb +142 -0
  277. data/capybara-3.40.0/lib/capybara.rb +521 -0
  278. data/capybara-3.40.0/spec/basic_node_spec.rb +168 -0
  279. data/capybara-3.40.0/spec/capybara_spec.rb +124 -0
  280. data/capybara-3.40.0/spec/counter_spec.rb +35 -0
  281. data/capybara-3.40.0/spec/css_builder_spec.rb +101 -0
  282. data/capybara-3.40.0/spec/css_splitter_spec.rb +38 -0
  283. data/capybara-3.40.0/spec/dsl_spec.rb +291 -0
  284. data/capybara-3.40.0/spec/filter_set_spec.rb +46 -0
  285. data/capybara-3.40.0/spec/fixtures/capybara.csv +1 -0
  286. data/capybara-3.40.0/spec/fixtures/certificate.pem +25 -0
  287. data/capybara-3.40.0/spec/fixtures/key.pem +27 -0
  288. data/capybara-3.40.0/spec/fixtures/selenium_driver_rspec_failure.rb +13 -0
  289. data/capybara-3.40.0/spec/fixtures/selenium_driver_rspec_success.rb +13 -0
  290. data/capybara-3.40.0/spec/minitest_spec.rb +175 -0
  291. data/capybara-3.40.0/spec/minitest_spec_spec.rb +166 -0
  292. data/capybara-3.40.0/spec/per_session_config_spec.rb +68 -0
  293. data/capybara-3.40.0/spec/rack_test_spec.rb +297 -0
  294. data/capybara-3.40.0/spec/regexp_dissassembler_spec.rb +250 -0
  295. data/capybara-3.40.0/spec/result_spec.rb +202 -0
  296. data/capybara-3.40.0/spec/rspec/features_spec.rb +101 -0
  297. data/capybara-3.40.0/spec/rspec/scenarios_spec.rb +23 -0
  298. data/capybara-3.40.0/spec/rspec/shared_spec_matchers.rb +983 -0
  299. data/capybara-3.40.0/spec/rspec/views_spec.rb +14 -0
  300. data/capybara-3.40.0/spec/rspec_matchers_spec.rb +87 -0
  301. data/capybara-3.40.0/spec/rspec_spec.rb +149 -0
  302. data/capybara-3.40.0/spec/sauce_spec_chrome.rb +43 -0
  303. data/capybara-3.40.0/spec/selector_spec.rb +528 -0
  304. data/capybara-3.40.0/spec/selenium_spec_chrome.rb +209 -0
  305. data/capybara-3.40.0/spec/selenium_spec_chrome_remote.rb +96 -0
  306. data/capybara-3.40.0/spec/selenium_spec_edge.rb +60 -0
  307. data/capybara-3.40.0/spec/selenium_spec_firefox.rb +228 -0
  308. data/capybara-3.40.0/spec/selenium_spec_firefox_remote.rb +94 -0
  309. data/capybara-3.40.0/spec/selenium_spec_ie.rb +149 -0
  310. data/capybara-3.40.0/spec/selenium_spec_safari.rb +162 -0
  311. data/capybara-3.40.0/spec/server_spec.rb +315 -0
  312. data/capybara-3.40.0/spec/session_spec.rb +91 -0
  313. data/capybara-3.40.0/spec/shared_selenium_node.rb +79 -0
  314. data/capybara-3.40.0/spec/shared_selenium_session.rb +566 -0
  315. data/capybara-3.40.0/spec/spec_helper.rb +133 -0
  316. data/capybara-3.40.0/spec/whitespace_normalizer_spec.rb +54 -0
  317. data/capybara-3.40.0/spec/xpath_builder_spec.rb +93 -0
  318. data/mega-max-rb.gemspec +12 -0
  319. metadata +358 -0
@@ -0,0 +1,528 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'spec_helper'
4
+
5
+ RSpec.describe Capybara do
6
+ include Capybara::RSpecMatchers
7
+ describe 'Selectors' do
8
+ let :string do
9
+ described_class.string <<-STRING
10
+ <html>
11
+ <head>
12
+ <title>selectors</title>
13
+ </head>
14
+ <body>
15
+ <div class="aa" id="page">
16
+ <div class="bb" id="content">
17
+ <h1 class="aa">Totally awesome</h1>
18
+ <p>Yes it is</p>
19
+ </div>
20
+ <p class="bb cc">Some Content</p>
21
+ <p class="bb dd !mine"></p>
22
+ </div>
23
+ <div id="#special">
24
+ </div>
25
+ <div class="some random words" id="random_words">
26
+ Something
27
+ </div>
28
+ <input id="2checkbox" class="2checkbox" type="checkbox"/>
29
+ <input type="radio"/>
30
+ <label for="my_text_input">My Text Input</label>
31
+ <input type="text" name="form[my_text_input]" placeholder="my text" id="my_text_input"/>
32
+ <input type="file" id="file" class=".special file"/>
33
+ <input type="hidden" id="hidden_field" value="this is hidden"/>
34
+ <input type="submit" value="click me" title="submit button"/>
35
+ <input type="button" value="don't click me" title="Other button 1" style="line-height: 30px;"/>
36
+ <a href="#">link</a>
37
+ <fieldset></fieldset>
38
+ <select id="select">
39
+ <option value="a">A</option>
40
+ <option value="b" disabled>B</option>
41
+ <option value="c" selected>C</option>
42
+ </select>
43
+ <table>
44
+ <tr><td></td></tr>
45
+ </table>
46
+ <table id="rows">
47
+ <tr>
48
+ <td>A</td><td>B</td><td>C</td>
49
+ </tr>
50
+ <tr>
51
+ <td>D</td><td>E</td><td>F</td>
52
+ </tr>
53
+ </table>
54
+ <table id="cols">
55
+ <tbody>
56
+ <tr>
57
+ <td>A</td><td>D</td>
58
+ </tr>
59
+ <tr>
60
+ <td>B</td><td>E</td>
61
+ </tr>
62
+ <tr>
63
+ <td>C</td><td>F</td>
64
+ </tr>
65
+ </tbody>
66
+ </table>
67
+ </body>
68
+ </html>
69
+ STRING
70
+ end
71
+
72
+ before do
73
+ described_class.add_selector :custom_selector do
74
+ css { |css_class| "div.#{css_class}" }
75
+ node_filter(:not_empty, boolean: true, default: true, skip_if: :all) { |node, value| value ^ (node.text == '') }
76
+ end
77
+
78
+ described_class.add_selector :custom_css_selector do
79
+ css(:name, :other_name) do |selector, name: nil, **|
80
+ selector ||= ''
81
+ selector += "[name='#{name}']" if name
82
+ selector
83
+ end
84
+
85
+ expression_filter(:placeholder) do |expr, val|
86
+ expr + "[placeholder='#{val}']"
87
+ end
88
+
89
+ expression_filter(:value) do |expr, val|
90
+ expr + "[value='#{val}']"
91
+ end
92
+
93
+ expression_filter(:title) do |expr, val|
94
+ expr + "[title='#{val}']"
95
+ end
96
+ end
97
+
98
+ described_class.add_selector :custom_xpath_selector do
99
+ xpath(:valid1, :valid2) { |selector| selector }
100
+ match { |value| value == 'match_me' }
101
+ end
102
+ end
103
+
104
+ it 'supports `filter` as an alias for `node_filter`' do
105
+ expect do
106
+ described_class.add_selector :filter_alias_selector do
107
+ css { |_unused| 'div' }
108
+ filter(:something) { |_node, _value| true }
109
+ end
110
+ end.not_to raise_error
111
+ end
112
+
113
+ describe 'adding a selector' do
114
+ it 'can set default visibility' do
115
+ described_class.add_selector :hidden_field do
116
+ visible :hidden
117
+ css { |_sel| 'input[type="hidden"]' }
118
+ end
119
+
120
+ expect(string).to have_no_css('input[type="hidden"]') # rubocop:disable Capybara/SpecificMatcher
121
+ expect(string).to have_selector(:hidden_field)
122
+ end
123
+ end
124
+
125
+ describe 'modify_selector' do
126
+ it 'allows modifying a selector' do
127
+ el = string.find(:custom_selector, 'aa')
128
+ expect(el.tag_name).to eq 'div'
129
+ described_class.modify_selector :custom_selector do
130
+ css { |css_class| "h1.#{css_class}" }
131
+ end
132
+ el = string.find(:custom_selector, 'aa')
133
+ expect(el.tag_name).to eq 'h1'
134
+ end
135
+
136
+ it "doesn't change existing filters" do
137
+ described_class.modify_selector :custom_selector do
138
+ css { |css_class| "p.#{css_class}" }
139
+ end
140
+ expect(string).to have_selector(:custom_selector, 'bb', count: 1)
141
+ expect(string).to have_selector(:custom_selector, 'bb', not_empty: false, count: 1)
142
+ expect(string).to have_selector(:custom_selector, 'bb', not_empty: :all, count: 2)
143
+ end
144
+ end
145
+
146
+ describe '::[]' do
147
+ it 'can find a selector' do
148
+ expect(Capybara::Selector[:field]).not_to be_nil
149
+ end
150
+
151
+ it 'raises if no selector found' do
152
+ expect { Capybara::Selector[:no_exist] }.to raise_error(ArgumentError, /Unknown selector type/)
153
+ end
154
+ end
155
+
156
+ describe '::for' do
157
+ it 'finds selector that matches the locator' do
158
+ expect(Capybara::Selector.for('match_me').name).to eq :custom_xpath_selector
159
+ end
160
+
161
+ it 'returns nil if no match' do
162
+ expect(Capybara::Selector.for('nothing')).to be_nil
163
+ end
164
+ end
165
+
166
+ describe 'xpath' do
167
+ it 'uses filter names passed in' do
168
+ described_class.add_selector :test do
169
+ xpath(:something, :other) { |_locator| XPath.descendant }
170
+ end
171
+ selector = Capybara::Selector.new :test, config: nil, format: nil
172
+
173
+ expect(selector.expression_filters.keys).to include(:something, :other)
174
+ end
175
+
176
+ it 'gets filter names from block if none passed to xpath method' do
177
+ described_class.add_selector :test do
178
+ xpath { |_locator, valid3:, valid4: nil| "#{valid3} #{valid4}" }
179
+ end
180
+ selector = Capybara::Selector.new :test, config: nil, format: nil
181
+
182
+ expect(selector.expression_filters.keys).to include(:valid3, :valid4)
183
+ end
184
+
185
+ it 'ignores block parameters if names passed in' do
186
+ described_class.add_selector :test do
187
+ xpath(:valid1) { |_locator, valid3:, valid4: nil| "#{valid3} #{valid4}" }
188
+ end
189
+ selector = Capybara::Selector.new :test, config: nil, format: nil
190
+
191
+ expect(selector.expression_filters.keys).to include(:valid1)
192
+ expect(selector.expression_filters.keys).not_to include(:valid3, :valid4)
193
+ end
194
+ end
195
+
196
+ describe 'css' do
197
+ it "supports filters specified in 'css' definition" do
198
+ expect(string).to have_selector(:custom_css_selector, 'input', name: 'form[my_text_input]')
199
+ expect(string).to have_no_selector(:custom_css_selector, 'input', name: 'form[not_my_text_input]')
200
+ end
201
+
202
+ it 'supports explicitly defined expression filters' do
203
+ expect(string).to have_selector(:custom_css_selector, placeholder: 'my text')
204
+ expect(string).to have_no_selector(:custom_css_selector, placeholder: 'not my text')
205
+ expect(string).to have_selector(:custom_css_selector, value: 'click me', title: 'submit button')
206
+ end
207
+
208
+ it 'uses filter names passed in' do
209
+ described_class.add_selector :test do
210
+ css(:name, :other_name) { |_locator| '' }
211
+ end
212
+ selector = Capybara::Selector.new :test, config: nil, format: nil
213
+
214
+ expect(selector.expression_filters.keys).to include(:name, :other_name)
215
+ end
216
+
217
+ it 'gets filter names from block if none passed to css method' do
218
+ described_class.add_selector :test do
219
+ css { |_locator, valid3:, valid4: nil| "#{valid3} #{valid4}" }
220
+ end
221
+ selector = Capybara::Selector.new :test, config: nil, format: nil
222
+
223
+ expect(selector.expression_filters.keys).to include(:valid3, :valid4)
224
+ end
225
+
226
+ it 'ignores block parameters if names passed in' do
227
+ described_class.add_selector :test do
228
+ css(:valid1) { |_locator, valid3:, valid4: nil| "#{valid3} #{valid4}" }
229
+ end
230
+ selector = Capybara::Selector.new :test, config: nil, format: nil
231
+
232
+ expect(selector.expression_filters.keys).to include(:valid1)
233
+ expect(selector.expression_filters.keys).not_to include(:valid3, :valid4)
234
+ end
235
+ end
236
+
237
+ describe 'builtin selectors' do
238
+ context 'when locator is nil' do
239
+ it 'devolves to just finding element types' do
240
+ selectors = {
241
+ field: ".//*[self::input | self::textarea | self::select][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'hidden')]",
242
+ fieldset: './/fieldset',
243
+ link: './/a[./@href]',
244
+ link_or_button: ".//a[./@href] | .//input[./@type = 'submit' or ./@type = 'reset' or ./@type = 'image' or ./@type = 'button'] | .//button",
245
+ fillable_field: ".//*[self::input | self::textarea][not(./@type = 'submit' or ./@type = 'image' or ./@type = 'radio' or ./@type = 'checkbox' or ./@type = 'hidden' or ./@type = 'file')]",
246
+ radio_button: ".//input[./@type = 'radio']",
247
+ checkbox: ".//input[./@type = 'checkbox']",
248
+ select: './/select',
249
+ option: './/option',
250
+ file_field: ".//input[./@type = 'file']",
251
+ table: './/table'
252
+ }
253
+ selectors.each do |selector, xpath|
254
+ results = string.all(selector, nil).to_a.map(&:native)
255
+ expect(results.size).to be > 0
256
+ expect(results).to eq string.all(:xpath, xpath).to_a.map(&:native)
257
+ end
258
+ end
259
+ end
260
+
261
+ context 'with :id option' do
262
+ it 'works with compound css selectors' do
263
+ expect(string.all(:custom_css_selector, 'div, h1', id: 'page').size).to eq 1
264
+ expect(string.all(:custom_css_selector, 'h1, div', id: 'page').size).to eq 1
265
+ end
266
+
267
+ it "works with 'special' characters" do
268
+ expect(string.find(:custom_css_selector, 'div', id: '#special')[:id]).to eq '#special'
269
+ expect(string.find(:custom_css_selector, 'input', id: '2checkbox')[:id]).to eq '2checkbox'
270
+ end
271
+
272
+ it 'accepts XPath expression for xpath based selectors' do
273
+ expect(string.find(:custom_xpath_selector, './/div', id: XPath.contains('peci'))[:id]).to eq '#special'
274
+ expect(string.find(:custom_xpath_selector, './/input', id: XPath.ends_with('box'))[:id]).to eq '2checkbox'
275
+ end
276
+
277
+ it 'errors XPath expression for CSS based selectors' do
278
+ expect { string.find(:custom_css_selector, 'div', id: XPath.contains('peci')) }
279
+ .to raise_error(ArgumentError, /not supported/)
280
+ end
281
+
282
+ it 'accepts Regexp for xpath based selectors' do
283
+ expect(string.find(:custom_xpath_selector, './/div', id: /peci/)[:id]).to eq '#special'
284
+ expect(string.find(:custom_xpath_selector, './/div', id: /pEcI/i)[:id]).to eq '#special'
285
+ end
286
+
287
+ it 'accepts Regexp for css based selectors' do
288
+ expect(string.find(:custom_css_selector, 'div', id: /sp.*al/)[:id]).to eq '#special'
289
+ end
290
+ end
291
+
292
+ context 'with :class option' do
293
+ it 'works with compound css selectors' do
294
+ expect(string.all(:custom_css_selector, 'div, h1', class: 'aa').size).to eq 2
295
+ expect(string.all(:custom_css_selector, 'h1, div', class: 'aa').size).to eq 2
296
+ end
297
+
298
+ it 'handles negated classes' do
299
+ expect(string.all(:custom_css_selector, 'div, p', class: ['bb', '!cc']).size).to eq 2
300
+ expect(string.all(:custom_css_selector, 'div, p', class: ['!cc', '!dd', 'bb']).size).to eq 1
301
+ expect(string.all(:custom_xpath_selector, XPath.descendant(:div, :p), class: ['bb', '!cc']).size).to eq 2
302
+ expect(string.all(:custom_xpath_selector, XPath.descendant(:div, :p), class: ['!cc', '!dd', 'bb']).size).to eq 1
303
+ end
304
+
305
+ it 'handles classes starting with ! by requiring negated negated first' do
306
+ expect(string.all(:custom_css_selector, 'div, p', class: ['!!!mine']).size).to eq 1
307
+ expect(string.all(:custom_xpath_selector, XPath.descendant(:div, :p), class: ['!!!mine']).size).to eq 1
308
+ end
309
+
310
+ it "works with 'special' characters" do
311
+ expect(string.find(:custom_css_selector, 'input', class: '.special')[:id]).to eq 'file'
312
+ expect(string.find(:custom_css_selector, 'input', class: '2checkbox')[:id]).to eq '2checkbox'
313
+ end
314
+
315
+ it 'accepts XPath expression for xpath based selectors' do
316
+ expect(string.find(:custom_xpath_selector, './/div', class: XPath.contains('dom wor'))[:id]).to eq 'random_words'
317
+ expect(string.find(:custom_xpath_selector, './/div', class: XPath.ends_with('words'))[:id]).to eq 'random_words'
318
+ end
319
+
320
+ it 'errors XPath expression for CSS based selectors' do
321
+ expect { string.find(:custom_css_selector, 'div', class: XPath.contains('random')) }
322
+ .to raise_error(ArgumentError, /not supported/)
323
+ end
324
+
325
+ it 'accepts Regexp for XPath based selectors' do
326
+ expect(string.find(:custom_xpath_selector, './/div', class: /dom wor/)[:id]).to eq 'random_words'
327
+ expect(string.find(:custom_xpath_selector, './/div', class: /dOm WoR/i)[:id]).to eq 'random_words'
328
+ end
329
+
330
+ it 'accepts Regexp for CSS based selectors' do
331
+ expect(string.find(:custom_css_selector, 'div', class: /random/)[:id]).to eq 'random_words'
332
+ end
333
+
334
+ it 'accepts Regexp for individual class names for XPath based selectors' do
335
+ expect(string.find(:custom_xpath_selector, './/div', class: [/random/, 'some'])[:id]).to eq 'random_words'
336
+ expect(string.find(:custom_xpath_selector, './/div', class: [/om/, /wor/])[:id]).to eq 'random_words'
337
+ expect { string.find(:custom_xpath_selector, './/div', class: [/not/, /wor/]) }.to raise_error(Capybara::ElementNotFound)
338
+ expect { string.find(:custom_xpath_selector, './/div', class: [/dom wor/]) }.to raise_error(Capybara::ElementNotFound)
339
+ end
340
+
341
+ it 'accepts Regexp for individual class names for CSS based selectors' do
342
+ expect(string.find(:custom_css_selector, 'div', class: [/random/])[:id]).to eq 'random_words'
343
+ expect(string.find(:custom_css_selector, 'div', class: [/om/, /wor/, 'some'])[:id]).to eq 'random_words'
344
+ expect { string.find(:custom_css_selector, 'div', class: [/not/, /wor/]) }.to raise_error(Capybara::ElementNotFound)
345
+ expect { string.find(:custom_css_selector, 'div', class: [/dom wor/]) }.to raise_error(Capybara::ElementNotFound)
346
+ end
347
+ end
348
+
349
+ context 'with :style option' do
350
+ it 'accepts string for CSS based selectors' do
351
+ expect(string.find(:custom_css_selector, 'input', style: 'line-height: 30px;')[:title]).to eq 'Other button 1'
352
+ end
353
+
354
+ it 'accepts Regexp for CSS base selectors' do
355
+ expect(string.find(:custom_css_selector, 'input', style: /30px/)[:title]).to eq 'Other button 1'
356
+ end
357
+ end
358
+
359
+ # :css, :xpath, :id, :field, :fieldset, :link, :button, :link_or_button, :fillable_field, :radio_button, :checkbox, :select,
360
+ # :option, :file_field, :label, :table, :frame
361
+
362
+ describe ':css selector' do
363
+ it 'finds by CSS locator' do
364
+ expect(string.find(:css, 'input#my_text_input')[:name]).to eq 'form[my_text_input]'
365
+ end
366
+ end
367
+
368
+ describe ':xpath selector' do
369
+ it 'finds by XPath locator' do
370
+ expect(string.find(:xpath, './/input[@id="my_text_input"]')[:name]).to eq 'form[my_text_input]'
371
+ end
372
+ end
373
+
374
+ describe ':id selector' do
375
+ it 'finds by locator' do
376
+ expect(string.find(:id, 'my_text_input')[:name]).to eq 'form[my_text_input]'
377
+ expect(string.find(:id, /my_text_input/)[:name]).to eq 'form[my_text_input]'
378
+ expect(string.find(:id, /_text_/)[:name]).to eq 'form[my_text_input]'
379
+ expect(string.find(:id, /i[nmo]/)[:name]).to eq 'form[my_text_input]'
380
+ end
381
+ end
382
+
383
+ describe ':field selector' do
384
+ it 'finds by locator' do
385
+ expect(string.find(:field, 'My Text Input')[:id]).to eq 'my_text_input'
386
+ expect(string.find(:field, 'my_text_input')[:id]).to eq 'my_text_input'
387
+ expect(string.find(:field, 'form[my_text_input]')[:id]).to eq 'my_text_input'
388
+ end
389
+
390
+ it 'finds by id string' do
391
+ expect(string.find(:field, id: 'my_text_input')[:name]).to eq 'form[my_text_input]'
392
+ end
393
+
394
+ it 'finds by id regexp' do
395
+ expect(string.find(:field, id: /my_text_inp/)[:name]).to eq 'form[my_text_input]'
396
+ end
397
+
398
+ it 'finds by name' do
399
+ expect(string.find(:field, name: 'form[my_text_input]')[:id]).to eq 'my_text_input'
400
+ end
401
+
402
+ it 'finds by placeholder' do
403
+ expect(string.find(:field, placeholder: 'my text')[:id]).to eq 'my_text_input'
404
+ end
405
+
406
+ it 'finds by type' do
407
+ expect(string.find(:field, type: 'file')[:id]).to eq 'file'
408
+ expect(string.find(:field, type: 'select')[:id]).to eq 'select'
409
+ end
410
+ end
411
+
412
+ describe ':option selector' do
413
+ it 'finds disabled options' do
414
+ expect(string.find(:option, disabled: true).value).to eq 'b'
415
+ end
416
+
417
+ it 'finds selected options' do
418
+ expect(string.find(:option, selected: true).value).to eq 'c'
419
+ end
420
+
421
+ it 'finds not selected and not disabled options' do
422
+ expect(string.find(:option, disabled: false, selected: false).value).to eq 'a'
423
+ end
424
+ end
425
+
426
+ describe ':button selector' do
427
+ it 'finds by value' do
428
+ expect(string.find(:button, 'click me').value).to eq 'click me'
429
+ end
430
+
431
+ it 'finds by title' do
432
+ expect(string.find(:button, 'submit button').value).to eq 'click me'
433
+ end
434
+
435
+ it 'includes non-matching parameters in failure message' do
436
+ expect { string.find(:button, 'click me', title: 'click me') }.to raise_error(/with title click me/)
437
+ end
438
+ end
439
+
440
+ describe ':element selector' do
441
+ it 'finds by any attributes' do
442
+ expect(string.find(:element, 'input', type: 'submit').value).to eq 'click me'
443
+ end
444
+
445
+ it 'supports regexp matching' do
446
+ expect(string.find(:element, 'input', type: /sub/).value).to eq 'click me'
447
+ expect(string.find(:element, 'input', title: /sub\w.*button/).value).to eq 'click me'
448
+ expect(string.find(:element, 'input', title: /sub.* b.*ton/).value).to eq 'click me'
449
+ expect(string.find(:element, 'input', title: /sub.*mit.*/).value).to eq 'click me'
450
+ expect(string.find(:element, 'input', title: /^submit button$/).value).to eq 'click me'
451
+ expect(string.find(:element, 'input', title: /^(?:submit|other) button$/).value).to eq 'click me'
452
+ expect(string.find(:element, 'input', title: /SuB.*mIt/i).value).to eq 'click me'
453
+ expect(string.find(:element, 'input', title: /^Su.*Bm.*It/i).value).to eq 'click me'
454
+ expect(string.find(:element, 'input', title: /^Ot.*he.*r b.*\d/i).value).to eq "don't click me"
455
+ end
456
+
457
+ it 'still works with system keys' do
458
+ expect { string.all(:element, 'input', type: 'submit', count: 1) }.not_to raise_error
459
+ end
460
+
461
+ it 'works without element type' do
462
+ expect(string.find(:element, type: 'submit').value).to eq 'click me'
463
+ end
464
+
465
+ it 'validates attribute presence when true' do
466
+ expect(string.find(:element, name: true)[:id]).to eq 'my_text_input'
467
+ end
468
+
469
+ it 'validates attribute absence when false' do
470
+ expect(string.find(:element, 'option', disabled: false, selected: false).value).to eq 'a'
471
+ end
472
+
473
+ it 'includes wildcarded keys in description' do
474
+ expect { string.all(:element, 'input', not_there: 'bad', presence: true, absence: false, count: 1) }
475
+ .to(raise_error do |e|
476
+ expect(e).to be_a(Capybara::ElementNotFound)
477
+ expect(e.message).to include 'not_there => bad'
478
+ expect(e.message).to include 'with presence attribute'
479
+ expect(e.message).to include 'without absence attribute'
480
+ expect(e.message).not_to include 'count 1'
481
+ end)
482
+ end
483
+
484
+ it 'accepts XPath::Expression' do
485
+ expect(string.find(:element, 'input', type: XPath.starts_with('subm')).value).to eq 'click me'
486
+ expect(string.find(:element, 'input', type: XPath.ends_with('ext'))[:type]).to eq 'text'
487
+ expect(string.find(:element, 'input', type: XPath.contains('ckb'))[:type]).to eq 'checkbox'
488
+ expect(string.find(:element, 'input', title: XPath.contains_word('submit'))[:type]).to eq 'submit'
489
+ expect(string.find(:element, 'input', title: XPath.contains_word('button 1'))[:type]).to eq 'button'
490
+ end
491
+ end
492
+
493
+ describe ':link_or_button selector' do
494
+ around do |example|
495
+ described_class.modify_selector(:link_or_button) do
496
+ expression_filter(:random) { |xpath, _| xpath } # do nothing filter
497
+ end
498
+ example.run
499
+ Capybara::Selector[:link_or_button].expression_filters.delete(:random)
500
+ end
501
+
502
+ it 'should not find links when disabled == true' do
503
+ expect(string.all(:link_or_button, disabled: true).size).to eq 0
504
+ end
505
+
506
+ context 'when modified' do
507
+ it 'should still work' do
508
+ filter = Capybara::Selector[:link_or_button].expression_filters[:random]
509
+ allow(filter).to receive(:apply_filter).and_call_original
510
+
511
+ expect(string.find(:link_or_button, 'click me', random: 'blah').value).to eq 'click me'
512
+ expect(filter).to have_received(:apply_filter).with(anything, :random, 'blah', anything)
513
+ end
514
+ end
515
+ end
516
+
517
+ describe ':table selector' do
518
+ it 'finds by rows' do
519
+ expect(string.find(:table, with_rows: [%w[D E F]])[:id]).to eq 'rows'
520
+ end
521
+
522
+ it 'finds by columns' do
523
+ expect(string.find(:table, with_cols: [%w[A B C]])[:id]).to eq 'cols'
524
+ end
525
+ end
526
+ end
527
+ end
528
+ end