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,156 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ class IFrame < HTMLElement
5
+ #
6
+ # Move Driver context into the iframe
7
+ #
8
+
9
+ def switch_to!
10
+ locate unless located?
11
+ wd.switch!
12
+ end
13
+
14
+ #
15
+ # Returns text of iframe body.
16
+ # #body ensures context so this method does not have to
17
+ #
18
+ # @return [String]
19
+ #
20
+
21
+ def text
22
+ body.text
23
+ end
24
+
25
+ #
26
+ # Returns HTML code of iframe.
27
+ #
28
+ # @return [String]
29
+ #
30
+
31
+ def html
32
+ wd.page_source
33
+ end
34
+
35
+ #
36
+ # Delegate sending keystrokes to FramedDriver
37
+ #
38
+
39
+ def send_keys(*args)
40
+ wd.send_keys(*args)
41
+ end
42
+
43
+ #
44
+ # Executes JavaScript snippet in context of frame.
45
+ #
46
+ # @see Watir::Browser#execute_script
47
+ #
48
+
49
+ def execute_script(script, *args, function_name: nil)
50
+ args.map! do |e|
51
+ Watir.logger.info "Executing Script on Frame: #{function_name}" if function_name
52
+ e.is_a?(Element) ? e.wait_until(&:exists?).wd : e
53
+ end
54
+ returned = driver.execute_script(script, *args)
55
+
56
+ browser.wrap_elements_in(self, returned)
57
+ end
58
+
59
+ #
60
+ # Provides access to underlying Selenium Objects as delegated by FramedDriver
61
+ #
62
+ # @return [Watir::FramedDriver]
63
+ #
64
+
65
+ def wd
66
+ super
67
+ FramedDriver.new(@element, browser)
68
+ end
69
+
70
+ #
71
+ # Cast this Element instance to a more specific subtype.
72
+ # Cached element needs to be the IFrame element, not the FramedDriver
73
+ #
74
+
75
+ def to_subtype
76
+ super.tap { |el| el.cache = @element }
77
+ end
78
+
79
+ private
80
+
81
+ def unknown_exception
82
+ UnknownFrameException
83
+ end
84
+ end # IFrame
85
+
86
+ class IFrameCollection < ElementCollection
87
+ end # IFrameCollection
88
+
89
+ class Frame < IFrame
90
+ end # Frame
91
+
92
+ class FrameCollection < IFrameCollection
93
+ end # FrameCollection
94
+
95
+ module Container
96
+ def frame(opts = {})
97
+ Frame.new(self, opts.merge(tag_name: 'frame'))
98
+ end
99
+
100
+ def frames(opts = {})
101
+ FrameCollection.new(self, opts.merge(tag_name: 'frame'))
102
+ end
103
+ end # Container
104
+
105
+ #
106
+ # @api private
107
+ #
108
+
109
+ class FramedDriver
110
+ include Exception
111
+
112
+ def initialize(element, browser)
113
+ @element = element
114
+ @browser = browser
115
+ @driver = browser.wd
116
+ end
117
+
118
+ def ==(other)
119
+ wd == other.wd
120
+ end
121
+ alias eql? ==
122
+
123
+ def send_keys(*args)
124
+ switch!
125
+ @driver.switch_to.active_element.send_keys(*args)
126
+ end
127
+
128
+ def switch!
129
+ @driver.switch_to.frame @element
130
+ @browser.default_context = false
131
+ rescue Selenium::WebDriver::Error::NoSuchFrameError => e
132
+ raise UnknownFrameException, e.message
133
+ end
134
+
135
+ def wd
136
+ @element
137
+ end
138
+
139
+ def respond_to_missing?(meth, _include_private)
140
+ @driver.respond_to?(meth) || @element.respond_to?(meth) || super(meth, false)
141
+ end
142
+
143
+ def method_missing(meth, *args, &blk)
144
+ if %i[find_element find_elements].include?(meth)
145
+ @driver.send(meth, *args, &blk)
146
+ elsif @driver.respond_to?(meth)
147
+ switch!
148
+ @driver.send(meth, *args, &blk)
149
+ elsif @element.respond_to?(meth)
150
+ @element.send(meth, *args, &blk)
151
+ else
152
+ super
153
+ end
154
+ end
155
+ end # FramedDriver
156
+ end # Watir
@@ -0,0 +1,22 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ class Image < HTMLElement
5
+ #
6
+ # Returns true if image is loaded.
7
+ #
8
+ # @return [Boolean]
9
+ #
10
+
11
+ def loaded?
12
+ return false unless complete?
13
+
14
+ element_call { execute_js(:isImageLoaded, @element) }
15
+ end
16
+ end # Image
17
+
18
+ module Container
19
+ alias image img
20
+ alias images imgs
21
+ end # Container
22
+ end # Watir
@@ -0,0 +1,15 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ class Input < HTMLElement
5
+ #
6
+ # Returns label element associated with Input element.
7
+ #
8
+ # @return [Watir::Label]
9
+ #
10
+
11
+ def label
12
+ parent(tag_name: 'form').label(for: id)
13
+ end
14
+ end # Input
15
+ end # Watir
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Container
5
+ alias link a
6
+ alias links as
7
+ end # Container
8
+ end # Watir
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module List
5
+ include Enumerable
6
+
7
+ #
8
+ # Yields each LI associated with this list.
9
+ #
10
+ # @example
11
+ # list = browser.ol
12
+ # list.each do |li|
13
+ # puts li.text
14
+ # end
15
+ #
16
+ # @yieldparam [Watir::LI] element Iterate through the items for this List.
17
+ #
18
+
19
+ def each(&block)
20
+ list_items.each(&block)
21
+ end
22
+
23
+ alias length count
24
+ alias size count
25
+ alias items count
26
+ alias empty? none?
27
+
28
+ #
29
+ # Returns item from this list at given index.
30
+ #
31
+ # @param [Integer] idx
32
+ # @return Watir::LI
33
+ #
34
+
35
+ def [](idx)
36
+ list_items[idx]
37
+ end
38
+
39
+ def list_items
40
+ LICollection.new(self, adjacent: :child, tag_name: 'li')
41
+ end
42
+ end # List
43
+
44
+ class OList < HTMLElement
45
+ include List
46
+ end
47
+
48
+ class UList < HTMLElement
49
+ include List
50
+ end
51
+ end # Watir
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ #
5
+ # Represents an option in a select list.
6
+ #
7
+
8
+ class Option < HTMLElement
9
+ #
10
+ # Selects this option.
11
+ #
12
+ # @example
13
+ # browser.select(id: "foo").options.first.select
14
+ #
15
+
16
+ alias select click
17
+
18
+ #
19
+ # Toggles the selected state of this option.
20
+ #
21
+ # @example
22
+ # browser.select(id: "foo").options.first.toggle
23
+ #
24
+
25
+ alias toggle click
26
+
27
+ #
28
+ # Clears (i.e. toggles selected state) option.
29
+ #
30
+ # @example
31
+ # browser.select(id: "foo").options.first.clear
32
+ #
33
+
34
+ def clear
35
+ click if selected?
36
+ end
37
+
38
+ #
39
+ # Is this option selected?
40
+ #
41
+ # @return [Boolean]
42
+ #
43
+
44
+ def selected?
45
+ element_call { @element.selected? }
46
+ end
47
+
48
+ #
49
+ # Returns the text of option.
50
+ #
51
+ # getAttribute atom pulls the text value if the label does not exist
52
+ #
53
+ # @return [String]
54
+ #
55
+
56
+ def text
57
+ attribute_value(:label)
58
+ end
59
+ end # Option
60
+ end # Watir
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ class Radio < Input
5
+ def build
6
+ @selector[:label] = @selector.delete(:text) if @selector.key?(:text)
7
+ super
8
+ end
9
+
10
+ #
11
+ # Selects this radio button.
12
+ #
13
+
14
+ def set(bool = true)
15
+ click if bool && !set?
16
+ end
17
+ alias select set
18
+
19
+ #
20
+ # Is this radio set?
21
+ #
22
+ # @return [Boolean]
23
+ #
24
+
25
+ def set?
26
+ element_call { @element.selected? }
27
+ end
28
+ alias selected? set?
29
+
30
+ #
31
+ # Returns the text of the associated label.
32
+ # Returns empty string if no label is found.
33
+ #
34
+ # @return [String]
35
+ #
36
+
37
+ def text
38
+ l = label
39
+ l.exist? ? l.text : ''
40
+ end
41
+ end # Radio
42
+
43
+ module Container
44
+ def radio(opts = {})
45
+ Radio.new(self, opts.merge(tag_name: 'input', type: 'radio'))
46
+ end
47
+
48
+ def radios(opts = {})
49
+ RadioCollection.new(self, opts.merge(tag_name: 'input', type: 'radio'))
50
+ end
51
+ end # Container
52
+
53
+ class RadioCollection < InputCollection
54
+ private
55
+
56
+ def build
57
+ @selector[:label] = @selector.delete(:text) if @selector.key?(:text)
58
+ super
59
+ end
60
+
61
+ def element_class
62
+ Radio
63
+ end
64
+ end # RadioCollection
65
+ end # Watir
@@ -0,0 +1,18 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ #
5
+ # Custom class representing table row (tr).
6
+ #
7
+
8
+ class Row < TableRow
9
+ end # Row
10
+
11
+ class RowCollection < TableRowCollection
12
+ def to_a
13
+ # we do this craziness since the xpath used will find direct child rows
14
+ # before any rows inside thead/tbody/tfoot...
15
+ @to_a ||= super.sort_by { |e| e.attribute_value(:rowIndex).to_i }
16
+ end
17
+ end
18
+ end # Watir
@@ -0,0 +1,214 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ class Select < HTMLElement
5
+ #
6
+ # Clears all selected options.
7
+ #
8
+
9
+ def clear
10
+ raise Exception::Error, 'you can only clear multi-selects' unless multiple_select_list?
11
+
12
+ selected_options.each(&:click)
13
+ end
14
+
15
+ #
16
+ # Returns true if the select list has one or more options where text or label matches the given value.
17
+ #
18
+ # @param [String, Regexp] str_or_rx
19
+ # @return [Boolean]
20
+ #
21
+
22
+ def include?(str_or_rx)
23
+ option(text: str_or_rx).exist? || option(label: str_or_rx).exist? || option(value: str_or_rx).exist?
24
+ end
25
+
26
+ #
27
+ # Select the option whose text or label matches the given string.
28
+ #
29
+ # @param [String, Regexp] str_or_rx
30
+ # @raise [Watir::Exception::NoValueFoundException] if the value does not exist.
31
+ # @return [String] The text of the option selected. If multiple options match, returns the first match.
32
+ #
33
+
34
+ def select(*str_or_rx, text: nil, value: nil, label: nil)
35
+ key, value = parse_select_args(str_or_rx, text, value, label)
36
+
37
+ if value.size > 1 || value.first.is_a?(Array)
38
+ value.flatten.map { |v| select_all_by key, v }.first
39
+ else
40
+ select_matching([find_option(key, value.flatten.first)])
41
+ end
42
+ end
43
+ alias set select
44
+
45
+ #
46
+ # Uses JavaScript to select the option whose text matches the given string.
47
+ #
48
+ # @param [String, Regexp] str_or_rx
49
+ # @raise [Watir::Exception::NoValueFoundException] if the value does not exist.
50
+ #
51
+
52
+ def select!(*str_or_rx, text: nil, value: nil, label: nil)
53
+ key, value = parse_select_args(str_or_rx, text, value, label)
54
+
55
+ if value.size > 1 || value.first.is_a?(Array)
56
+ value.flatten.map { |v| select_by! key, v, :multiple }.first
57
+ else
58
+ value.flatten.map { |v| select_by! key, v, :single }.first
59
+ end
60
+ end
61
+
62
+ #
63
+ # Returns true if any of the selected options' text or label matches the given value.
64
+ #
65
+ # @param [String, Regexp] str_or_rx
66
+ # @raise [Watir::Exception::UnknownObjectException] if the options do not exist
67
+ # @return [Boolean]
68
+ #
69
+
70
+ def selected?(*str_or_rx, text: nil, value: nil, label: nil)
71
+ key, value = parse_select_args(str_or_rx, text, value, label)
72
+
73
+ find_option(key, value.first).selected?
74
+ end
75
+
76
+ #
77
+ # Returns the value of the first selected option in the select list.
78
+ # Returns nil if no option is selected.
79
+ #
80
+ # @return [String, nil]
81
+ #
82
+
83
+ def value
84
+ selected_options.first&.value
85
+ end
86
+
87
+ #
88
+ # Returns the text of the first selected option in the select list.
89
+ # Returns nil if no option is selected.
90
+ #
91
+ # @return [String, nil]
92
+ #
93
+
94
+ # TODO: What is default behavior without #first ?
95
+ def text
96
+ selected_options.first&.text
97
+ end
98
+
99
+ # Returns an array of currently selected options.
100
+ #
101
+ # @return [Array<Watir::Option>]
102
+ #
103
+
104
+ def selected_options
105
+ element_call { execute_js :selectedOptions, self }
106
+ end
107
+
108
+ private
109
+
110
+ def multiple_select_list?
111
+ @multiple_select = @multiple_select.nil? ? multiple? : @multiple_select
112
+ end
113
+
114
+ def parse_select_args(str_or_rx, text, value, label)
115
+ selectors = {}
116
+ selectors[:any] = str_or_rx unless str_or_rx.empty?
117
+ selectors[:text] = [text] if text
118
+ selectors[:value] = [value] if value
119
+ selectors[:label] = [label] if label
120
+
121
+ raise ArgumentError, "too many arguments used for Select#select: #{selectors}" if selectors.size > 1
122
+
123
+ selectors.first
124
+ end
125
+
126
+ def select_by!(key, str_or_rx, number)
127
+ str_or_rx = type_check(str_or_rx)
128
+
129
+ js_rx = process_str_or_rx(str_or_rx)
130
+ approaches = key == :any ? %w[Text Label Value] : [key.to_s.capitalize]
131
+
132
+ approaches.each do |approach|
133
+ element_call { execute_js("selectOptions#{approach}", self, js_rx, number.to_s) }
134
+ return selected_options.first.text if matching_option?(approach.downcase, str_or_rx)
135
+ end
136
+
137
+ raise_no_value_found(str_or_rx)
138
+ end
139
+
140
+ def process_str_or_rx(str_or_rx)
141
+ case str_or_rx
142
+ when String
143
+ "^#{str_or_rx}$"
144
+ when Regexp
145
+ str_or_rx.inspect.sub('\\A', '^')
146
+ .sub('\\Z', '$')
147
+ .sub('\\z', '$')
148
+ .sub(%r{^/}, '')
149
+ .sub(%r{/[a-z]*$}, '')
150
+ .gsub(/\(\?#.+\)/, '')
151
+ .gsub(/\(\?-\w+:/, '(')
152
+ else
153
+ raise TypeError, "expected String or Regexp, got #{str_or_rx.inspect}:#{str_or_rx.class}"
154
+ end
155
+ end
156
+
157
+ def matching_option?(how, what)
158
+ selected_options.each do |opt|
159
+ value = opt.send(how)
160
+ next unless what.is_a?(String) ? value == what : value =~ what
161
+ return true if opt.enabled?
162
+
163
+ raise ObjectDisabledException, "option matching #{what} by #{how} on #{inspect} is disabled"
164
+ end
165
+ false
166
+ end
167
+
168
+ def select_all_by(key, str_or_rx)
169
+ raise Error, 'you can only use #select_all on multi-selects' unless multiple_select_list?
170
+
171
+ select_matching(find_options(key, str_or_rx))
172
+ end
173
+
174
+ def find_option(key, str_or_rx)
175
+ val = type_check(str_or_rx)
176
+
177
+ option(key => val).wait_until(&:exists?)
178
+ rescue Wait::TimeoutError
179
+ raise_no_value_found(str_or_rx)
180
+ end
181
+
182
+ def find_options(key, str_or_rx)
183
+ val = type_check(str_or_rx)
184
+
185
+ options(key => val).wait_until(&:exists?)
186
+ rescue Wait::TimeoutError
187
+ raise_no_value_found(str_or_rx)
188
+ end
189
+
190
+ def type_check(str_or_rx)
191
+ str_or_rx = str_or_rx.to_s if str_or_rx.is_a?(Numeric)
192
+ return str_or_rx if [String, Regexp].any? { |k| str_or_rx.is_a?(k) }
193
+
194
+ raise TypeError, "expected String, Numeric or Regexp, got #{str_or_rx.inspect}:#{str_or_rx.class}"
195
+ end
196
+
197
+ # TODO: Consider locating the Select List before throwing the exception
198
+ def raise_no_value_found(str_or_rx)
199
+ raise NoValueFoundException, "#{str_or_rx.inspect} not found in #{inspect}"
200
+ end
201
+
202
+ def select_matching(elements)
203
+ elements.each { |e| e.click unless e.selected? }
204
+ elements.first.exists? ? elements.first.text : ''
205
+ end
206
+ end # Select
207
+
208
+ module Container
209
+ alias select_list select
210
+ alias select_lists selects
211
+
212
+ Watir.tag_to_class[:select_list] = Select
213
+ end # Container
214
+ end # Watir