watir 1.4.1 → 7.3.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 (422) hide show
  1. checksums.yaml +7 -0
  2. data/.document +4 -0
  3. data/.github/ISSUE_TEMPLATE.md +16 -0
  4. data/.github/workflows/chrome.yml +55 -0
  5. data/.github/workflows/edge.yml +44 -0
  6. data/.github/workflows/firefox.yml +55 -0
  7. data/.github/workflows/ie.yml +30 -0
  8. data/.github/workflows/safari.yml +38 -0
  9. data/.github/workflows/unit.yml +60 -0
  10. data/.gitignore +21 -0
  11. data/.rubocop.yml +114 -0
  12. data/.rubocop_todo.yml +17 -0
  13. data/CHANGES.md +2212 -0
  14. data/Gemfile +15 -0
  15. data/LICENSE +24 -0
  16. data/README.md +113 -0
  17. data/Rakefile +173 -0
  18. data/lib/watir/adjacent.rb +128 -0
  19. data/lib/watir/after_hooks.rb +135 -0
  20. data/lib/watir/alert.rb +113 -0
  21. data/lib/watir/aliases.rb +8 -0
  22. data/lib/watir/attribute_helper.rb +97 -0
  23. data/lib/watir/browser.rb +323 -0
  24. data/lib/watir/capabilities.rb +179 -0
  25. data/lib/watir/cell_container.rb +25 -0
  26. data/lib/watir/container.rb +33 -0
  27. data/lib/watir/cookies.rb +130 -0
  28. data/lib/watir/element_collection.rb +223 -0
  29. data/lib/watir/elements/button.rb +28 -0
  30. data/lib/watir/elements/cell.rb +18 -0
  31. data/lib/watir/elements/checkbox.rb +56 -0
  32. data/lib/watir/elements/date_field.rb +42 -0
  33. data/lib/watir/elements/date_time_field.rb +42 -0
  34. data/lib/watir/elements/dlist.rb +12 -0
  35. data/lib/watir/elements/element.rb +807 -0
  36. data/lib/watir/elements/file_field.rb +43 -0
  37. data/lib/watir/elements/font.rb +26 -0
  38. data/lib/watir/elements/form.rb +16 -0
  39. data/lib/watir/elements/hidden.rb +26 -0
  40. data/lib/watir/elements/html_elements.rb +1981 -0
  41. data/lib/watir/elements/iframe.rb +156 -0
  42. data/lib/watir/elements/image.rb +22 -0
  43. data/lib/watir/elements/input.rb +15 -0
  44. data/lib/watir/elements/link.rb +8 -0
  45. data/lib/watir/elements/list.rb +51 -0
  46. data/lib/watir/elements/option.rb +60 -0
  47. data/lib/watir/elements/radio.rb +65 -0
  48. data/lib/watir/elements/row.rb +18 -0
  49. data/lib/watir/elements/select.rb +214 -0
  50. data/lib/watir/elements/svg_elements.rb +497 -0
  51. data/lib/watir/elements/table.rb +77 -0
  52. data/lib/watir/elements/table_cell.rb +32 -0
  53. data/lib/watir/elements/table_row.rb +34 -0
  54. data/lib/watir/elements/table_section.rb +17 -0
  55. data/lib/watir/elements/text_area.rb +7 -0
  56. data/lib/watir/elements/text_field.rb +39 -0
  57. data/lib/watir/exception.rb +16 -0
  58. data/lib/watir/extensions/nokogiri.rb +14 -0
  59. data/lib/watir/generator/base/generator.rb +114 -0
  60. data/lib/watir/generator/base/idl_sorter.rb +51 -0
  61. data/lib/watir/generator/base/spec_extractor.rb +158 -0
  62. data/lib/watir/generator/base/util.rb +21 -0
  63. data/lib/watir/generator/base/visitor.rb +133 -0
  64. data/lib/watir/generator/base.rb +12 -0
  65. data/lib/watir/generator/html/generator.rb +36 -0
  66. data/lib/watir/generator/html/spec_extractor.rb +52 -0
  67. data/lib/watir/generator/html/visitor.rb +23 -0
  68. data/lib/watir/generator/html.rb +17 -0
  69. data/lib/watir/generator/svg/generator.rb +38 -0
  70. data/lib/watir/generator/svg/spec_extractor.rb +55 -0
  71. data/lib/watir/generator/svg/visitor.rb +23 -0
  72. data/lib/watir/generator/svg.rb +9 -0
  73. data/lib/watir/generator.rb +5 -0
  74. data/lib/watir/has_window.rb +72 -0
  75. data/lib/watir/http_client.rb +11 -0
  76. data/lib/watir/js_execution.rb +165 -0
  77. data/lib/watir/js_snippets/attributeValues.js +11 -0
  78. data/lib/watir/js_snippets/backgroundColor.js +7 -0
  79. data/lib/watir/js_snippets/elementObscured.js +14 -0
  80. data/lib/watir/js_snippets/fireEvent.js +31 -0
  81. data/lib/watir/js_snippets/focus.js +3 -0
  82. data/lib/watir/js_snippets/getElementTags.js +3 -0
  83. data/lib/watir/js_snippets/getInnerHtml.js +19 -0
  84. data/lib/watir/js_snippets/getInnerText.js +19 -0
  85. data/lib/watir/js_snippets/getOuterHtml.js +20 -0
  86. data/lib/watir/js_snippets/getTextContent.js +19 -0
  87. data/lib/watir/js_snippets/isElementInViewport.js +20 -0
  88. data/lib/watir/js_snippets/isImageLoaded.js +3 -0
  89. data/lib/watir/js_snippets/selectOptionsLabel.js +10 -0
  90. data/lib/watir/js_snippets/selectOptionsText.js +10 -0
  91. data/lib/watir/js_snippets/selectOptionsValue.js +10 -0
  92. data/lib/watir/js_snippets/selectText.js +64 -0
  93. data/lib/watir/js_snippets/selectedOptions.js +11 -0
  94. data/lib/watir/js_snippets/selectedText.js +17 -0
  95. data/lib/watir/js_snippets/setText.js +3 -0
  96. data/lib/watir/js_snippets/setValue.js +3 -0
  97. data/lib/watir/js_snippets.rb +18 -0
  98. data/lib/watir/locators/anchor/selector_builder.rb +43 -0
  99. data/lib/watir/locators/button/matcher.rb +19 -0
  100. data/lib/watir/locators/button/selector_builder/xpath.rb +69 -0
  101. data/lib/watir/locators/button/selector_builder.rb +10 -0
  102. data/lib/watir/locators/cell/selector_builder/xpath.rb +23 -0
  103. data/lib/watir/locators/cell/selector_builder.rb +13 -0
  104. data/lib/watir/locators/element/locator.rb +81 -0
  105. data/lib/watir/locators/element/matcher.rb +118 -0
  106. data/lib/watir/locators/element/selector_builder/regexp_disassembler.rb +69 -0
  107. data/lib/watir/locators/element/selector_builder/xpath.rb +268 -0
  108. data/lib/watir/locators/element/selector_builder/xpath_support.rb +29 -0
  109. data/lib/watir/locators/element/selector_builder.rb +164 -0
  110. data/lib/watir/locators/option/matcher.rb +26 -0
  111. data/lib/watir/locators/option/selector_builder/xpath.rb +39 -0
  112. data/lib/watir/locators/option/selector_builder.rb +10 -0
  113. data/lib/watir/locators/row/selector_builder/xpath.rb +53 -0
  114. data/lib/watir/locators/row/selector_builder.rb +18 -0
  115. data/lib/watir/locators/text_area/selector_builder/xpath.rb +21 -0
  116. data/lib/watir/locators/text_area/selector_builder.rb +10 -0
  117. data/lib/watir/locators/text_field/matcher.rb +37 -0
  118. data/lib/watir/locators/text_field/selector_builder/xpath.rb +50 -0
  119. data/lib/watir/locators/text_field/selector_builder.rb +10 -0
  120. data/lib/watir/locators.rb +77 -0
  121. data/lib/watir/logger.rb +30 -0
  122. data/lib/watir/navigation.rb +51 -0
  123. data/lib/watir/radio_set.rb +230 -0
  124. data/lib/watir/row_container.rb +36 -0
  125. data/lib/watir/screenshot.rb +51 -0
  126. data/lib/watir/scroll.rb +95 -0
  127. data/lib/watir/search_context.rb +96 -0
  128. data/lib/watir/shadow_root.rb +60 -0
  129. data/lib/watir/user_editable.rb +85 -0
  130. data/lib/watir/version.rb +5 -0
  131. data/lib/watir/wait/timer.rb +52 -0
  132. data/lib/watir/wait.rb +171 -0
  133. data/lib/watir/window.rb +276 -0
  134. data/lib/watir/window_collection.rb +82 -0
  135. data/lib/watir.rb +108 -0
  136. data/lib/watirspec/guards.rb +65 -0
  137. data/lib/watirspec/implementation.rb +56 -0
  138. data/lib/watirspec/rake_tasks.rb +118 -0
  139. data/lib/watirspec/remote_server.rb +39 -0
  140. data/lib/watirspec/runner.rb +64 -0
  141. data/lib/watirspec/server/app.rb +86 -0
  142. data/lib/watirspec/server.rb +104 -0
  143. data/lib/watirspec.rb +93 -0
  144. data/spec/locator_spec_helper.rb +88 -0
  145. data/spec/spec_helper.rb +24 -0
  146. data/spec/unit/capabilities_spec.rb +670 -0
  147. data/spec/unit/element_locator_spec.rb +97 -0
  148. data/spec/unit/match_elements/button_spec.rb +76 -0
  149. data/spec/unit/match_elements/element_spec.rb +424 -0
  150. data/spec/unit/match_elements/text_field_spec.rb +84 -0
  151. data/spec/unit/selector_builder/anchor_spec.rb +59 -0
  152. data/spec/unit/selector_builder/button_spec.rb +217 -0
  153. data/spec/unit/selector_builder/cell_spec.rb +71 -0
  154. data/spec/unit/selector_builder/element_spec.rb +804 -0
  155. data/spec/unit/selector_builder/row_spec.rb +128 -0
  156. data/spec/unit/selector_builder/text_field_spec.rb +203 -0
  157. data/spec/unit/selector_builder/textarea_spec.rb +35 -0
  158. data/spec/unit/unit_helper.rb +4 -0
  159. data/spec/unit/wait_spec.rb +99 -0
  160. data/spec/watirspec/adjacent_spec.rb +256 -0
  161. data/spec/watirspec/after_hooks_spec.rb +204 -0
  162. data/spec/watirspec/alert_spec.rb +89 -0
  163. data/spec/watirspec/browser_spec.rb +536 -0
  164. data/spec/watirspec/capabilities_spec.rb +556 -0
  165. data/spec/watirspec/cookies_spec.rb +196 -0
  166. data/spec/watirspec/drag_and_drop_spec.rb +38 -0
  167. data/spec/watirspec/element_hidden_spec.rb +86 -0
  168. data/spec/watirspec/elements/area_spec.rb +69 -0
  169. data/spec/watirspec/elements/areas_spec.rb +44 -0
  170. data/spec/watirspec/elements/button_spec.rb +265 -0
  171. data/spec/watirspec/elements/buttons_spec.rb +57 -0
  172. data/spec/watirspec/elements/checkbox_spec.rb +290 -0
  173. data/spec/watirspec/elements/checkboxes_spec.rb +46 -0
  174. data/spec/watirspec/elements/collections_spec.rb +132 -0
  175. data/spec/watirspec/elements/date_field_spec.rb +209 -0
  176. data/spec/watirspec/elements/date_fields_spec.rb +46 -0
  177. data/spec/watirspec/elements/date_time_field_spec.rb +223 -0
  178. data/spec/watirspec/elements/date_time_fields_spec.rb +47 -0
  179. data/spec/watirspec/elements/dd_spec.rb +108 -0
  180. data/spec/watirspec/elements/dds_spec.rb +44 -0
  181. data/spec/watirspec/elements/del_spec.rb +113 -0
  182. data/spec/watirspec/elements/dels_spec.rb +42 -0
  183. data/spec/watirspec/elements/div_spec.rb +232 -0
  184. data/spec/watirspec/elements/divs_spec.rb +56 -0
  185. data/spec/watirspec/elements/dl_spec.rb +117 -0
  186. data/spec/watirspec/elements/dls_spec.rb +45 -0
  187. data/spec/watirspec/elements/dt_spec.rb +107 -0
  188. data/spec/watirspec/elements/dts_spec.rb +44 -0
  189. data/spec/watirspec/elements/element_spec.rb +1069 -0
  190. data/spec/watirspec/elements/elements_spec.rb +60 -0
  191. data/spec/watirspec/elements/em_spec.rb +85 -0
  192. data/spec/watirspec/elements/ems_spec.rb +45 -0
  193. data/spec/watirspec/elements/filefield_spec.rb +135 -0
  194. data/spec/watirspec/elements/filefields_spec.rb +45 -0
  195. data/spec/watirspec/elements/font_spec.rb +31 -0
  196. data/spec/watirspec/elements/form_spec.rb +70 -0
  197. data/spec/watirspec/elements/forms_spec.rb +46 -0
  198. data/spec/watirspec/elements/frame_spec.rb +117 -0
  199. data/spec/watirspec/elements/frames_spec.rb +43 -0
  200. data/spec/watirspec/elements/hidden_spec.rb +106 -0
  201. data/spec/watirspec/elements/hiddens_spec.rb +45 -0
  202. data/spec/watirspec/elements/hn_spec.rb +80 -0
  203. data/spec/watirspec/elements/hns_spec.rb +42 -0
  204. data/spec/watirspec/elements/iframe_spec.rb +244 -0
  205. data/spec/watirspec/elements/iframes_spec.rb +49 -0
  206. data/spec/watirspec/elements/image_spec.rb +160 -0
  207. data/spec/watirspec/elements/images_spec.rb +42 -0
  208. data/spec/watirspec/elements/input_spec.rb +17 -0
  209. data/spec/watirspec/elements/ins_spec.rb +113 -0
  210. data/spec/watirspec/elements/inses_spec.rb +42 -0
  211. data/spec/watirspec/elements/label_spec.rb +77 -0
  212. data/spec/watirspec/elements/labels_spec.rb +42 -0
  213. data/spec/watirspec/elements/li_spec.rb +99 -0
  214. data/spec/watirspec/elements/link_spec.rb +180 -0
  215. data/spec/watirspec/elements/links_spec.rb +66 -0
  216. data/spec/watirspec/elements/lis_spec.rb +44 -0
  217. data/spec/watirspec/elements/list_spec.rb +50 -0
  218. data/spec/watirspec/elements/map_spec.rb +78 -0
  219. data/spec/watirspec/elements/maps_spec.rb +43 -0
  220. data/spec/watirspec/elements/meta_spec.rb +27 -0
  221. data/spec/watirspec/elements/metas_spec.rb +42 -0
  222. data/spec/watirspec/elements/ol_spec.rb +63 -0
  223. data/spec/watirspec/elements/ols_spec.rb +42 -0
  224. data/spec/watirspec/elements/option_spec.rb +113 -0
  225. data/spec/watirspec/elements/p_spec.rb +102 -0
  226. data/spec/watirspec/elements/pre_spec.rb +100 -0
  227. data/spec/watirspec/elements/pres_spec.rb +42 -0
  228. data/spec/watirspec/elements/ps_spec.rb +42 -0
  229. data/spec/watirspec/elements/radio_spec.rb +259 -0
  230. data/spec/watirspec/elements/radios_spec.rb +45 -0
  231. data/spec/watirspec/elements/select_list_spec.rb +701 -0
  232. data/spec/watirspec/elements/select_lists_spec.rb +49 -0
  233. data/spec/watirspec/elements/span_spec.rb +119 -0
  234. data/spec/watirspec/elements/spans_spec.rb +42 -0
  235. data/spec/watirspec/elements/strong_spec.rb +78 -0
  236. data/spec/watirspec/elements/strongs_spec.rb +45 -0
  237. data/spec/watirspec/elements/table_spec.rb +210 -0
  238. data/spec/watirspec/elements/tables_spec.rb +44 -0
  239. data/spec/watirspec/elements/tbody_spec.rb +94 -0
  240. data/spec/watirspec/elements/tbodys_spec.rb +64 -0
  241. data/spec/watirspec/elements/td_spec.rb +92 -0
  242. data/spec/watirspec/elements/tds_spec.rb +55 -0
  243. data/spec/watirspec/elements/text_field_spec.rb +223 -0
  244. data/spec/watirspec/elements/text_fields_spec.rb +47 -0
  245. data/spec/watirspec/elements/textarea_spec.rb +30 -0
  246. data/spec/watirspec/elements/textareas_spec.rb +28 -0
  247. data/spec/watirspec/elements/tfoot_spec.rb +89 -0
  248. data/spec/watirspec/elements/tfoots_spec.rb +72 -0
  249. data/spec/watirspec/elements/thead_spec.rb +88 -0
  250. data/spec/watirspec/elements/theads_spec.rb +72 -0
  251. data/spec/watirspec/elements/tr_spec.rb +69 -0
  252. data/spec/watirspec/elements/trs_spec.rb +63 -0
  253. data/spec/watirspec/elements/ul_spec.rb +63 -0
  254. data/spec/watirspec/elements/uls_spec.rb +42 -0
  255. data/spec/watirspec/html/alerts.html +12 -0
  256. data/spec/watirspec/html/aria_attributes.html +9 -0
  257. data/spec/watirspec/html/child_frame.html +29 -0
  258. data/spec/watirspec/html/class_locator.html +11 -0
  259. data/spec/watirspec/html/clicks.html +19 -0
  260. data/spec/watirspec/html/closeable.html +21 -0
  261. data/spec/watirspec/html/collections.html +15 -0
  262. data/spec/watirspec/html/css/jquery-ui-1.8.17.custom.css +287 -0
  263. data/spec/watirspec/html/data_attributes.html +10 -0
  264. data/spec/watirspec/html/definition_lists.html +48 -0
  265. data/spec/watirspec/html/drag_and_drop.html +106 -0
  266. data/spec/watirspec/html/font.html +10 -0
  267. data/spec/watirspec/html/forms_with_input_elements.html +194 -0
  268. data/spec/watirspec/html/frame_1.html +22 -0
  269. data/spec/watirspec/html/frame_2.html +16 -0
  270. data/spec/watirspec/html/frames.html +11 -0
  271. data/spec/watirspec/html/iframe_1.html +22 -0
  272. data/spec/watirspec/html/iframes.html +15 -0
  273. data/spec/watirspec/html/images/button.png +0 -0
  274. data/spec/watirspec/html/images/circle.png +0 -0
  275. data/spec/watirspec/html/images/map.gif +0 -0
  276. data/spec/watirspec/html/images/map2.gif +0 -0
  277. data/spec/watirspec/html/images/originaltriangle.png +0 -0
  278. data/spec/watirspec/html/images/square.png +0 -0
  279. data/spec/watirspec/html/images/triangle.png +0 -0
  280. data/spec/watirspec/html/images.html +28 -0
  281. data/spec/watirspec/html/inner_outer.html +5 -0
  282. data/spec/watirspec/html/javascript/angular.min.js +332 -0
  283. data/spec/watirspec/html/javascript/helpers.js +16 -0
  284. data/spec/watirspec/html/javascript/jquery-1.7.1.min.js +4 -0
  285. data/spec/watirspec/html/javascript/jquery-ui-1.8.17.custom.min.js +68 -0
  286. data/spec/watirspec/html/keylogger.html +15 -0
  287. data/spec/watirspec/html/modal_dialog.html +9 -0
  288. data/spec/watirspec/html/multiple_ids.html +15 -0
  289. data/spec/watirspec/html/nested_elements.html +44 -0
  290. data/spec/watirspec/html/nested_frame_1.html +1 -0
  291. data/spec/watirspec/html/nested_frame_2.html +9 -0
  292. data/spec/watirspec/html/nested_frame_3.html +14 -0
  293. data/spec/watirspec/html/nested_frames.html +10 -0
  294. data/spec/watirspec/html/nested_iframe_2.html +12 -0
  295. data/spec/watirspec/html/nested_iframes.html +13 -0
  296. data/spec/watirspec/html/nested_tables.html +203 -0
  297. data/spec/watirspec/html/non_control_elements.html +145 -0
  298. data/spec/watirspec/html/obscured.html +36 -0
  299. data/spec/watirspec/html/removed_element.html +24 -0
  300. data/spec/watirspec/html/right_click.html +23 -0
  301. data/spec/watirspec/html/scroll.html +15 -0
  302. data/spec/watirspec/html/scroll_nested.html +17 -0
  303. data/spec/watirspec/html/scroll_nested_offscreen.html +18 -0
  304. data/spec/watirspec/html/shadow_dom.html +28 -0
  305. data/spec/watirspec/html/special_chars.html +15 -0
  306. data/spec/watirspec/html/sticky_elements.html +10 -0
  307. data/spec/watirspec/html/tables.html +121 -0
  308. data/spec/watirspec/html/timeout_window_location.html +19 -0
  309. data/spec/watirspec/html/uneven_table.html +20 -0
  310. data/spec/watirspec/html/wait.html +99 -0
  311. data/spec/watirspec/html/watirspec.css +0 -0
  312. data/spec/watirspec/html/window_switching.html +22 -0
  313. data/spec/watirspec/radio_set_spec.rb +346 -0
  314. data/spec/watirspec/screenshot_spec.rb +33 -0
  315. data/spec/watirspec/scroll_spec.rb +208 -0
  316. data/spec/watirspec/shadow_root_spec.rb +108 -0
  317. data/spec/watirspec/support/rspec_matchers.rb +161 -0
  318. data/spec/watirspec/user_editable_spec.rb +207 -0
  319. data/spec/watirspec/wait_spec.rb +345 -0
  320. data/spec/watirspec/window_switching_spec.rb +580 -0
  321. data/spec/watirspec_helper.rb +163 -0
  322. data/support/doctest_helper.rb +101 -0
  323. data/support/version_differ.rb +60 -0
  324. data/watir.gemspec +50 -0
  325. metadata +652 -148
  326. data/readme.rb +0 -211
  327. data/unittests/WindowLogonExample.rb +0 -30
  328. data/unittests/WindowLogonExtra.rb +0 -7
  329. data/unittests/all_tests.rb +0 -10
  330. data/unittests/all_tests_concurrent.rb +0 -57
  331. data/unittests/attachToExistingWindow_test.rb +0 -40
  332. data/unittests/buttons_test.rb +0 -131
  333. data/unittests/checkbox_test.rb +0 -149
  334. data/unittests/core_tests.rb +0 -9
  335. data/unittests/css_test.rb +0 -60
  336. data/unittests/div_test.rb +0 -179
  337. data/unittests/errorchecker_test.rb +0 -29
  338. data/unittests/filefield_test.rb +0 -35
  339. data/unittests/form_test.rb +0 -279
  340. data/unittests/frame_test.rb +0 -141
  341. data/unittests/html/blankpage.html +0 -12
  342. data/unittests/html/buttons1.html +0 -40
  343. data/unittests/html/checkboxes1.html +0 -69
  344. data/unittests/html/complex_table.html +0 -36
  345. data/unittests/html/cssTest.html +0 -42
  346. data/unittests/html/div.html +0 -105
  347. data/unittests/html/fileupload.html +0 -45
  348. data/unittests/html/formTest1.html +0 -39
  349. data/unittests/html/forms2.html +0 -45
  350. data/unittests/html/forms3.html +0 -132
  351. data/unittests/html/forms4.html +0 -27
  352. data/unittests/html/frame_buttons.html +0 -4
  353. data/unittests/html/frame_links.html +0 -4
  354. data/unittests/html/frame_multi.html +0 -5
  355. data/unittests/html/iframeTest.html +0 -13
  356. data/unittests/html/iframeTest1.html +0 -7
  357. data/unittests/html/iframeTest2.html +0 -6
  358. data/unittests/html/images/button.jpg +0 -0
  359. data/unittests/html/images/circle.jpg +0 -0
  360. data/unittests/html/images/originaltriangle.jpg +0 -0
  361. data/unittests/html/images/square.jpg +0 -0
  362. data/unittests/html/images/triangle.jpg +0 -0
  363. data/unittests/html/images1.html +0 -52
  364. data/unittests/html/javascriptevents.html +0 -39
  365. data/unittests/html/link_pass.html +0 -11
  366. data/unittests/html/links1.html +0 -37
  367. data/unittests/html/links2.html +0 -11
  368. data/unittests/html/nestedFrames.html +0 -6
  369. data/unittests/html/pass.html +0 -10
  370. data/unittests/html/popups1.html +0 -60
  371. data/unittests/html/radioButtons1.html +0 -71
  372. data/unittests/html/select_tealeaf.html +0 -54
  373. data/unittests/html/selectboxes1.html +0 -55
  374. data/unittests/html/simple_table.html +0 -26
  375. data/unittests/html/simple_table_buttons.html +0 -104
  376. data/unittests/html/simple_table_columns.html +0 -76
  377. data/unittests/html/table1.html +0 -142
  378. data/unittests/html/textarea.html +0 -30
  379. data/unittests/html/textfields1.html +0 -87
  380. data/unittests/html/textsearch.html +0 -44
  381. data/unittests/ie_mock.rb +0 -93
  382. data/unittests/ie_test.rb +0 -50
  383. data/unittests/images_test.rb +0 -179
  384. data/unittests/iostring.rb +0 -30
  385. data/unittests/iostring_test.rb +0 -48
  386. data/unittests/js_events_test.rb +0 -77
  387. data/unittests/jscriptExtraAlert.rb +0 -6
  388. data/unittests/jscriptExtraConfirmCancel.rb +0 -7
  389. data/unittests/jscriptExtraConfirmOk.rb +0 -7
  390. data/unittests/jscriptPushButton.rb +0 -5
  391. data/unittests/jscript_test.rb +0 -57
  392. data/unittests/links_test.rb +0 -169
  393. data/unittests/minmax_test.rb +0 -31
  394. data/unittests/navigate_test.rb +0 -56
  395. data/unittests/non_core_tests.rb +0 -9
  396. data/unittests/pagecontainstext_test.rb +0 -49
  397. data/unittests/popups_test.rb +0 -44
  398. data/unittests/radios_test.rb +0 -164
  399. data/unittests/screen_capture_test.rb +0 -53
  400. data/unittests/selectbox_test.rb +0 -197
  401. data/unittests/send_keys_test.rb +0 -29
  402. data/unittests/setup.rb +0 -47
  403. data/unittests/table_test.rb +0 -306
  404. data/unittests/textAreafields_test.rb +0 -81
  405. data/unittests/textfields_test.rb +0 -239
  406. data/watir/AutoItX3.dll +0 -0
  407. data/watir/WindowHelper.rb +0 -47
  408. data/watir/camel_case.rb +0 -37
  409. data/watir/clickJSDialog.rb +0 -19
  410. data/watir/cookiemanager.rb +0 -53
  411. data/watir/exceptions.rb +0 -60
  412. data/watir/screen_capture.rb +0 -115
  413. data/watir/setFileDialog.rb +0 -16
  414. data/watir/testUnitAddons.rb +0 -47
  415. data/watir/watir_simple.rb +0 -475
  416. data/watir/winClicker.rb +0 -505
  417. data/watir.rb +0 -3744
  418. /data/{unittests → spec/watirspec}/html/images/1.gif +0 -0
  419. /data/{unittests/html/images/2.GIF → spec/watirspec/html/images/2.gif} +0 -0
  420. /data/{unittests/html/images/3.GIF → spec/watirspec/html/images/3.gif} +0 -0
  421. /data/{unittests/html/images/minus.GIF → spec/watirspec/html/images/minus.gif} +0 -0
  422. /data/{unittests → spec/watirspec}/html/images/plus.gif +0 -0
@@ -0,0 +1,268 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Locators
5
+ class Element
6
+ class SelectorBuilder
7
+ class XPath
8
+ include Exception
9
+ include XpathSupport
10
+
11
+ CAN_NOT_BUILD = %i[visible visible_text visible_label_element].freeze
12
+
13
+ LOCATOR = :xpath
14
+
15
+ def build(selector)
16
+ @selector = selector
17
+ @valid_attributes = build_valid_attributes
18
+
19
+ @built = (@selector.keys & CAN_NOT_BUILD).each_with_object({}) do |key, hash|
20
+ hash[key] = @selector.delete(key)
21
+ end
22
+
23
+ index = @selector.delete(:index)
24
+ @adjacent = @selector.delete(:adjacent)
25
+ @scope = @selector.delete(:scope)
26
+
27
+ xpath = "#{start_string}" \
28
+ "#{adjacent_string}" \
29
+ "#{tag_string}" \
30
+ "#{class_string}" \
31
+ "#{text_string}" \
32
+ "#{additional_string}" \
33
+ "#{label_element_string}" \
34
+ "#{attribute_string}"
35
+
36
+ @built[:xpath] = index ? add_index(xpath, index) : xpath
37
+ @built
38
+ end
39
+
40
+ private
41
+
42
+ def process_attribute(key, value)
43
+ if value.is_a? Regexp
44
+ predicate_conversion(key, value)
45
+ else
46
+ predicate_expression(key, value)
47
+ end
48
+ end
49
+
50
+ def predicate_expression(key, val)
51
+ case val
52
+ when true
53
+ attribute_presence(key)
54
+ when false
55
+ attribute_absence(key)
56
+ else
57
+ equal_pair(key, val)
58
+ end
59
+ end
60
+
61
+ def predicate_conversion(key, regexp)
62
+ downcase = case_insensitive_attribute?(key) || regexp.casefold?
63
+
64
+ lhs = lhs_for(key, downcase: downcase)
65
+
66
+ results = RegexpDisassembler.new(regexp).substrings
67
+
68
+ if results.empty?
69
+ add_to_matching(key, regexp)
70
+ return lhs
71
+ elsif results.size == 1 && starts_with?(results, regexp) && !visible?
72
+ return "starts-with(#{lhs}, '#{results.first}')"
73
+ end
74
+
75
+ add_to_matching(key, regexp, results)
76
+
77
+ results.map { |rhs|
78
+ rhs = "\"#{rhs}\""
79
+ rhs = XpathSupport.downcase(rhs) if downcase
80
+ "contains(#{lhs}, #{rhs})"
81
+ }.flatten.compact.join(' and ')
82
+ end
83
+
84
+ def start_string
85
+ start = @adjacent ? './' : './/*'
86
+ @scope ? "(#{@scope[:xpath]})[1]#{start.tr('.', '')}" : start
87
+ end
88
+
89
+ def adjacent_string
90
+ case @adjacent
91
+ when nil
92
+ ''
93
+ when :ancestor
94
+ 'ancestor::*'
95
+ when :preceding
96
+ 'preceding-sibling::*'
97
+ when :following
98
+ 'following-sibling::*'
99
+ when :child
100
+ 'child::*'
101
+ else
102
+ raise LocatorException, "Unable to process adjacent locator with #{@adjacent}"
103
+ end
104
+ end
105
+
106
+ def tag_string
107
+ tag_name = @selector.delete(:tag_name)
108
+ tag_name.nil? ? '' : "[#{process_attribute(:tag_name, tag_name)}]"
109
+ end
110
+
111
+ def class_string
112
+ class_name = @selector.delete(:class)
113
+ return '' if class_name.nil?
114
+
115
+ @built[:class] = []
116
+
117
+ predicates = [class_name].flatten.filter_map { |value| process_attribute(:class, value) }
118
+
119
+ @built.delete(:class) if @built[:class].empty?
120
+
121
+ predicates.empty? ? '' : "[#{predicates.join(' and ')}]"
122
+ end
123
+
124
+ def text_string
125
+ result = equal_or_contains(@selector.delete(:text))
126
+ result.nil? ? '' : "[#{result}]"
127
+ end
128
+
129
+ def label_element_string
130
+ text = @selector.delete(:label_element)
131
+ return '' if text.nil?
132
+
133
+ result = equal_or_contains(text)
134
+ @built[:label_element] = @built.delete(:text) if @built.key?(:text)
135
+
136
+ result.nil? ? '' : "[@id=//label[#{result}]/@for or parent::label[#{result}]]"
137
+ end
138
+
139
+ def equal_or_contains(value)
140
+ return nil if value.nil? || (value.is_a?(String) && value.empty?) || value.inspect == '//'
141
+
142
+ process_attribute(:text, value)
143
+ end
144
+
145
+ def attribute_string
146
+ attributes = @selector.keys.map { |key|
147
+ process_attribute(key, @selector.delete(key))
148
+ }.flatten.compact
149
+ attributes.empty? ? '' : "[#{attributes.join(' and ')}]"
150
+ end
151
+
152
+ def additional_string
153
+ # to be used by subclasses as necessary
154
+ ''
155
+ end
156
+
157
+ def add_index(xpath, index)
158
+ if @adjacent
159
+ "#{xpath}[#{index + 1}]"
160
+ elsif index&.positive? && @built.empty?
161
+ "(#{xpath})[#{index + 1}]"
162
+ elsif index&.negative? && @built.empty?
163
+ last_value = "last()#{index < -1 ? index + 1 : ''}"
164
+ "(#{xpath})[#{last_value}]"
165
+ else
166
+ @built[:index] = index
167
+ xpath
168
+ end
169
+ end
170
+
171
+ def visible?
172
+ !(@built.keys & CAN_NOT_BUILD).empty?
173
+ end
174
+
175
+ def starts_with?(results, regexp)
176
+ regexp.source[0] == '^' && results.first == regexp.source[1..]
177
+ end
178
+
179
+ def add_to_matching(key, regexp, results = nil)
180
+ return unless results.nil? || requires_matching?(results, regexp)
181
+
182
+ if key == :class
183
+ @built[key] << regexp
184
+ else
185
+ @built[key] = regexp
186
+ end
187
+ end
188
+
189
+ def requires_matching?(results, regexp)
190
+ regexp.casefold? ? !results.first.casecmp(regexp.source).zero? : results.first != regexp.source
191
+ end
192
+
193
+ def lhs_for(key, downcase: false)
194
+ lhs = case key
195
+ when String
196
+ process_string key
197
+ when :tag_name
198
+ 'local-name()'
199
+ when :href
200
+ 'normalize-space(@href)'
201
+ when :text
202
+ 'normalize-space()'
203
+ when ::Symbol
204
+ process_string key.to_s.tr('_', '-')
205
+ else
206
+ raise LocatorException, "Unable to build XPath using #{key}:#{key.class}"
207
+ end
208
+ downcase ? XpathSupport.downcase(lhs) : lhs
209
+ end
210
+
211
+ def attribute_presence(attribute)
212
+ lhs_for(attribute)
213
+ end
214
+
215
+ def attribute_absence(attribute)
216
+ lhs = lhs_for(attribute)
217
+ "not(#{lhs})"
218
+ end
219
+
220
+ def equal_pair(key, value)
221
+ if key == :class
222
+ negate_xpath = value =~ /^!/
223
+ value = value[1..] if negate_xpath
224
+ expression = "contains(concat(' ', normalize-space(@class), ' '), #{XpathSupport.escape " #{value} "})"
225
+
226
+ negate_xpath ? "not(#{expression})" : expression
227
+ else
228
+ downcase = case_insensitive_attribute?(key)
229
+
230
+ lhs = lhs_for(key, downcase: downcase)
231
+ rhs = XpathSupport.escape(value)
232
+ rhs = XpathSupport.downcase(rhs) if downcase
233
+
234
+ "#{lhs}=#{rhs}"
235
+ end
236
+ end
237
+
238
+ def build_valid_attributes
239
+ tag_name = @selector[:tag_name]
240
+ if tag_name.is_a?(String) && Watir.tag_to_class[tag_name.to_sym]
241
+ Watir.tag_to_class[tag_name.to_sym].attribute_list
242
+ else
243
+ Watir::HTMLElement.attribute_list
244
+ end
245
+ end
246
+
247
+ def case_insensitive_attribute?(attribute)
248
+ # type attributes can be upper case - downcase them
249
+ # https://github.com/watir/watir/issues/72
250
+ return true if attribute == :type
251
+ return true if Watir::Element::CASE_INSENSITIVE_ATTRIBUTES.include?(attribute) &&
252
+ @valid_attributes.include?(attribute)
253
+
254
+ false
255
+ end
256
+
257
+ def process_string(name)
258
+ if /^[a-zA-Z_:][a-zA-Z0-9_:.-]*$/.match?(name)
259
+ "@#{name}"
260
+ else
261
+ "(attribute::*[local-name(.) = '#{name}'])"
262
+ end
263
+ end
264
+ end
265
+ end
266
+ end
267
+ end
268
+ end
@@ -0,0 +1,29 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Locators
5
+ class Element
6
+ class SelectorBuilder
7
+ module XpathSupport
8
+ UPPERCASE_LETTERS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖØÙÚÛÜÝÞŸŽŠŒ'
9
+ LOWERCASE_LETTERS = 'abcdefghijklmnopqrstuvwxyzàáâãäåæçèéêëìíîïðñòóôõöøùúûüýþÿžšœ'
10
+
11
+ def self.escape(value)
12
+ if value.include? "'"
13
+ parts = value.split("'", -1).map { |part| "'#{part}'" }
14
+ string = parts.join(%(,"'",))
15
+
16
+ "concat(#{string})"
17
+ else
18
+ "'#{value}'"
19
+ end
20
+ end
21
+
22
+ def self.downcase(value)
23
+ "translate(#{value},'#{UPPERCASE_LETTERS}','#{LOWERCASE_LETTERS}')"
24
+ end
25
+ end
26
+ end
27
+ end
28
+ end # XpathSupport
29
+ end # Watir
@@ -0,0 +1,164 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Locators
5
+ class Element
6
+ class SelectorBuilder
7
+ include Exception
8
+ attr_reader :custom_attributes, :built
9
+
10
+ WILDCARD_ATTRIBUTE = /^(aria|data)_(.+)$/
11
+ VALID_WHATS = Hash.new([String, Regexp, TrueClass, FalseClass]).merge(adjacent: [::Symbol],
12
+ xpath: [String],
13
+ css: [String],
14
+ index: [Integer],
15
+ visible: [TrueClass, FalseClass],
16
+ tag_name: [String, Regexp, ::Symbol],
17
+ visible_text: [String, Regexp],
18
+ scope: [Hash],
19
+ text: [String, Regexp]).freeze
20
+
21
+ def initialize(valid_attributes, query_scope)
22
+ @valid_attributes = valid_attributes
23
+ @custom_attributes = []
24
+ @query_scope = query_scope
25
+ end
26
+
27
+ # rubocop:disable Metrics/PerceivedComplexity:
28
+ def build(selector)
29
+ @selector = selector
30
+
31
+ normalize_selector
32
+ inspected = selector.inspect
33
+ scope = @query_scope unless @selector.key?(:scope) || @query_scope.is_a?(Watir::Browser)
34
+
35
+ @built =
36
+ if scope.is_a? Watir::ShadowRoot
37
+ raise ArgumentError, ':xpath not supported when locating elements from shadow root' if @selector[:xpath]
38
+
39
+ @selector[:css] ||= '*'
40
+ @selector
41
+ else
42
+ wd_locators.empty? ? build_wd_selector(@selector) : @selector
43
+ end
44
+ @built.delete(:index) if @built[:index]&.zero?
45
+ @built[:scope] = scope if scope
46
+
47
+ Watir.logger.info "Converted #{inspected} to #{@built.inspect}"
48
+ @built
49
+ end
50
+ # rubocop:enable Metrics/PerceivedComplexity:
51
+
52
+ def wd_locators
53
+ Watir::Locators::W3C_FINDERS & @selector.keys
54
+ end
55
+
56
+ private
57
+
58
+ def normalize_selector
59
+ # TODO: This can be more specific now that only 2
60
+ raise LocatorException, "Can not locate element with #{wd_locators}" if wd_locators.size > 1
61
+
62
+ @selector[:scope] = @query_scope.selector_builder.built if merge_scope?
63
+
64
+ if @selector.key?(:class) || @selector.key?(:class_name)
65
+ @selector[:class] = ([@selector[:class]].flatten + [@selector.delete(:class_name)].flatten).compact
66
+ end
67
+
68
+ if @selector[:adjacent] == :ancestor && @selector.key?(:text)
69
+ raise LocatorException, 'Can not find parent element with text locator'
70
+ end
71
+
72
+ @selector.keys.each do |key|
73
+ check_type(key, @selector[key])
74
+
75
+ how, what = normalize_locator(key, @selector.delete(key))
76
+ @selector[how] = what
77
+ end
78
+ end
79
+
80
+ def merge_scope?
81
+ return false unless ((Watir::Locators::W3C_FINDERS + [:adjacent]) & @selector.keys).empty?
82
+
83
+ return false if [Watir::Browser, Watir::IFrame, Watir::ShadowRoot].any? { |k| @query_scope.is_a?(k) }
84
+
85
+ scope_invalid_locators = @query_scope.selector_builder.built.keys.reject { |key| key == wd_locator }
86
+ scope_invalid_locators.empty?
87
+ end
88
+
89
+ def check_type(how, what)
90
+ if %i[class class_name].include? how
91
+ [what].flatten.each { |value| raise_unless(value, VALID_WHATS[how]) }
92
+ else
93
+ raise_unless(what, VALID_WHATS[how])
94
+ end
95
+ end
96
+
97
+ def should_use_label_element?
98
+ !valid_attribute?(:label)
99
+ end
100
+
101
+ def normalize_locator(how, what)
102
+ case how
103
+ when :tag_name
104
+ what = what.to_s if what.is_a?(::Symbol)
105
+ [how, what]
106
+ when :text, :xpath, :index, :css, :visible, :visible_text, :adjacent
107
+ [how, what]
108
+ when :class
109
+ what = false if what.tap { |arr| arr.delete('') }.empty?
110
+ [how, what]
111
+ when :label, :visible_label
112
+ if should_use_label_element?
113
+ ["#{how}_element".to_sym, what]
114
+ else
115
+ [how, what]
116
+ end
117
+ else
118
+ check_custom_attribute how
119
+ [how, what]
120
+ end
121
+ end
122
+
123
+ def check_custom_attribute(attribute)
124
+ return if valid_attribute?(attribute) || attribute.to_s =~ WILDCARD_ATTRIBUTE
125
+
126
+ @custom_attributes << attribute.to_s
127
+ end
128
+
129
+ # Extensions implement this method when creating a different selector builder
130
+ def implementation_class
131
+ Watir.const_get("#{self.class.name}::XPath")
132
+ end
133
+
134
+ def build_wd_selector(selector)
135
+ implementation_class.new.build(selector)
136
+ end
137
+
138
+ def wd_locator
139
+ implementation_class::LOCATOR
140
+ end
141
+
142
+ def valid_attribute?(attribute)
143
+ @valid_attributes&.include?(attribute)
144
+ end
145
+
146
+ def combine_with_xpath_or_css?(selector)
147
+ keys = selector.keys
148
+ keys.reject! { |key| %i[visible visible_text index].include? key }
149
+ if (keys - [:tag_name]).empty?
150
+ true
151
+ else
152
+ selector[:tag_name] == 'input' && keys == %i[tag_name type]
153
+ end
154
+ end
155
+
156
+ def raise_unless(what, types)
157
+ return if types.include?(what.class)
158
+
159
+ raise TypeError, "expected one of #{types}, got #{what.inspect}:#{what.class}"
160
+ end
161
+ end
162
+ end
163
+ end
164
+ end
@@ -0,0 +1,26 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Locators
5
+ class Option
6
+ class Matcher < Element::Matcher
7
+ def fetch_value(element, how)
8
+ case how
9
+ when :any
10
+ [element.attribute(:value),
11
+ execute_js(:getTextContent, element).gsub(/\s+/, ' ').strip,
12
+ element.attribute(:label)]
13
+ else
14
+ super
15
+ end
16
+ end
17
+
18
+ def matches_values?(found, expected)
19
+ return super unless found.is_a?(Array)
20
+
21
+ found.find { |possible| matches_values?(possible, expected) }
22
+ end
23
+ end
24
+ end
25
+ end
26
+ end
@@ -0,0 +1,39 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Locators
5
+ class Option
6
+ class SelectorBuilder
7
+ class XPath < Element::SelectorBuilder::XPath
8
+ private
9
+
10
+ def attribute_string
11
+ result = if @selector.key?(:any)
12
+ to_match = @selector.delete :any
13
+ value = process_attribute(:value, to_match)
14
+ text = process_attribute(:text, to_match)
15
+ label = process_attribute(:label, to_match)
16
+ "[#{value} or #{text} or #{label}]"
17
+ else
18
+ ''
19
+ end
20
+
21
+ attributes = @selector.keys.map { |key|
22
+ process_attribute(key, @selector.delete(key))
23
+ }.flatten.compact
24
+ attribute_values = attributes.empty? ? '' : "[#{attributes.join(' and ')}]"
25
+ "#{result}#{attribute_values}"
26
+ end
27
+
28
+ def add_to_matching(key, regexp, results = nil)
29
+ return unless results.nil? || requires_matching?(results, regexp)
30
+
31
+ return super unless %i[value text label].include? key
32
+
33
+ @built[:any] = regexp
34
+ end
35
+ end
36
+ end
37
+ end
38
+ end
39
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Locators
5
+ class Option
6
+ class SelectorBuilder < Element::SelectorBuilder
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,53 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Locators
5
+ class Row
6
+ class SelectorBuilder
7
+ class XPath < Element::SelectorBuilder::XPath
8
+ def build(selector, scope_tag_name)
9
+ return super(selector) if selector.key?(:adjacent)
10
+
11
+ index = selector.delete(:index)
12
+
13
+ super(selector)
14
+ common_string = @built.delete(:xpath)
15
+ expressions = generate_expressions(scope_tag_name)
16
+ expressions.map! { |e| "#{e}#{common_string}" } unless common_string.empty?
17
+
18
+ xpath = expressions.join(' | ').to_s
19
+
20
+ @built[:xpath] = index ? add_index(xpath, index) : xpath
21
+ @built
22
+ end
23
+
24
+ private
25
+
26
+ def start_string
27
+ @adjacent ? './' : ''
28
+ end
29
+
30
+ def text_string
31
+ return super if @adjacent
32
+
33
+ # Can not directly locate a Row with Text because all text is in the Cells;
34
+ # needs to use Locator#locate_matching_elements
35
+ @built[:text] = @selector.delete(:text) if @selector.key?(:text)
36
+ ''
37
+ end
38
+
39
+ def generate_expressions(scope_tag_name)
40
+ if %w[tbody tfoot thead].include?(scope_tag_name)
41
+ ["./*[local-name()='tr']"]
42
+ else
43
+ ["./*[local-name()='tr']",
44
+ "./*[local-name()='tbody']/*[local-name()='tr']",
45
+ "./*[local-name()='thead']/*[local-name()='tr']",
46
+ "./*[local-name()='tfoot']/*[local-name()='tr']"]
47
+ end
48
+ end
49
+ end
50
+ end
51
+ end
52
+ end
53
+ end
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Locators
5
+ class Row
6
+ class SelectorBuilder < Element::SelectorBuilder
7
+ def build_wd_selector(selector)
8
+ scope_tag_name = @query_scope.selector[:tag_name] || @query_scope.tag_name
9
+ implementation_class.new.build(selector, scope_tag_name)
10
+ end
11
+
12
+ def merge_scope?
13
+ false
14
+ end
15
+ end
16
+ end
17
+ end
18
+ end
@@ -0,0 +1,21 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Locators
5
+ class TextArea
6
+ class SelectorBuilder
7
+ class XPath < Element::SelectorBuilder::XPath
8
+ private
9
+
10
+ # value always requires a wire call since we want the property not the attribute
11
+ def process_attribute(key, value)
12
+ return super unless key == :value
13
+
14
+ @built[:value] = value
15
+ nil
16
+ end
17
+ end
18
+ end
19
+ end
20
+ end
21
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Locators
5
+ class TextArea
6
+ class SelectorBuilder < Element::SelectorBuilder
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Locators
5
+ class TextField
6
+ class Matcher < Element::Matcher
7
+ private
8
+
9
+ def elements_match?(element, values_to_match)
10
+ case fetch_value(element, :tag_name)
11
+ when 'input'
12
+ %i[text label visible_text].each do |key|
13
+ next unless values_to_match.key?(key)
14
+
15
+ values_to_match[:value] = values_to_match.delete(key)
16
+ end
17
+ when 'label'
18
+ %i[value label].each do |key|
19
+ next unless values_to_match.key?(key)
20
+
21
+ values_to_match[:text] = values_to_match.delete(key)
22
+ end
23
+ else
24
+ return false
25
+ end
26
+
27
+ super
28
+ end
29
+
30
+ def validate_tag(element, _expected)
31
+ tag_name = fetch_value(element, :tag_name)
32
+ matches_values?(tag_name, 'input')
33
+ end
34
+ end
35
+ end
36
+ end
37
+ end