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,50 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Locators
5
+ class TextField
6
+ class SelectorBuilder
7
+ class XPath < Element::SelectorBuilder::XPath
8
+ def text_string
9
+ return super if @adjacent
10
+
11
+ @built[:text] = @selector.delete(:text) if @selector.key?(:text)
12
+ ''
13
+ end
14
+
15
+ def additional_string
16
+ return '' if @adjacent
17
+
18
+ type_string(@selector.delete(:type))
19
+ end
20
+
21
+ def tag_string
22
+ @selector[:tag_name] = 'input' unless @adjacent
23
+ super
24
+ end
25
+
26
+ def type_string(type)
27
+ if type.eql?(true)
28
+ "[#{negative_type_text}]"
29
+ elsif Watir::TextField::NON_TEXT_TYPES.include?(type)
30
+ msg = "TextField Elements can not be located by type: #{type}"
31
+ raise LocatorException, msg
32
+ elsif type.nil?
33
+ "[not(@type) or (#{negative_type_text})]"
34
+ else
35
+ "[#{process_attribute(:type, type)}]"
36
+ end
37
+ end
38
+
39
+ def negative_type_text
40
+ Watir::TextField::NON_TEXT_TYPES.map { |type|
41
+ lhs = lhs_for(:type, downcase: true)
42
+ rhs = SelectorBuilder::XpathSupport.downcase(SelectorBuilder::XpathSupport.escape(type))
43
+ "#{lhs}!=#{rhs}"
44
+ }.join(' and ')
45
+ end
46
+ end
47
+ end
48
+ end
49
+ end
50
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Locators
5
+ class TextField
6
+ class SelectorBuilder < Element::SelectorBuilder
7
+ end
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,77 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'watir/locators/element/locator'
4
+ require 'watir/locators/element/selector_builder'
5
+ require 'watir/locators/element/selector_builder/xpath_support'
6
+ require 'watir/locators/element/selector_builder/regexp_disassembler'
7
+ require 'watir/locators/element/selector_builder/xpath'
8
+ require 'watir/locators/element/matcher'
9
+
10
+ require 'watir/locators/anchor/selector_builder'
11
+
12
+ require 'watir/locators/button/selector_builder'
13
+ require 'watir/locators/button/selector_builder/xpath'
14
+ require 'watir/locators/button/matcher'
15
+
16
+ require 'watir/locators/cell/selector_builder'
17
+ require 'watir/locators/cell/selector_builder/xpath'
18
+
19
+ require 'watir/locators/option/matcher'
20
+ require 'watir/locators/option/selector_builder'
21
+ require 'watir/locators/option/selector_builder/xpath'
22
+
23
+ require 'watir/locators/row/selector_builder'
24
+ require 'watir/locators/row/selector_builder/xpath'
25
+
26
+ require 'watir/locators/text_area/selector_builder'
27
+ require 'watir/locators/text_area/selector_builder/xpath'
28
+
29
+ require 'watir/locators/text_field/selector_builder'
30
+ require 'watir/locators/text_field/selector_builder/xpath'
31
+ require 'watir/locators/text_field/matcher'
32
+
33
+ module Watir
34
+ module Locators
35
+ W3C_FINDERS = %i[css xpath].freeze
36
+
37
+ module ClassHelpers
38
+ def locator_class
39
+ class_from_string("#{browser.locator_namespace}::#{element_class_name}::Locator") ||
40
+ class_from_string("Watir::Locators::#{element_class_name}::Locator") ||
41
+ class_from_string("#{browser.locator_namespace}::Element::Locator") ||
42
+ Locators::Element::Locator
43
+ end
44
+
45
+ def element_matcher_class
46
+ class_from_string("#{browser.locator_namespace}::#{element_class_name}::Matcher") ||
47
+ class_from_string("Watir::Locators::#{element_class_name}::Matcher") ||
48
+ class_from_string("#{browser.locator_namespace}::Element::Matcher") ||
49
+ Locators::Element::Matcher
50
+ end
51
+
52
+ def selector_builder_class
53
+ class_from_string("#{browser.locator_namespace}::#{element_class_name}::SelectorBuilder") ||
54
+ class_from_string("Watir::Locators::#{element_class_name}::SelectorBuilder") ||
55
+ class_from_string("#{browser.locator_namespace}::Element::SelectorBuilder") ||
56
+ Locators::Element::SelectorBuilder
57
+ end
58
+
59
+ def class_from_string(string)
60
+ Watir.const_get(string) if Watir.const_defined?(string)
61
+ end
62
+
63
+ def element_class_name
64
+ element_class.to_s.split('::').last
65
+ end
66
+
67
+ def selector_builder
68
+ @selector_builder ||= selector_builder_class.new(element_class.attribute_list, @query_scope)
69
+ end
70
+
71
+ def locator
72
+ @element_matcher ||= element_matcher_class.new(@query_scope, @selector.dup)
73
+ @locator ||= locator_class.new(@element_matcher)
74
+ end
75
+ end
76
+ end
77
+ end
@@ -0,0 +1,30 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'forwardable'
4
+ require 'logger'
5
+
6
+ # Code adapted from Selenium Implementation
7
+ # https://github.com/SeleniumHQ/selenium/blob/trunk/rb/lib/selenium/webdriver/common/logger.rb
8
+
9
+ module Watir
10
+ #
11
+ # @example Enable full logging
12
+ # Watir.logger.level = :debug
13
+ #
14
+ # @example Log to file
15
+ # Watir.logger.output = 'watir.log'
16
+ #
17
+ # @example Use logger manually
18
+ # Watir.logger.info('This is info message')
19
+ # Watir.logger.warn('This is warning message')
20
+ #
21
+ class Logger < Selenium::WebDriver::Logger
22
+ def initialize
23
+ super('Watir')
24
+ end
25
+
26
+ def selenium=(val)
27
+ Selenium::WebDriver.logger.level = val
28
+ end
29
+ end
30
+ end
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Navigation
5
+ #
6
+ # Goes to the given URL.
7
+ #
8
+ # @example
9
+ # browser.goto "watir.github.io"
10
+ #
11
+ # @param [String] uri The url.
12
+ # @return [String] The url you end up at.
13
+ #
14
+
15
+ def goto(uri)
16
+ uri = "http://#{uri}" unless uri&.match?(URI::DEFAULT_PARSER.make_regexp)
17
+
18
+ @driver.navigate.to uri
19
+ @after_hooks.run
20
+
21
+ uri
22
+ end
23
+
24
+ #
25
+ # Navigates back in history.
26
+ #
27
+
28
+ def back
29
+ @driver.navigate.back
30
+ @after_hooks.run
31
+ end
32
+
33
+ #
34
+ # Navigates forward in history.
35
+ #
36
+
37
+ def forward
38
+ @driver.navigate.forward
39
+ @after_hooks.run
40
+ end
41
+
42
+ #
43
+ # Refreshes current page.
44
+ #
45
+
46
+ def refresh
47
+ @driver.navigate.refresh
48
+ @after_hooks.run
49
+ end
50
+ end # Navigation
51
+ end # Watir
@@ -0,0 +1,230 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ class RadioSet
5
+ extend Forwardable
6
+ include Exception
7
+ include Enumerable
8
+
9
+ delegate %i[exist? exists? present? visible? browser] => :source
10
+
11
+ attr_reader :source, :frame
12
+
13
+ def initialize(query_scope, selector)
14
+ raise ArgumentError, "invalid argument: #{selector.inspect}" unless selector.is_a? Hash
15
+
16
+ @source = Radio.new(query_scope, selector)
17
+ @frame = @source.parent(tag_name: 'form')
18
+ end
19
+
20
+ #
21
+ # Yields each Radio associated with this set.
22
+ #
23
+ # @example
24
+ # radio_set = browser.radio_set
25
+ # radio_set.each do |radio|
26
+ # puts radio.text
27
+ # end
28
+ #
29
+ # @yieldparam [Watir::RadioSet] element iterate through the radio buttons.
30
+ #
31
+
32
+ def each(&block)
33
+ radios.each(&block)
34
+ end
35
+
36
+ #
37
+ # Get the n'th radio button in this set
38
+ #
39
+ # @return Watir::Radio
40
+ #
41
+
42
+ def [](idx)
43
+ radios[idx]
44
+ end
45
+
46
+ #
47
+ # @return Watir::Radio
48
+ #
49
+
50
+ def radio(opt = {})
51
+ if !name.empty? && (!opt[:name] || opt[:name] == name)
52
+ frame.radio(opt.merge(name: name))
53
+ elsif name.empty?
54
+ source
55
+ else
56
+ raise UnknownObjectException, "#{opt[:name]} does not match name of RadioSet: #{name}"
57
+ end
58
+ end
59
+
60
+ #
61
+ # @return Watir::RadioCollection
62
+ #
63
+
64
+ def radios(opt = {})
65
+ if !name.empty? && (!opt[:name] || opt[:name] == name)
66
+ element_call(:wait_for_present) { frame.radios(opt.merge(name: name)) }
67
+ elsif name.empty?
68
+ single_radio_collection
69
+ else
70
+ raise UnknownObjectException, "#{opt[:name]} does not match name of RadioSet: #{name}"
71
+ end
72
+ end
73
+
74
+ #
75
+ # Returns true if any radio buttons in the set are enabled.
76
+ #
77
+ # @return [Boolean]
78
+ #
79
+
80
+ def enabled?
81
+ any?(&:enabled?)
82
+ end
83
+
84
+ #
85
+ # Returns true if all radio buttons in the set are disabled.
86
+ #
87
+ # @return [Boolean]
88
+ #
89
+
90
+ def disabled?
91
+ !enabled?
92
+ end
93
+
94
+ #
95
+ # Returns the name attribute for the set.
96
+ #
97
+ # @return [String]
98
+ #
99
+
100
+ def name
101
+ @name ||= source.name
102
+ end
103
+
104
+ #
105
+ # If RadioSet exists, this always returns 'radio'.
106
+ #
107
+ # @return [String]
108
+ #
109
+
110
+ def type
111
+ assert_exists
112
+ 'radio'
113
+ end
114
+
115
+ #
116
+ # Returns true if the radio set has one or more radio buttons where label matches the given value.
117
+ #
118
+ # @param [String, Regexp] str_or_rx
119
+ # @return [Boolean]
120
+ #
121
+
122
+ def include?(str_or_rx)
123
+ radio(label: str_or_rx).exist?
124
+ end
125
+
126
+ #
127
+ # Select the radio button whose value or label matches the given string.
128
+ #
129
+ # @param [String, Regexp] str_or_rx
130
+ # @raise [Watir::Exception::UnknownObjectException] if the Radio does not exist.
131
+ # @return [String] The value or text of the radio selected.
132
+ #
133
+
134
+ def select(str_or_rx)
135
+ %i[value label].each do |key|
136
+ radio = radio(key => str_or_rx)
137
+ next unless radio.exist?
138
+
139
+ radio.click unless radio.selected?
140
+ return key == :value ? radio.value : radio.text
141
+ end
142
+ raise UnknownObjectException, "Unable to locate radio matching #{str_or_rx.inspect}"
143
+ end
144
+ alias set select
145
+
146
+ #
147
+ # Returns true if any of the radio button label matches the given value.
148
+ #
149
+ # @param [String, Regexp] str_or_rx
150
+ # @raise [Watir::Exception::UnknownObjectException] if the options do not exist
151
+ # @return [Boolean]
152
+ #
153
+
154
+ def selected?(str_or_rx)
155
+ found = frame.radio(label: str_or_rx)
156
+ return found.selected? if found.exist?
157
+
158
+ raise UnknownObjectException, "Unable to locate radio matching #{str_or_rx.inspect}"
159
+ end
160
+
161
+ #
162
+ # Returns the value of the selected radio button in the set.
163
+ # Returns nil if no radio is selected.
164
+ #
165
+ # @return [String, nil]
166
+ #
167
+
168
+ def value
169
+ selected&.value
170
+ end
171
+
172
+ #
173
+ # Returns the text of the selected radio button in the set.
174
+ # Returns nil if no option is selected.
175
+ #
176
+ # @return [String, nil]
177
+ #
178
+
179
+ def text
180
+ selected&.text
181
+ end
182
+
183
+ #
184
+ # Returns the selected Radio element.
185
+ # Returns nil if no radio button is selected.
186
+ #
187
+ # @return [Watir::Radio, nil]
188
+ #
189
+
190
+ def selected
191
+ find(&:selected?)
192
+ end
193
+
194
+ #
195
+ # Returns true if two elements are equal.
196
+ #
197
+ # @example
198
+ # browser.radio_set(id: 'new_user_newsletter_yes') == browser.radio_set(id: 'new_user_newsletter_no')
199
+ # #=> true
200
+ #
201
+
202
+ def ==(other)
203
+ other.is_a?(self.class) && radios == other.radios
204
+ end
205
+ alias eql? ==
206
+
207
+ # Delegating to Private Methods
208
+ %i[assert_exists element_call].each do |method|
209
+ define_method(method) do |*args, &blk|
210
+ source.send(method, *args, &blk)
211
+ end
212
+ end
213
+
214
+ private
215
+
216
+ def single_radio_collection
217
+ collection = RadioCollection.new(frame, source.selector)
218
+ collection.first.cache = source.wd
219
+ collection
220
+ end
221
+ end # RadioSet
222
+
223
+ module Container
224
+ def radio_set(opts = {})
225
+ RadioSet.new(self, opts.merge(tag_name: 'input', type: 'radio'))
226
+ end
227
+
228
+ Watir.tag_to_class[:radio_set] = RadioSet
229
+ end # Container
230
+ end # Watir
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module RowContainer
5
+ #
6
+ # Returns table row.
7
+ #
8
+
9
+ def row(opts)
10
+ Row.new(self, opts)
11
+ end
12
+
13
+ #
14
+ # Returns table rows collection.
15
+ #
16
+
17
+ def rows(opts = {})
18
+ RowCollection.new(self, opts)
19
+ end
20
+
21
+ #
22
+ # The table as a 2D Array of strings with the text of each cell.
23
+ #
24
+ # @return [Array<Array<String>>]
25
+ #
26
+
27
+ def strings
28
+ wait_for_exists
29
+
30
+ rows.inject [] do |res, row|
31
+ res << row.cells.map(&:text)
32
+ end
33
+ end
34
+ alias to_a strings
35
+ end # RowContainer
36
+ end # Watir
@@ -0,0 +1,51 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ class Screenshot
5
+ def initialize(browser)
6
+ @browser = browser
7
+ @driver = browser.wd
8
+ end
9
+
10
+ #
11
+ # Saves screenshot to given path.
12
+ #
13
+ # @example
14
+ # browser.screenshot.save "screenshot.png"
15
+ #
16
+ # @param [String] path
17
+ #
18
+
19
+ def save(path)
20
+ @driver.save_screenshot(path)
21
+ end
22
+
23
+ #
24
+ # Represents screenshot as PNG image string.
25
+ #
26
+ # @example
27
+ # browser.screenshot.png
28
+ # #=> '\x95\xC7\x8C@1\xC07\x1C(Edb\x15\xB2\vL'
29
+ #
30
+ # @return [String]
31
+ #
32
+
33
+ def png
34
+ @driver.screenshot_as(:png)
35
+ end
36
+
37
+ #
38
+ # Represents screenshot as Base64 encoded string.
39
+ #
40
+ # @example
41
+ # browser.screenshot.base64
42
+ # #=> '7HWJ43tZDscPleeUuPW6HhN3x+z7vU/lufmH0qNTtTum94IBWMT46evImci1vnFGT'
43
+ #
44
+ # @return [String]
45
+ #
46
+
47
+ def base64
48
+ @driver.screenshot_as(:base64)
49
+ end
50
+ end # Screenshot
51
+ end # Watir
@@ -0,0 +1,95 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Scrolling
5
+ def scroll
6
+ Scroll.new(self)
7
+ end
8
+ end
9
+
10
+ class Scroll
11
+ def initialize(object)
12
+ @driver = object.browser.wd
13
+ @object = object
14
+ @origin = nil
15
+ end
16
+
17
+ # Scrolls by offset.
18
+ # @param [Fixnum] left Horizontal offset
19
+ # @param [Fixnum] top Vertical offset
20
+ #
21
+ def by(left, top)
22
+ if @origin
23
+ @driver.action.scroll_from(@origin, left, top).perform
24
+ else
25
+ @object.browser.execute_script('window.scrollBy(arguments[0], arguments[1]);', Integer(left), Integer(top))
26
+ end
27
+ self
28
+ end
29
+
30
+ # Scrolls to specified location.
31
+ # @param [Symbol] param
32
+ #
33
+ def to(param = :top)
34
+ return scroll_to_element if param == :viewport
35
+
36
+ args = @object.is_a?(Watir::Element) ? element_scroll(param) : browser_scroll(param)
37
+ raise ArgumentError, "Don't know how to scroll #{@object} to: #{param}!" if args.nil?
38
+
39
+ @object.browser.execute_script(*args)
40
+ self
41
+ end
42
+
43
+ # Sets an origin point for a future scroll
44
+ # @param [Integer] x_offset
45
+ # @param [Integer] y_offset
46
+ def from(x_offset = 0, y_offset = 0)
47
+ @origin = if @object.is_a?(Watir::Element)
48
+ Selenium::WebDriver::WheelActions::ScrollOrigin.element(@object.we, x_offset, y_offset)
49
+ else
50
+ Selenium::WebDriver::WheelActions::ScrollOrigin.viewport(x_offset, y_offset)
51
+ end
52
+ self
53
+ end
54
+
55
+ private
56
+
57
+ def scroll_to_element
58
+ @driver.action.scroll_to(@object.we).perform
59
+ end
60
+
61
+ def element_scroll(param)
62
+ script = case param
63
+ when :top, :start
64
+ 'arguments[0].scrollIntoView();'
65
+ when :center
66
+ <<-JS
67
+ var bodyRect = document.body.getBoundingClientRect();
68
+ var elementRect = arguments[0].getBoundingClientRect();
69
+ var left = (elementRect.left - bodyRect.left) - (window.innerWidth / 2);
70
+ var top = (elementRect.top - bodyRect.top) - (window.innerHeight / 2);
71
+ window.scrollTo(left, top);
72
+ JS
73
+ when :bottom, :end
74
+ 'arguments[0].scrollIntoView(false);'
75
+ else
76
+ return nil
77
+ end
78
+ [script, @object]
79
+ end
80
+
81
+ def browser_scroll(param)
82
+ case param
83
+ when :top, :start
84
+ 'window.scrollTo(0, 0);'
85
+ when :center
86
+ y = '(document.body.scrollHeight - window.innerHeight) / 2 + document.body.getBoundingClientRect().top'
87
+ "window.scrollTo(window.outerWidth / 2, #{y});"
88
+ when :bottom, :end
89
+ 'window.scrollTo(0, document.body.scrollHeight);'
90
+ when Array
91
+ ['window.scrollTo(arguments[0], arguments[1]);', Integer(param[0]), Integer(param[1])]
92
+ end
93
+ end
94
+ end
95
+ end