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,96 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module SearchContext
5
+ #
6
+ # Returns true if element exists.
7
+ # Checking for staleness is deprecated
8
+ #
9
+ # @return [Boolean]
10
+ #
11
+
12
+ def exists?
13
+ if located? && stale?
14
+ reset!
15
+ elsif located?
16
+ return true
17
+ end
18
+
19
+ assert_exists
20
+ true
21
+ rescue Exception::UnknownObjectException, Exception::UnknownFrameException
22
+ false
23
+ end
24
+ alias exist? exists?
25
+
26
+ def assert_exists
27
+ locate unless located?
28
+ return if located?
29
+
30
+ raise unknown_exception, "unable to locate: #{inspect}"
31
+ end
32
+
33
+ def wait_for_exists
34
+ return if located? # Performance shortcut
35
+
36
+ begin
37
+ @query_scope.wait_for_exists unless @query_scope.is_a? Browser
38
+ wait_until(element_reset: true, &:exists?)
39
+ rescue Wait::TimeoutError
40
+ msg = "timed out after #{Watir.default_timeout} seconds, waiting for #{inspect} to be located"
41
+ raise unknown_exception, msg
42
+ end
43
+ end
44
+
45
+ # TODO: - this will get addressed with Watir::Executor implementation
46
+ # rubocop:disable Metrics/AbcSize
47
+ # rubocop:disable Metrics/MethodLength # : # ::
48
+ def element_call(precondition = nil, &block)
49
+ caller = caller_locations(1, 1)[0].label
50
+ already_locked = browser.timer.locked?
51
+ browser.timer = Wait::Timer.new(timeout: Watir.default_timeout) unless already_locked
52
+
53
+ begin
54
+ check_condition(precondition, caller)
55
+ Watir.logger.debug "-> `Executing #{inspect}##{caller}`"
56
+ yield
57
+ rescue unknown_exception => e
58
+ element_call(:wait_for_exists, &block) if precondition.nil?
59
+ raise unknown_exception, e.message + custom_message
60
+ rescue Selenium::WebDriver::Error::StaleElementReferenceError, Selenium::WebDriver::Error::NoSuchElementError
61
+ reset!
62
+ retry
63
+ # TODO: - InvalidElementStateError is deprecated, so no longer calling `raise_disabled`
64
+ # need a better way to handle this
65
+ rescue Selenium::WebDriver::Error::ElementNotInteractableError
66
+ raise_present unless browser.timer.remaining_time.positive?
67
+ raise_present unless %i[wait_for_present wait_for_enabled wait_for_writable].include?(precondition)
68
+ retry
69
+ rescue Selenium::WebDriver::Error::NoSuchWindowError
70
+ raise Exception::NoMatchingWindowFoundException, 'browser window was closed'
71
+ ensure
72
+ Watir.logger.debug "<- `Completed #{inspect}##{caller}`"
73
+ browser.timer.reset! unless already_locked
74
+ end
75
+ end
76
+
77
+ # rubocop:enable Metrics/AbcSize
78
+ # rubocop:enable Metrics/MethodLength
79
+ def check_condition(condition, caller)
80
+ Watir.logger.debug "<- `Verifying precondition #{inspect}##{condition} for #{caller}`"
81
+ begin
82
+ condition.nil? ? assert_exists : send(condition)
83
+ Watir.logger.debug "<- `Verified precondition #{inspect}##{condition || 'assert_exists'}`"
84
+ rescue unknown_exception
85
+ raise unless condition.nil?
86
+
87
+ Watir.logger.debug "<- `Unable to satisfy precondition #{inspect}##{condition}`"
88
+ check_condition(:wait_for_exists, caller)
89
+ end
90
+ end
91
+
92
+ def unknown_exception
93
+ Exception::UnknownObjectException
94
+ end
95
+ end
96
+ end
@@ -0,0 +1,60 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ class ShadowRoot
5
+ include Container
6
+ include Exception
7
+ include SearchContext
8
+ include Waitable
9
+
10
+ def initialize(element)
11
+ @query_scope = element
12
+ end
13
+
14
+ def browser
15
+ @query_scope.browser
16
+ end
17
+
18
+ def located?
19
+ !!@shadow_root
20
+ end
21
+
22
+ def wd
23
+ assert_exists
24
+ @shadow_root
25
+ end
26
+
27
+ def execute_script(script, *args, function_name: nil)
28
+ browser.execute_script(script, *args, function_name: function_name)
29
+ end
30
+
31
+ def stale?
32
+ @shadow_root.find_elements(css: 'checking_stale_shadow_root')
33
+ false
34
+ rescue Selenium::WebDriver::Error::DetachedShadowRootError
35
+ true
36
+ end
37
+
38
+ def reset!
39
+ @shadow_root = nil
40
+ end
41
+
42
+ def locate
43
+ @shadow_root = @query_scope.wd.shadow_root
44
+ rescue Selenium::WebDriver::Error::NoSuchShadowRootError
45
+ nil
46
+ end
47
+
48
+ #
49
+ # @api private
50
+ #
51
+
52
+ def selector_string
53
+ "#{@query_scope.selector_string} --> shadow_root"
54
+ end
55
+
56
+ def custom_message
57
+ ''
58
+ end
59
+ end
60
+ end
@@ -0,0 +1,85 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module UserEditable
5
+ #
6
+ # Clear the element, then type in the given value.
7
+ #
8
+ # @param [String, Symbol] args
9
+ #
10
+
11
+ def set(*args)
12
+ element_call(:wait_for_writable) do
13
+ @element.clear
14
+ @element.send_keys(*args)
15
+ end
16
+ end
17
+ alias value= set
18
+
19
+ #
20
+ # Returns true if element is user_editable because it has a content_editable attribute set
21
+ #
22
+ # @return [Boolean]
23
+ #
24
+
25
+ def content_editable
26
+ defined?(@content_editable) && content_editable?
27
+ end
28
+
29
+ #
30
+ # Uses JavaScript to enter most of the given value.
31
+ # Selenium is used to enter the first and last characters
32
+ # This might provide a performance improvement when entering a lot of text on a local machine
33
+ #
34
+ # @param [String, Symbol] args
35
+ #
36
+
37
+ def set!(*args)
38
+ msg = '#set! does not support special keys, use #set instead'
39
+ raise ArgumentError, msg if args.any?(::Symbol)
40
+
41
+ input_value = args.join
42
+ set input_value[0]
43
+ return content_editable_set!(*args) if content_editable
44
+
45
+ element_call { execute_js(:setValue, @element, input_value[0..-2]) }
46
+ append(input_value[-1])
47
+ return if value == input_value
48
+
49
+ raise Exception::Error, "#set! value: '#{value}' does not match expected input: '#{input_value}'"
50
+ end
51
+
52
+ #
53
+ # Appends the given value to the text in the text field.
54
+ #
55
+ # @param [String, Symbol] args
56
+ #
57
+
58
+ def append(*args)
59
+ raise NotImplementedError, '#append method is not supported with contenteditable element' if content_editable
60
+
61
+ send_keys(*args)
62
+ end
63
+ alias << append
64
+
65
+ #
66
+ # Clears the text field.
67
+ #
68
+
69
+ def clear
70
+ element_call(:wait_for_writable) do
71
+ @element.clear
72
+ end
73
+ end
74
+
75
+ private
76
+
77
+ def content_editable_set!(*args)
78
+ input_text = args.join
79
+ element_call { execute_js(:setText, @element, input_text) }
80
+ return if text == input_text
81
+
82
+ raise Exception::Error, "#set! text: '#{text}' does not match expected input: '#{input_text}'"
83
+ end
84
+ end # UserEditable
85
+ end # Watir
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ VERSION = '7.3.0'
5
+ end
@@ -0,0 +1,52 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Watir
4
+ module Wait
5
+ class Timer
6
+ def initialize(timeout: nil)
7
+ @end_time = timeout ? current_time + timeout : nil
8
+ @remaining_time = @end_time - current_time if @end_time
9
+ end
10
+
11
+ #
12
+ # Executes given block until it returns true or exceeds timeout.
13
+ # @param [Integer] timeout
14
+ # @yield block
15
+ # @api private
16
+ #
17
+
18
+ def wait(timeout, &block)
19
+ end_time = @end_time || (current_time + timeout)
20
+ loop do
21
+ yield(block)
22
+ @remaining_time = end_time - current_time
23
+ break if @remaining_time.negative?
24
+ end
25
+ end
26
+
27
+ def remaining_time
28
+ @end_time - current_time
29
+ end
30
+
31
+ def reset!
32
+ @end_time = nil
33
+ end
34
+
35
+ def locked?
36
+ !@end_time.nil?
37
+ end
38
+
39
+ private
40
+
41
+ if defined?(Process::CLOCK_MONOTONIC)
42
+ def current_time
43
+ Process.clock_gettime(Process::CLOCK_MONOTONIC)
44
+ end
45
+ else
46
+ def current_time
47
+ ::Time.now.to_f
48
+ end
49
+ end
50
+ end # Timer
51
+ end # Wait
52
+ end # Watir
data/lib/watir/wait.rb ADDED
@@ -0,0 +1,171 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'watir/wait/timer'
4
+
5
+ module Watir
6
+ module Wait
7
+ class TimeoutError < StandardError; end
8
+
9
+ INTERVAL = 0.1
10
+
11
+ class << self
12
+ #
13
+ # @!attribute timer
14
+ # Access Watir timer implementation in use.
15
+ # @see Timer
16
+ # @return [#wait]
17
+ #
18
+
19
+ attr_writer :timer
20
+
21
+ def timer
22
+ @timer ||= Timer.new
23
+ end
24
+
25
+ #
26
+ # Waits until the block evaluates to true or times out.
27
+ #
28
+ # @example
29
+ # Watir::Wait.until { browser.text_field(name: "new_user_first_name").visible? }
30
+ #
31
+ # @param [Integer] timeout How long to wait in seconds
32
+ # @param [String] message Message to raise if timeout is exceeded
33
+ # @param [Object, NilClass] object Object to evaluate block against
34
+ # @raise [TimeoutError] if timeout is exceeded
35
+ #
36
+
37
+ def until(timeout: nil, message: nil, interval: nil, object: nil)
38
+ timeout ||= Watir.default_timeout
39
+ run_with_timer(timeout, interval) do
40
+ result = yield(object)
41
+ return result if result
42
+ end
43
+ raise TimeoutError, message_for(timeout, object, message)
44
+ end
45
+
46
+ #
47
+ # Wait while the block evaluates to true or times out.
48
+ #
49
+ # @example
50
+ # Watir::Wait.while { browser.text_field(name: "abrakadbra").present? }
51
+ #
52
+ # @param [Integer] timeout How long to wait in seconds
53
+ # @param [String] message Message to raise if timeout is exceeded
54
+ # @param [Object, NilClass] object Object to evaluate block against
55
+ # @raise [TimeoutError] if timeout is exceeded
56
+ #
57
+
58
+ def while(timeout: nil, message: nil, interval: nil, object: nil)
59
+ timeout ||= Watir.default_timeout
60
+ run_with_timer(timeout, interval) { return unless yield(object) }
61
+ raise TimeoutError, message_for(timeout, object, message)
62
+ end
63
+
64
+ private
65
+
66
+ def message_for(timeout, object, message)
67
+ message = message.is_a?(Proc) ? message.call(object) : message || ''
68
+ additional = message.empty? ? '' : ", #{message}"
69
+ "timed out after #{timeout} seconds#{additional}"
70
+ end
71
+
72
+ def run_with_timer(timeout, interval)
73
+ if timeout.zero?
74
+ yield
75
+ else
76
+ timer.wait(timeout) do
77
+ yield
78
+ sleep interval || INTERVAL
79
+ end
80
+ end
81
+ end
82
+ end # self
83
+ end # Wait
84
+
85
+ module Waitable
86
+ #
87
+ # Waits until the condition is true.
88
+ #
89
+ # @example
90
+ # browser.wait_until(timeout: 2) do |browser|
91
+ # browser.windows.size == 1
92
+ # end
93
+ #
94
+ # @example
95
+ # browser.text_field(name: "new_user_first_name").wait_until(&:present?).click
96
+ # browser.text_field(name: "new_user_first_name").wait_until(message: 'foo') { |field| field.present? }
97
+ # browser.text_field(name: "new_user_first_name").wait_until(timeout: 60, &:present?)
98
+ # browser.text_field(name: "new_user_first_name").wait_until(timeout: 60, name: 'new_user_first_name')
99
+ #
100
+ # @param [Integer] timeout seconds to wait before timing out
101
+ # @param [String] message error message for when times out
102
+ #
103
+
104
+ def wait_until(timeout: nil, message: nil, interval: nil, **opt, &blk)
105
+ message ||= proc { |obj| "waiting for true condition on #{obj.inspect}" }
106
+
107
+ # TODO: Consider throwing argument error for mixing block & options
108
+ proc = create_proc(opt, &blk)
109
+
110
+ Wait.until(timeout: timeout, message: message, interval: interval, object: self, &proc)
111
+
112
+ self
113
+ end
114
+
115
+ #
116
+ # Waits while the condition is true.
117
+ #
118
+ # @example
119
+ # browser.wait_while(timeout: 2) do |browser|
120
+ # !browser.exists?
121
+ # end
122
+ # browser.wait_while(timeout: 2, title: 'No')
123
+ #
124
+ # @todo add element example
125
+ #
126
+ # @param [Integer] timeout seconds to wait before timing out
127
+ # @param [String] message error message for when times out
128
+ #
129
+
130
+ def wait_while(timeout: nil, message: nil, interval: nil, **opt, &blk)
131
+ message ||= proc { |obj| "waiting for false condition on #{obj.inspect}" }
132
+
133
+ # TODO: Consider throwing argument error for mixing block & options
134
+ proc = create_proc(opt, &blk)
135
+
136
+ Wait.while(timeout: timeout, message: message, interval: interval, object: self, &proc)
137
+
138
+ self
139
+ end
140
+
141
+ private
142
+
143
+ def create_proc(opt)
144
+ proc do
145
+ reset! if opt.delete(:element_reset) && is_a?(Element)
146
+ (opt.empty? || match_attributes(opt).call) && (!block_given? || yield(self))
147
+ end
148
+ end
149
+
150
+ def match_attributes(opt)
151
+ proc do
152
+ opt.keys.all? do |key|
153
+ expected = opt[key]
154
+ actual = if is_a?(Element) && !respond_to?(key)
155
+ attribute_value(key)
156
+ else
157
+ send(key)
158
+ end
159
+ case expected
160
+ when Regexp
161
+ expected =~ actual
162
+ when Numeric
163
+ expected == actual
164
+ else
165
+ expected.to_s == actual
166
+ end
167
+ end
168
+ end
169
+ end
170
+ end # Waitable
171
+ end # Watir