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,97 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'unit_helper'
4
+
5
+ module Watir
6
+ module Locators
7
+ class Element
8
+ describe Locator do
9
+ include LocatorSpecHelper
10
+
11
+ describe '#locate' do
12
+ context 'when XPath can be built to represent entire selector' do
13
+ it 'locates without using match' do
14
+ @locator = {xpath: './/div'}
15
+
16
+ allow(driver).to receive(:find_element).and_return(el)
17
+ allow(element_matcher).to receive(:match)
18
+
19
+ expect(locate_one).to eq el
20
+ expect(element_matcher).not_to have_received(:match)
21
+ end
22
+
23
+ it 'returns nil if not found' do
24
+ @locator = {xpath: './/div'}
25
+
26
+ allow(driver).to receive(:find_element).and_raise(Selenium::WebDriver::Error::NoSuchElementError)
27
+ expect(locate_one).to be_nil
28
+ end
29
+ end
30
+
31
+ context 'when SelectorBuilder result has additional locators to match' do
32
+ it 'locates using match' do
33
+ @locator = {xpath: './/div', id: 'foo'}
34
+
35
+ allow(driver).to receive(:find_elements).and_return([el])
36
+ allow(element_matcher).to receive(:match).and_return(el)
37
+
38
+ expect(locate_one).to eq el
39
+ expect(element_matcher).to have_received(:match).once
40
+ end
41
+
42
+ it 'relocates if element goes stale' do
43
+ @locator = {xpath: './/div', id: 'foo'}
44
+
45
+ allow(driver).to receive(:find_elements).and_return([el])
46
+ stale_exception = Selenium::WebDriver::Error::StaleElementReferenceError
47
+ allow(element_matcher).to receive(:match).and_invoke(proc { raise stale_exception }, proc { el })
48
+
49
+ expect(locate_one).to eq el
50
+ expect(element_matcher).to have_received(:match).exactly(2).times
51
+ end
52
+
53
+ it 'Raises Exception if element continues to go stale' do
54
+ @locator = {xpath: './/div', id: 'foo'}
55
+
56
+ allow(driver).to receive(:find_elements).and_return([el])
57
+ stale_exception = Selenium::WebDriver::Error::StaleElementReferenceError
58
+ allow(element_matcher).to receive(:match).and_raise(stale_exception)
59
+
60
+ msg = 'Unable to locate element from {:xpath=>".//div", :id=>"foo"} due to changing page'
61
+ expect { locate_one }.to raise_exception Watir::Exception::LocatorException, msg
62
+ expect(element_matcher).to have_received(:match).exactly(3).times
63
+ end
64
+ end
65
+ end
66
+
67
+ describe '#locate_all' do
68
+ it 'locates using match' do
69
+ @locator = {xpath: './/div', id: 'foo'}
70
+
71
+ allow(driver).to receive(:find_elements).and_return([el])
72
+ allow(element_matcher).to receive(:match).and_return([el])
73
+
74
+ expect(locate_all).to eq [el]
75
+ expect(element_matcher).to have_received(:match).once
76
+ end
77
+
78
+ it 'raises LocatorException if element continues to go stale' do
79
+ @locator = {xpath: './/div', id: 'foo'}
80
+
81
+ allow(driver).to receive(:find_elements).and_return([el])
82
+ stale_exception = Selenium::WebDriver::Error::StaleElementReferenceError
83
+ allow(element_matcher).to receive(:match).and_raise(stale_exception)
84
+
85
+ msg = 'Unable to locate element collection from {:xpath=>".//div", :id=>"foo"} due to changing page'
86
+ expect { locate_all }.to raise_exception Watir::Exception::LocatorException, msg
87
+ expect(element_matcher).to have_received(:match).exactly(3).times
88
+ end
89
+
90
+ it 'raises Argument error if using index key' do
91
+ expect { locate_all(index: 2) }.to raise_exception(ArgumentError, "can't locate all elements by :index")
92
+ end
93
+ end
94
+ end
95
+ end
96
+ end
97
+ end
@@ -0,0 +1,76 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../unit_helper'
4
+
5
+ module Watir
6
+ module Locators
7
+ class Button
8
+ describe Matcher do
9
+ include LocatorSpecHelper
10
+
11
+ let(:query_scope) { @query_scope || instance_double(Watir::Browser) }
12
+ let(:matcher) { described_class.new(query_scope, @selector) }
13
+
14
+ describe '#match' do
15
+ it 'value attribute matches value' do
16
+ elements = [wd_element(text: 'foo', attributes: {value: 'foo'}),
17
+ wd_element(text: 'bar', attributes: {value: 'bar'}),
18
+ wd_element(text: '', attributes: {value: 'foobar'})]
19
+ values_to_match = {value: 'foobar'}
20
+
21
+ expect(matcher.match(elements, values_to_match, :all)).to eq [elements[2]]
22
+ end
23
+
24
+ it 'returns empty array if neither value nor text match' do
25
+ elements = [wd_element(text: 'foo', attributes: {value: 'foo'}),
26
+ wd_element(text: 'bar', attributes: {value: 'bar'}),
27
+ wd_element(text: '', attributes: {value: 'foobar'})]
28
+ values_to_match = {value: 'nope'}
29
+
30
+ expect(matcher.match(elements, values_to_match, :all)).to eq []
31
+ end
32
+
33
+ it 'does not evaluate other parameters if value locator is not satisfied' do
34
+ elements = [wd_element(text: 'foo', attributes: {value: 'foo'}, displayed?: nil),
35
+ wd_element(text: 'bar', attributes: {value: 'bar'}, displayed?: nil),
36
+ wd_element(text: '', attributes: {value: 'foobar'}, displayed?: nil)]
37
+
38
+ values_to_match = {value: 'nope', visible: true}
39
+ expect(matcher.match(elements, values_to_match, :all)).to eq []
40
+ expect(elements[0]).not_to have_received(:displayed?)
41
+ expect(elements[1]).not_to have_received(:displayed?)
42
+ expect(elements[2]).not_to have_received(:displayed?)
43
+ end
44
+
45
+ it 'does not calculate value if not passed in' do
46
+ elements = [wd_element(displayed?: true, text: 'foo', attributes: {value: 'foo'}),
47
+ wd_element(displayed?: true, text: 'bar', attributes: {value: 'bar'})]
48
+ values_to_match = {visible: false}
49
+
50
+ expect(matcher.match(elements, values_to_match, :all)).to eq []
51
+ expect(elements[0]).not_to have_received(:text)
52
+ expect(elements[0]).not_to have_received(:text)
53
+ expect(elements[1]).not_to have_received(:attribute)
54
+ expect(elements[1]).not_to have_received(:attribute)
55
+ end
56
+
57
+ it 'returns empty array if element is not an input or button element' do
58
+ elements = [wd_element(tag_name: 'wrong', text: 'foob', attributes: {value: 'foo'}),
59
+ wd_element(tag_name: 'wrong', text: 'bar', attributes: {value: 'bar'})]
60
+ values_to_match = {tag_name: 'button', value: 'foo'}
61
+
62
+ expect(matcher.match(elements, values_to_match, :all)).to eq []
63
+ end
64
+
65
+ it 'returns empty array if element is an input element with wrong type' do
66
+ elements = [wd_element(tag_name: 'input', text: 'foob', attributes: {value: 'foo', type: 'radio'}),
67
+ wd_element(tag_name: 'input', text: 'bar', attributes: {value: 'bar', type: 'radio'})]
68
+ values_to_match = {tag_name: 'button', value: 'foo'}
69
+
70
+ expect(matcher.match(elements, values_to_match, :all)).to eq []
71
+ end
72
+ end
73
+ end
74
+ end
75
+ end
76
+ end
@@ -0,0 +1,424 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../unit_helper'
4
+
5
+ module Watir
6
+ module Locators
7
+ class Element
8
+ describe Matcher do
9
+ include LocatorSpecHelper
10
+
11
+ let(:query_scope) { @query_scope || browser }
12
+ let(:values_to_match) { @values_to_match || {} }
13
+ let(:matcher) { described_class.new(query_scope, values_to_match) }
14
+
15
+ describe '#match' do
16
+ context 'when a label element' do
17
+ it 'returns elements with for / id pairs' do
18
+ input_wds = [wd_element(tag_name: 'input', attributes: {id: 'foob_id'}),
19
+ wd_element(tag_name: 'input', attributes: {id: 'bfoo_id'}),
20
+ wd_element(tag_name: 'input', attributes: {id: 'foo_id'})]
21
+
22
+ label_wds = [wd_element(tag_name: 'label'),
23
+ wd_element(tag_name: 'label'),
24
+ wd_element(tag_name: 'label')]
25
+
26
+ allow(browser).to receive(:execute_script).and_return('foob', 'Foo', 'foo')
27
+
28
+ labels = [element(watir_element: Watir::Label, wd: label_wds[0], for: 'foob_id'),
29
+ element(watir_element: Watir::Label, wd: label_wds[1], for: 'bfoo_id'),
30
+ element(watir_element: Watir::Label, wd: label_wds[2], for: 'foo_id')]
31
+
32
+ allow(query_scope).to receive(:labels).and_return(labels)
33
+ allow_any_instance_of(Watir::Input).to receive(:wd).and_return(input_wds[2], input_wds[2])
34
+
35
+ values_to_match = {label_element: 'foo'}
36
+ expect(matcher.match(input_wds, values_to_match, :all)).to eq [input_wds[2]]
37
+ # Only the Watir::Label matching the text provided will have wd called
38
+ expect(labels[0]).not_to have_received(:for)
39
+ expect(labels[1]).not_to have_received(:for)
40
+ end
41
+
42
+ it 'returns elements without for / id pairs' do
43
+ input_wds = [wd_element(tag_name: 'input'),
44
+ wd_element(tag_name: 'input'),
45
+ wd_element(tag_name: 'input')]
46
+
47
+ inputs = [element(watir_element: Watir::Input, wd: input_wds[0]),
48
+ element(watir_element: Watir::Input, wd: input_wds[1]),
49
+ element(watir_element: Watir::Input, wd: input_wds[2])]
50
+
51
+ label_wds = [wd_element(tag_name: 'label'),
52
+ wd_element(tag_name: 'label'),
53
+ wd_element(tag_name: 'label')]
54
+
55
+ allow(browser).to receive(:execute_script).and_return('foob', 'Foo', 'foo')
56
+
57
+ labels = [element(watir_element: Watir::Label, wd: label_wds[0], for: '', input: inputs[0]),
58
+ element(watir_element: Watir::Label, wd: label_wds[1], for: '', input: inputs[1]),
59
+ element(watir_element: Watir::Label, wd: label_wds[2], for: '', input: inputs[2])]
60
+
61
+ allow(query_scope).to receive(:labels).and_return(labels)
62
+
63
+ values_to_match = {label_element: 'foo'}
64
+ expect(matcher.match(input_wds, values_to_match, :all)).to eq [input_wds[2]]
65
+
66
+ # Only the Watir::Label matching the text provided will have wd called
67
+ expect(labels[0]).not_to have_received(:for)
68
+ expect(labels[1]).not_to have_received(:for)
69
+ end
70
+
71
+ it 'returns elements with multiple matching label text but first missing corresponding element' do
72
+ input_wds = [wd_element(tag_name: 'input'),
73
+ wd_element(tag_name: 'input')]
74
+
75
+ inputs = [element(watir_element: Watir::Input, wd: wd_element(tag_name: 'input')),
76
+ element(watir_element: Watir::Input, wd: input_wds[1])]
77
+
78
+ label_wds = [wd_element(tag_name: 'label'),
79
+ wd_element(tag_name: 'label'),
80
+ wd_element(tag_name: 'label')]
81
+
82
+ allow(browser).to receive(:execute_script).and_return('foo', 'foo')
83
+
84
+ labels = [element(watir_element: Watir::Label, wd: label_wds[0], for: '', input: inputs[0]),
85
+ element(watir_element: Watir::Label, wd: label_wds[1], for: '', input: inputs[1])]
86
+
87
+ allow(query_scope).to receive(:labels).and_return(labels)
88
+
89
+ values_to_match = {label_element: 'foo'}
90
+
91
+ expect(matcher.match(input_wds, values_to_match, :all)).to eq [input_wds[1]]
92
+ end
93
+
94
+ it 'returns empty Array if no label element matches' do
95
+ input_wds = [wd_element(tag_name: 'input', attributes: {id: 'foo'}),
96
+ wd_element(tag_name: 'input', attributes: {id: 'bfoo'})]
97
+
98
+ label_wds = [wd_element(tag_name: 'label'),
99
+ wd_element(tag_name: 'label'),
100
+ wd_element(tag_name: 'label')]
101
+
102
+ allow(browser).to receive(:execute_script).and_return('Not this', 'or this')
103
+
104
+ labels = [element(watir_element: Watir::Label, wd: label_wds[0], for: 'foo'),
105
+ element(watir_element: Watir::Label, wd: label_wds[1], for: 'bfoo')]
106
+
107
+ allow(query_scope).to receive(:labels).and_return(labels)
108
+
109
+ values_to_match = {label_element: 'foo'}
110
+
111
+ expect(matcher.match(input_wds, values_to_match, :all)).to eq []
112
+ end
113
+
114
+ it 'returns empty Array if matching label elements do not have an corresponding input element' do
115
+ input_wds = [wd_element(tag_name: 'input'),
116
+ wd_element(tag_name: 'input')]
117
+
118
+ inputs = [element(watir_element: Watir::Input, wd: wd_element(tag_name: 'input')),
119
+ element(watir_element: Watir::Input, wd: wd_element(tag_name: 'input'))]
120
+
121
+ label_wds = [wd_element(tag_name: 'label'),
122
+ wd_element(tag_name: 'label')]
123
+
124
+ allow(browser).to receive(:execute_script).and_return('foob', 'foo')
125
+
126
+ labels = [element(watir_element: Watir::Label, wd: label_wds[0], for: '', input: inputs[0]),
127
+ element(watir_element: Watir::Label, wd: label_wds[1], for: '', input: inputs[1])]
128
+
129
+ allow(query_scope).to receive(:labels).and_return(labels)
130
+
131
+ values_to_match = {label_element: 'foo'}
132
+
133
+ expect(matcher.match(input_wds, values_to_match, :all)).to eq []
134
+ end
135
+ end
136
+
137
+ context 'when locating one element' do
138
+ before { @filter = :first }
139
+
140
+ it 'by tag name' do
141
+ elements = [wd_element(tag_name: 'div'),
142
+ wd_element(tag_name: 'span')]
143
+ @values_to_match = {tag_name: 'span'}
144
+
145
+ expect(matcher.match(elements, values_to_match, @filter)).to eq elements[1]
146
+ end
147
+
148
+ it 'by attribute' do
149
+ elements = [wd_element(attributes: {id: 'foo'}),
150
+ wd_element(attributes: {id: 'bar'}),
151
+ wd_element(attributes: {id: 'foobar'})]
152
+ @values_to_match = {id: 'foobar'}
153
+
154
+ expect(matcher.match(elements, values_to_match, @filter)).to eq elements[2]
155
+ end
156
+
157
+ it 'by class array' do
158
+ elements = [wd_element(attributes: {class: 'foob bar'}),
159
+ wd_element(attributes: {class: 'bar'}),
160
+ wd_element(attributes: {class: 'bar foo'})]
161
+ @values_to_match = {class: %w[foo bar]}
162
+
163
+ expect(matcher.match(elements, values_to_match, @filter)).to eq elements[2]
164
+ end
165
+
166
+ it 'by positive index' do
167
+ elements = [wd_element(tag_name: 'div'),
168
+ wd_element(tag_name: 'span'),
169
+ wd_element(tag_name: 'div')]
170
+
171
+ @values_to_match = {tag_name: 'div', index: 1}
172
+
173
+ expect(matcher.match(elements, values_to_match, @filter)).to eq elements[2]
174
+ end
175
+
176
+ it 'by negative index' do
177
+ elements = [wd_element(tag_name: 'div'),
178
+ wd_element(tag_name: 'span'),
179
+ wd_element(tag_name: 'div')]
180
+
181
+ @values_to_match = {tag_name: 'div', index: -1}
182
+
183
+ expect(matcher.match(elements.dup, values_to_match, @filter)).to eq elements[2]
184
+ end
185
+
186
+ it 'by visibility true' do
187
+ elements = [wd_element(tag_name: 'div', displayed?: false),
188
+ wd_element(tag_name: 'span', displayed?: true)]
189
+ @values_to_match = {visible: true}
190
+
191
+ expect(matcher.match(elements, values_to_match, @filter)).to eq elements[1]
192
+ end
193
+
194
+ it 'by visibility false' do
195
+ elements = [wd_element(tag_name: 'div', displayed?: true),
196
+ wd_element(tag_name: 'span', displayed?: false)]
197
+ @values_to_match = {visible: false}
198
+
199
+ expect(matcher.match(elements, values_to_match, @filter)).to eq elements[1]
200
+ end
201
+
202
+ it 'by text' do
203
+ elements = [wd_element, wd_element]
204
+ @values_to_match = {text: 'Foob'}
205
+
206
+ allow(browser).to receive(:execute_script).and_return('foo', 'Foob')
207
+
208
+ expect(matcher.match(elements, values_to_match, @filter)).to eq elements[1]
209
+ end
210
+
211
+ it 'by visible text' do
212
+ elements = [wd_element(text: 'foo'),
213
+ wd_element(text: 'Foob')]
214
+ @values_to_match = {visible_text: /Foo|Bar/}
215
+
216
+ allow(elements[0]).to receive(:text).and_return 'foo'
217
+ allow(elements[1]).to receive(:text).and_return 'Foob'
218
+
219
+ expect(matcher.match(elements, values_to_match, @filter)).to eq elements[1]
220
+ end
221
+
222
+ it 'by href' do
223
+ elements = [wd_element(tag_name: 'div', attributes: {href: 'froo.com'}),
224
+ wd_element(tag_name: 'span', attributes: {href: 'bar.com'})]
225
+ @values_to_match = {href: /foo|bar/}
226
+
227
+ expect(matcher.match(elements, values_to_match, @filter)).to eq elements[1]
228
+ end
229
+
230
+ it "returns nil if found element doesn't match the selector tag_name" do
231
+ elements = [wd_element(tag_name: 'div')]
232
+
233
+ @values_to_match = {tag_name: 'span'}
234
+
235
+ expect(matcher.match(elements, values_to_match, @filter)).to be_nil
236
+ end
237
+ end
238
+
239
+ context 'when locating collection' do
240
+ before { @filter = :all }
241
+
242
+ it 'by tag name' do
243
+ elements = [wd_element(tag_name: 'div'),
244
+ wd_element(tag_name: 'span'),
245
+ wd_element(tag_name: 'div')]
246
+ @values_to_match = {tag_name: 'div'}
247
+
248
+ expect(matcher.match(elements, values_to_match, @filter)).to eq [elements[0], elements[2]]
249
+ end
250
+
251
+ it 'by attribute' do
252
+ elements = [wd_element(attributes: {foo: 'foo'}),
253
+ wd_element(attributes: {foo: 'bar'}),
254
+ wd_element(attributes: {foo: 'foo'})]
255
+ @values_to_match = {foo: 'foo'}
256
+
257
+ expect(matcher.match(elements, values_to_match, @filter)).to eq [elements[0], elements[2]]
258
+ end
259
+
260
+ it 'by single class' do
261
+ elements = [wd_element(attributes: {class: 'foo bar cool'}),
262
+ wd_element(attributes: {class: 'foob bar'}),
263
+ wd_element(attributes: {class: 'bar foo foobar'})]
264
+ @values_to_match = {class: 'foo'}
265
+
266
+ expect(matcher.match(elements, values_to_match, @filter)).to eq [elements[0], elements[2]]
267
+ end
268
+
269
+ it 'by class array' do
270
+ elements = [wd_element(attributes: {class: 'foo bar cool'}),
271
+ wd_element(attributes: {class: 'foob bar'}),
272
+ wd_element(attributes: {class: 'bar foo foobar'})]
273
+ @values_to_match = {class: %w[foo bar]}
274
+
275
+ expect(matcher.match(elements, values_to_match, @filter)).to eq [elements[0], elements[2]]
276
+ end
277
+
278
+ it 'by visibility true' do
279
+ elements = [wd_element(tag_name: 'div'),
280
+ wd_element(tag_name: 'span'),
281
+ wd_element(tag_name: 'div')]
282
+ @values_to_match = {visible: true}
283
+
284
+ allow(elements[0]).to receive(:displayed?).and_return false
285
+ allow(elements[1]).to receive(:displayed?).and_return true
286
+ allow(elements[2]).to receive(:displayed?).and_return true
287
+
288
+ expect(matcher.match(elements, values_to_match, @filter)).to eq [elements[1], elements[2]]
289
+ end
290
+
291
+ it 'by visibility false' do
292
+ elements = [wd_element(displayed?: false),
293
+ wd_element(displayed?: true),
294
+ wd_element(displayed?: false)]
295
+ @values_to_match = {visible: false}
296
+
297
+ expect(matcher.match(elements, values_to_match, @filter)).to eq [elements[0], elements[2]]
298
+ end
299
+
300
+ it 'by text' do
301
+ elements = [wd_element, wd_element, wd_element]
302
+ @values_to_match = {text: /Foo|Bar/}
303
+
304
+ allow(browser).to receive(:execute_script).and_return('foo', 'Foob', 'bBarb')
305
+
306
+ expect(matcher.match(elements, values_to_match, @filter)).to eq [elements[1], elements[2]]
307
+ end
308
+
309
+ it 'by visible text' do
310
+ elements = [wd_element(text: 'foo'),
311
+ wd_element(text: 'Foob'),
312
+ wd_element(text: 'bBarb')]
313
+ @values_to_match = {visible_text: /Foo|Bar/}
314
+
315
+ expect(matcher.match(elements, values_to_match, @filter)).to eq [elements[1], elements[2]]
316
+ end
317
+
318
+ it 'by href' do
319
+ elements = [wd_element(attributes: {href: 'froo.com'}),
320
+ wd_element(attributes: {href: 'bar.com'}),
321
+ wd_element(attributes: {href: 'foobar.com'})]
322
+ @values_to_match = {href: /foo|bar/}
323
+
324
+ expect(matcher.match(elements, values_to_match, @filter)).to eq [elements[1], elements[2]]
325
+ end
326
+
327
+ it 'returns empty Array if found no element matches the selector tag_name' do
328
+ elements = [wd_element(tag_name: 'div')]
329
+
330
+ @values_to_match = {tag_name: 'span'}
331
+
332
+ expect(matcher.match(elements, values_to_match, @filter)).to eq []
333
+ end
334
+ end
335
+
336
+ context 'when matching Regular Expressions' do
337
+ it 'with white space' do
338
+ allow(browser).to receive(:execute_script).and_return("\n match this \n", 'no', 'match this')
339
+
340
+ elements = [wd_element,
341
+ wd_element,
342
+ wd_element]
343
+ @values_to_match = {text: /^match this$/}
344
+
345
+ expect(matcher.match(elements, values_to_match, @filter)).to eq [elements[0], elements[2]]
346
+ end
347
+
348
+ it 'with tag_name' do
349
+ elements = [wd_element(tag_name: 'div'),
350
+ wd_element(tag_name: 'span'),
351
+ wd_element(tag_name: 'div')]
352
+ @values_to_match = {tag_name: /d|q/}
353
+
354
+ expect(matcher.match(elements, values_to_match, @filter)).to eq [elements[0], elements[2]]
355
+ end
356
+
357
+ it 'with single class' do
358
+ elements = [wd_element(attributes: {class: 'foo bar cool'}),
359
+ wd_element(attributes: {class: 'foob bar'}),
360
+ wd_element(attributes: {class: 'bar foo foobar'})]
361
+ @values_to_match = {class: /foob|q/}
362
+
363
+ expect(matcher.match(elements, values_to_match, @filter)).to eq [elements[1], elements[2]]
364
+ end
365
+
366
+ it 'with multiple classes' do
367
+ elements = [wd_element(attributes: {class: 'foo bar cool'}),
368
+ wd_element(attributes: {class: 'foob bar'}),
369
+ wd_element(attributes: {class: 'bar foo foobar'})]
370
+ @values_to_match = {class: [/foob/, /bar/]}
371
+
372
+ expect(matcher.match(elements, values_to_match, @filter)).to eq [elements[1], elements[2]]
373
+ end
374
+
375
+ it 'with attributes' do
376
+ elements = [wd_element(attributes: {foo: 'foo'}),
377
+ wd_element(attributes: {foo: 'bar'}),
378
+ wd_element(attributes: {foo: 'foo'})]
379
+ @values_to_match = {foo: /fo/}
380
+
381
+ expect(matcher.match(elements, values_to_match, @filter)).to eq [elements[0], elements[2]]
382
+ end
383
+ end
384
+
385
+ context 'when matching text Regexp' do
386
+ let(:elements) { [wd_element, wd_element] }
387
+
388
+ before { allow(browser).to receive(:execute_script).and_return('all visible', 'some visible') }
389
+
390
+ it 'not thrown when still matched by text content' do
391
+ values_to_match = {text: /some visible/}
392
+
393
+ expect(matcher.match(elements, values_to_match, :first)).to eq elements[1]
394
+ end
395
+
396
+ it 'not thrown with complex regexp matched by text content' do
397
+ values_to_match = {text: /some (in|)visible/}
398
+
399
+ expect(matcher.match(elements, values_to_match, :first)).to eq elements[1]
400
+ end
401
+
402
+ it 'thrown when no longer matched by text content' do
403
+ values_to_match = {text: /some visible$/}
404
+
405
+ expect(matcher.match(elements, values_to_match, :first)).to eq elements[1]
406
+ end
407
+
408
+ it 'not thrown when element does not exist' do
409
+ values_to_match = {text: /definitely not there/}
410
+
411
+ expect(matcher.match(elements, values_to_match, :first)).to be_nil
412
+ end
413
+
414
+ it 'keeps element from being located' do
415
+ values_to_match = {text: /some visible some hidden/}
416
+
417
+ expect(matcher.match(elements, values_to_match, :first)).to be_nil
418
+ end
419
+ end
420
+ end
421
+ end
422
+ end
423
+ end
424
+ end
@@ -0,0 +1,84 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative '../unit_helper'
4
+
5
+ module Watir
6
+ module Locators
7
+ class TextField
8
+ describe Matcher do
9
+ include LocatorSpecHelper
10
+
11
+ let(:query_scope) { @query_scope || instance_double(Watir::Browser) }
12
+ let(:matcher) { described_class.new(query_scope, @selector) }
13
+
14
+ describe '#match?' do
15
+ context 'when input element' do
16
+ it 'converts text to value' do
17
+ elements = [wd_element(tag_name: 'input', attributes: {value: 'foo'}, text: nil),
18
+ wd_element(tag_name: 'input', attributes: {value: 'Foob'}, text: nil)]
19
+ values_to_match = {text: 'Foob'}
20
+
21
+ expect(matcher.match(elements, values_to_match, :all)).to eq [elements[1]]
22
+ expect(elements[0]).not_to have_received(:text)
23
+ expect(elements[1]).not_to have_received(:text)
24
+ end
25
+
26
+ it 'converts label to value' do
27
+ elements = [wd_element(tag_name: 'input', attributes: {value: 'foo'}),
28
+ wd_element(tag_name: 'input', attributes: {value: 'Foob'})]
29
+ values_to_match = {label: 'Foob'}
30
+
31
+ expect(matcher.match(elements, values_to_match, :all)).to eq [elements[1]]
32
+ expect(elements[0]).not_to have_received(:attribute).with(values_to_match)
33
+ expect(elements[1]).not_to have_received(:attribute).with(values_to_match)
34
+ end
35
+
36
+ it 'converts visible_text to value' do
37
+ elements = [wd_element(tag_name: 'input', attributes: {value: 'foo'}),
38
+ wd_element(tag_name: 'input', attributes: {value: 'Foob'})]
39
+ values_to_match = {visible_text: 'Foob'}
40
+
41
+ expect(matcher.match(elements, values_to_match, :all)).to eq [elements[1]]
42
+ expect(elements[0]).not_to have_received(:attribute).with(values_to_match)
43
+ expect(elements[1]).not_to have_received(:attribute).with(values_to_match)
44
+ end
45
+ end
46
+
47
+ context 'when label element' do
48
+ it 'converts value to text' do
49
+ elements = [wd_element(tag_name: 'label', attribute: nil),
50
+ wd_element(tag_name: 'label', attribute: nil)]
51
+ values_to_match = {value: 'Foob'}
52
+
53
+ allow(query_scope).to receive(:execute_script).and_return('foo', 'Foob')
54
+ expect(elements[0]).not_to have_received(:attribute)
55
+ expect(elements[1]).not_to have_received(:attribute)
56
+
57
+ expect(matcher.match(elements, values_to_match, :all)).to eq [elements[1]]
58
+ end
59
+
60
+ it 'converts label to text' do
61
+ elements = [wd_element(tag_name: 'label', attribute: nil),
62
+ wd_element(tag_name: 'label', attribute: nil)]
63
+ values_to_match = {label: 'Foob'}
64
+
65
+ allow(query_scope).to receive(:execute_script).and_return('foo', 'Foob')
66
+
67
+ expect(matcher.match(elements, values_to_match, :all)).to eq [elements[1]]
68
+ expect(elements[0]).not_to have_received(:attribute)
69
+ expect(elements[1]).not_to have_received(:attribute)
70
+ end
71
+ end
72
+
73
+ it 'returns empty array if element is not an input' do
74
+ elements = [wd_element(tag_name: 'wrong', text: 'foob', attributes: {value: 'foo'}),
75
+ wd_element(tag_name: 'wrong', text: 'bar', attributes: {value: 'bar'})]
76
+ values_to_match = {tag_name: 'input', value: 'foo'}
77
+
78
+ expect(matcher.match(elements, values_to_match, :all)).to eq []
79
+ end
80
+ end
81
+ end
82
+ end
83
+ end
84
+ end