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,536 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'watirspec_helper'
4
+
5
+ module Watir
6
+ describe Browser do
7
+ describe '#exists?' do
8
+ it 'returns true if we are at a page' do
9
+ browser.goto(WatirSpec.url_for('non_control_elements.html'))
10
+ expect(browser).to exist
11
+ end
12
+
13
+ it 'returns false if window is closed',
14
+ except: {browser: :safari,
15
+ reason: 'Clicking an Element that Closes a Window is returning NoMatchingWindowFoundException'},
16
+ exclude: {browser: :ie,
17
+ reason: 'IE does not like switching windows'} do
18
+ browser.goto WatirSpec.url_for('window_switching.html')
19
+ browser.a(id: 'open').click
20
+ browser.windows.wait_until(size: 2)
21
+ browser.window(title: 'closeable window').use
22
+ browser.a(id: 'close').click
23
+ browser.windows.wait_until(size: 1)
24
+ expect(browser.exists?).to be false
25
+ ensure
26
+ browser.windows.restore!
27
+ end
28
+
29
+ it 'returns false after Browser#close' do
30
+ browser.close
31
+ expect(browser).not_to exist
32
+ end
33
+ end
34
+
35
+ describe '#closed?' do
36
+ it 'returns false if not closed' do
37
+ expect(browser).not_to be_closed
38
+ end
39
+
40
+ it 'returns false if window is closed but browser is not',
41
+ except: {browser: :safari,
42
+ reason: 'Clicking an Element that Closes a Window is returning NoMatchingWindowFoundException'},
43
+ exclude: {browser: :ie,
44
+ reason: 'IE Mode does not like closed windows'} do
45
+ browser.goto WatirSpec.url_for('window_switching.html')
46
+ browser.a(id: 'open').click
47
+ browser.windows.wait_until(size: 2)
48
+ browser.window(title: 'closeable window').use
49
+ browser.a(id: 'close').click
50
+ browser.windows.wait_until(size: 1)
51
+ expect(browser).not_to be_closed
52
+ ensure
53
+ browser.windows.restore!
54
+ end
55
+
56
+ it 'returns false after Browser#close' do
57
+ browser.close
58
+ expect(browser).to be_closed
59
+ end
60
+ end
61
+
62
+ describe '#html' do
63
+ it 'returns the DOM of the page as an HTML string' do
64
+ browser.goto(WatirSpec.url_for('right_click.html'))
65
+ html = browser.html.downcase # varies between browsers
66
+
67
+ expect(html).to match(/^<html/)
68
+ expect(html).to include('<meta ')
69
+ expect(html).to include(' content="text/html; charset=utf-8"')
70
+ expect(html).to match(/http-equiv=("|)content-type/)
71
+ end
72
+ end
73
+
74
+ describe '#status' do
75
+ it 'returns the current value of window.status',
76
+ except: {browser: :ie, reason: 'Status bar not enabled by default'} do
77
+ browser.goto(WatirSpec.url_for('non_control_elements.html'))
78
+
79
+ browser.execute_script "window.status = 'All done!';"
80
+ expect(browser.status).to eq 'All done!'
81
+ end
82
+ end
83
+
84
+ describe '#name' do
85
+ it 'returns browser name' do
86
+ expect(browser.name).to eq(WatirSpec.implementation.browser_name)
87
+ end
88
+ end
89
+
90
+ describe '#send_key{,s}' do
91
+ it 'sends keystrokes to the active element' do
92
+ browser.goto WatirSpec.url_for 'forms_with_input_elements.html'
93
+
94
+ browser.send_keys 'hello'
95
+ expect(browser.text_field(id: 'new_user_first_name').value).to eq 'hello'
96
+ end
97
+
98
+ it 'sends keys to a frame' do
99
+ browser.goto WatirSpec.url_for 'frames.html'
100
+ tf = browser.frame.text_field(id: 'senderElement')
101
+ tf.clear
102
+ tf.click
103
+
104
+ browser.frame.send_keys 'hello'
105
+
106
+ expect(tf.value).to eq 'hello'
107
+ end
108
+ end
109
+
110
+ describe '#text' do
111
+ it 'returns the text of the page' do
112
+ browser.goto(WatirSpec.url_for('non_control_elements.html'))
113
+ expect(browser.text).to include('Dubito, ergo cogito, ergo sum.')
114
+ end
115
+
116
+ it 'returns the text also if the content-type is text/plain' do
117
+ # more specs for text/plain? what happens if we call other methods?
118
+ browser.goto(WatirSpec.url_for('plain_text'))
119
+ expect(browser.text.strip).to eq 'This is text/plain'
120
+ end
121
+
122
+ it 'returns text of top most browsing context', except: {browser: :safari,
123
+ reason: 'Safari does not strip text'} do
124
+ browser.goto(WatirSpec.url_for('nested_iframes.html'))
125
+ browser.iframe(id: 'two').h3.exists?
126
+ expect(browser.text).to eq 'Top Layer'
127
+ end
128
+ end
129
+
130
+ describe '#url' do
131
+ it 'returns the current url' do
132
+ browser.goto(WatirSpec.url_for('non_control_elements.html'))
133
+ expect(browser.url.casecmp(WatirSpec.url_for('non_control_elements.html'))).to eq 0
134
+ end
135
+
136
+ it 'always returns top url' do
137
+ browser.goto(WatirSpec.url_for('frames.html'))
138
+ browser.frame.body.exists? # switches to frame
139
+ expect(browser.url.casecmp(WatirSpec.url_for('frames.html'))).to eq 0
140
+ end
141
+ end
142
+
143
+ describe '#title' do
144
+ it 'returns the current title' do
145
+ browser.goto(WatirSpec.url_for('non_control_elements.html'))
146
+ expect(browser.title).to eq 'Non-control elements'
147
+ end
148
+
149
+ it 'always returns top title' do
150
+ browser.goto(WatirSpec.url_for('frames.html'))
151
+ browser.element(tag_name: 'title').text
152
+ browser.frame.body.exists? # switches to frame
153
+ expect(browser.title).to eq 'Frames'
154
+ end
155
+ end
156
+
157
+ # TODO: Temporarily disabling this before moving it to unit tests
158
+ xdescribe '#new' do
159
+ context 'when using parameters', except: {remote: true} do
160
+ let(:url) { 'http://localhost:4544/wd/hub/' }
161
+
162
+ before(:all) do
163
+ @original = WatirSpec.implementation.clone
164
+
165
+ require 'watirspec/remote_server'
166
+ args = ["-Dwebdriver.chrome.driver=#{Webdrivers::Chromedriver.driver_path}",
167
+ "-Dwebdriver.gecko.driver=#{Webdrivers::Geckodriver.driver_path}"]
168
+ WatirSpec::RemoteServer.new.start(4544, args: args)
169
+ browser.close
170
+ end
171
+
172
+ before do
173
+ @opts = WatirSpec.implementation.browser_args.last
174
+ end
175
+
176
+ after do
177
+ @new_browser.close
178
+ WatirSpec.implementation = @original.clone
179
+ end
180
+
181
+ it 'uses remote client based on provided url' do
182
+ @opts[:url] = url
183
+ @new_browser = WatirSpec.new_browser
184
+
185
+ server_url = @new_browser.driver.instance_variable_get(:@bridge).http.instance_variable_get(:@server_url)
186
+ expect(server_url).to eq URI.parse(url)
187
+ end
188
+
189
+ it 'sets client timeout' do
190
+ @opts.merge!(url: url, open_timeout: 44, read_timeout: 47)
191
+ @new_browser = WatirSpec.new_browser
192
+
193
+ http = @new_browser.driver.instance_variable_get(:@bridge).http
194
+
195
+ expect(http.open_timeout).to eq 44
196
+ expect(http.read_timeout).to eq 47
197
+ end
198
+
199
+ it 'accepts http_client' do
200
+ http_client = Selenium::WebDriver::Remote::Http::Default.new
201
+ @opts[:url] = url
202
+ @opts[:http_client] = http_client
203
+ @new_browser = WatirSpec.new_browser
204
+
205
+ expect(@new_browser.driver.instance_variable_get(:@bridge).http).to eq http_client
206
+ end
207
+
208
+ it 'accepts Remote::Capabilities instance as :desired_capabilities', only: {browser: :firefox} do
209
+ caps = Selenium::WebDriver::Remote::Capabilities.firefox(accept_insecure_certs: true)
210
+ @opts[:url] = url
211
+ @opts[:desired_capabilities] = caps
212
+
213
+ msg = /You can pass values directly into Watir::Browser opt without needing to use :desired_capabilities/
214
+ expect { @new_browser = WatirSpec.new_browser }.to output(msg).to_stdout_from_any_process
215
+ expect(@new_browser.driver.capabilities.accept_insecure_certs).to be true
216
+ end
217
+
218
+ it 'accepts individual driver capabilities', only: {browser: :firefox} do
219
+ @opts[:accept_insecure_certs] = true
220
+ @new_browser = WatirSpec.new_browser
221
+
222
+ expect(@new_browser.driver.capabilities[:accept_insecure_certs]).to be true
223
+ end
224
+
225
+ it 'accepts profile', only: {browser: :firefox} do
226
+ home_page = WatirSpec.url_for('special_chars.html')
227
+ profile = Selenium::WebDriver::Firefox::Profile.new
228
+ profile['browser.startup.homepage'] = home_page
229
+ profile['browser.startup.page'] = 1
230
+ @opts[:profile] = profile
231
+
232
+ @new_browser = WatirSpec.new_browser
233
+
234
+ expect(@new_browser.url).to eq home_page
235
+ end
236
+
237
+ context 'when using chrome arguments', only: {browser: :chrome} do
238
+ it 'accepts browser options' do
239
+ @opts[:options] = {emulation: {userAgent: 'foo;bar'}}
240
+
241
+ @new_browser = WatirSpec.new_browser
242
+
243
+ ua = @new_browser.execute_script 'return window.navigator.userAgent'
244
+ expect(ua).to eq('foo;bar')
245
+ end
246
+
247
+ it 'uses remote client when specifying remote' do
248
+ opts = {desired_capabilities: Selenium::WebDriver::Remote::Capabilities.chrome,
249
+ url: url}
250
+ WatirSpec.implementation.browser_args = [:remote, opts]
251
+ msg = /You can pass values directly into Watir::Browser opt without needing to use :desired_capabilities/
252
+ expect { @new_browser = WatirSpec.new_browser }.to output(msg).to_stdout_from_any_process
253
+ server_url = @new_browser.driver.instance_variable_get(:@bridge).http.instance_variable_get(:@server_url)
254
+ expect(server_url).to eq URI.parse(url)
255
+ end
256
+
257
+ it 'accepts switches argument' do
258
+ @opts.delete :args
259
+ @opts[:switches] = ['--window-size=600,700']
260
+
261
+ @new_browser = WatirSpec.new_browser
262
+ size = @new_browser.window.size
263
+ expect(size['height']).to eq 700
264
+ expect(size['width']).to eq 600
265
+ end
266
+
267
+ it 'accepts Chrome::Options instance as :options', except: {headless: true} do
268
+ chrome_opts = Selenium::WebDriver::Chrome::Options.new(emulation: {userAgent: 'foo;bar'})
269
+ @opts.delete :args
270
+ @opts[:options] = chrome_opts
271
+
272
+ @new_browser = WatirSpec.new_browser
273
+
274
+ ua = @new_browser.execute_script 'return window.navigator.userAgent'
275
+ expect(ua).to eq('foo;bar')
276
+ end
277
+ end
278
+ end
279
+
280
+ it 'takes service as argument', only: {browser: :chrome} do
281
+ @original = WatirSpec.implementation.clone
282
+ browser.close
283
+ @opts = WatirSpec.implementation.browser_args.last
284
+ browser_name = WatirSpec.implementation.browser_args.first
285
+
286
+ service = Selenium::WebDriver::Service.send(browser_name, port: '2314', args: ['foo'])
287
+
288
+ @opts[:service] = service
289
+ @opts[:listener] = LocalConfig::SelectorListener.new
290
+
291
+ @new_browser = WatirSpec.new_browser
292
+
293
+ bridge = @new_browser.wd.instance_variable_get(:@bridge)
294
+ expect(bridge).to be_a Selenium::WebDriver::Support::EventFiringBridge
295
+ service = @new_browser.wd.instance_variable_get(:@service)
296
+ expect(service.instance_variable_get(:@extra_args)).to eq ['foo']
297
+ expect(service.instance_variable_get(:@port)).to eq 2314
298
+
299
+ @new_browser.close
300
+ ensure
301
+ WatirSpec.implementation = @original.clone
302
+ end
303
+
304
+ it 'takes a driver instance as argument' do
305
+ mock_driver = instance_double(Selenium::WebDriver::Driver)
306
+ allow(Selenium::WebDriver::Driver).to receive(:===).and_return(true)
307
+ expect { described_class.new(mock_driver) }.not_to raise_error
308
+ expect(Selenium::WebDriver::Driver).to have_received(:===).with(mock_driver)
309
+ end
310
+
311
+ it 'raises ArgumentError for invalid args' do
312
+ expect { described_class.new(Struct.new) }.to raise_error(ArgumentError)
313
+ end
314
+ end
315
+
316
+ describe '.start' do
317
+ it 'goes to the given URL and return an instance of itself' do
318
+ browser.close
319
+ sleep 1
320
+ driver, args = WatirSpec.implementation.browser_args
321
+ b = described_class.start(WatirSpec.url_for('non_control_elements.html'), driver, args.dup)
322
+
323
+ expect(b).to be_instance_of(described_class)
324
+ expect(b.title).to eq 'Non-control elements'
325
+ b.close
326
+ end
327
+ end
328
+
329
+ describe '#goto' do
330
+ it 'adds http:// to URLs with no URL scheme specified' do
331
+ url = WatirSpec.host[%r{http://(.*)}, 1]
332
+ expect(url).not_to be_nil
333
+ browser.goto(url)
334
+ expect(browser.url).to match(%r{http://#{url}/?})
335
+ end
336
+
337
+ it 'goes to the given url without raising errors' do
338
+ expect { browser.goto(WatirSpec.url_for('non_control_elements.html')) }.not_to raise_error
339
+ end
340
+
341
+ it "goes to the url 'about:blank' without raising errors" do
342
+ expect { browser.goto('about:blank') }.not_to raise_error
343
+ end
344
+
345
+ it 'goes to a data URL scheme address without raising errors' do
346
+ expect { browser.goto('data:text/html;content-type=utf-8,foobar') }.not_to raise_error
347
+ end
348
+
349
+ it "goes to internal Chrome URL 'chrome://settings/browser' without raising errors",
350
+ exclusive: {browser: %i[chrome edge]} do
351
+ expect { browser.goto('chrome://settings/browser') }.not_to raise_error
352
+ end
353
+
354
+ it 'updates the page when location is changed with setTimeout + window.location' do
355
+ browser.goto(WatirSpec.url_for('timeout_window_location.html'))
356
+ browser.wait_while { |b| b.url.match?(/timeout_window_location|blank/) }
357
+ expect(browser.url).to include('non_control_elements.html')
358
+ end
359
+ end
360
+
361
+ describe '#refresh' do
362
+ it 'refreshes the page' do
363
+ browser.goto(WatirSpec.url_for('non_control_elements.html'))
364
+
365
+ browser.div(id: 'best_language').scroll.to
366
+ browser.div(id: 'best_language').click
367
+ expect(browser.div(id: 'best_language').text).to include('Ruby!')
368
+ browser.refresh
369
+ browser.div(id: 'best_language').wait_until(&:present?)
370
+ expect(browser.div(id: 'best_language').text).not_to include('Ruby!')
371
+ end
372
+ end
373
+
374
+ describe '#execute_script' do
375
+ before { browser.goto(WatirSpec.url_for('non_control_elements.html')) }
376
+
377
+ it 'executes the given JavaScript on the current page' do
378
+ expect(browser.pre(id: 'rspec').text).not_to eq 'javascript text'
379
+ browser.execute_script("document.getElementById('rspec').innerHTML = 'javascript text'")
380
+ expect(browser.pre(id: 'rspec').text).to eq 'javascript text'
381
+ end
382
+
383
+ it 'executes the given JavaScript in the context of an anonymous function' do
384
+ expect(browser.execute_script('1 + 1')).to be_nil
385
+ expect(browser.execute_script('return 1 + 1')).to eq 2
386
+ end
387
+
388
+ it 'returns correct Ruby objects' do
389
+ expect(browser.execute_script('return {a: 1, "b": 2}')).to eq({'a' => 1, 'b' => 2})
390
+ expect(browser.execute_script('return [1, 2, "3"]')).to contain_exactly(1, 2, '3')
391
+ expect(browser.execute_script('return 1.2 + 1.3')).to eq 2.5
392
+ expect(browser.execute_script('return 2 + 2')).to eq 4
393
+ expect(browser.execute_script('return "hello"')).to eq 'hello'
394
+ expect(browser.execute_script('return')).to be_nil
395
+ expect(browser.execute_script('return null')).to be_nil
396
+ expect(browser.execute_script('return undefined')).to be_nil
397
+ expect(browser.execute_script('return true')).to be true
398
+ expect(browser.execute_script('return false')).to be false
399
+ end
400
+
401
+ it 'works correctly with multi-line strings and special characters' do
402
+ expect(browser.execute_script("//multiline rocks!
403
+ var a = 22; // comment on same line
404
+ /* more
405
+ comments */
406
+ var b = '33';
407
+ var c = \"44\";
408
+ return a + b + c")).to eq '223344'
409
+ end
410
+
411
+ it 'wraps elements as Watir objects' do
412
+ returned = browser.execute_script('return document.body')
413
+ expect(returned).to be_a(Watir::Body)
414
+ end
415
+
416
+ it 'wraps elements in an array' do
417
+ list = browser.execute_script('return [document.body];')
418
+ expect(list.size).to eq 1
419
+ expect(list.first).to be_a(Watir::Body)
420
+ end
421
+
422
+ it 'wraps elements in a Hash' do
423
+ hash = browser.execute_script('return {element: document.body};')
424
+ expect(hash['element']).to be_a(Watir::Body)
425
+ end
426
+
427
+ it 'wraps elements in a deep object',
428
+ except: {browser: %i[chrome edge],
429
+ reason: 'https://bugs.chromium.org/p/chromedriver/issues/detail?id=4536'} do
430
+ hash = browser.execute_script('return {elements: [document.body], body: {element: document.body }}')
431
+
432
+ expect(hash['elements'].first).to be_a(Watir::Body)
433
+ expect(hash['body']['element']).to be_a(Watir::Body)
434
+ end
435
+ end
436
+
437
+ describe '#back and #forward' do
438
+ it 'goes to the previous page' do
439
+ browser.goto WatirSpec.url_for('non_control_elements.html')
440
+ orig_url = browser.url
441
+ browser.goto WatirSpec.url_for('tables.html')
442
+ new_url = browser.url
443
+ expect(orig_url).not_to eq new_url
444
+ browser.back
445
+ expect(orig_url).to eq browser.url
446
+ end
447
+
448
+ it 'goes to the next page' do
449
+ urls = []
450
+ browser.goto WatirSpec.url_for('non_control_elements.html')
451
+ urls << browser.url
452
+ browser.goto WatirSpec.url_for('tables.html')
453
+ urls << browser.url
454
+
455
+ browser.back
456
+ expect(browser.url).to eq urls.first
457
+ browser.forward
458
+ expect(browser.url).to eq urls.last
459
+ end
460
+
461
+ it 'navigates between several history items' do
462
+ urls = ['non_control_elements.html',
463
+ 'tables.html',
464
+ 'forms_with_input_elements.html',
465
+ 'definition_lists.html'].map do |page|
466
+ browser.goto WatirSpec.url_for(page)
467
+ browser.url
468
+ end
469
+
470
+ 3.times { browser.back }
471
+ expect(browser.url).to eq urls.first
472
+ 2.times { browser.forward }
473
+ expect(browser.url).to eq urls[2]
474
+ end
475
+ end
476
+
477
+ it 'raises UnknownObjectException when trying to access DOM elements on plain/text-page' do
478
+ browser.goto(WatirSpec.url_for('plain_text'))
479
+ expect { browser.div(id: 'foo').id }.to raise_unknown_object_exception
480
+ end
481
+
482
+ it 'raises an error when trying to interact with a closed browser' do
483
+ browser.goto WatirSpec.url_for 'definition_lists.html'
484
+ browser.close
485
+
486
+ expect { browser.dl(id: 'experience-list').id }.to raise_error(Watir::Exception::Error, 'browser was closed')
487
+ end
488
+
489
+ describe '#ready_state' do
490
+ it "gets the document's readyState property" do
491
+ allow(browser).to receive(:execute_script)
492
+ browser.ready_state
493
+ expect(browser).to have_received(:execute_script).with('return document.readyState')
494
+ end
495
+ end
496
+
497
+ describe '#wait' do
498
+ # The only way to get engage this method is with page load strategy set to "none"
499
+ # This spec is both mocking out the response and demonstrating the necessary settings for it to be meaningful
500
+ it 'waits for document ready state to be complete' do
501
+ @original = WatirSpec.implementation.clone
502
+ browser.close
503
+ @opts = WatirSpec.implementation.browser_args.last
504
+
505
+ @opts[:options] = {page_load_strategy: :none}
506
+ browser = WatirSpec.new_browser
507
+
508
+ start_time = ::Time.now
509
+ allow(browser).to receive(:ready_state) { ::Time.now < start_time + 3 ? 'loading' : 'complete' }
510
+ expect(browser.ready_state).to eq 'loading'
511
+
512
+ browser.wait(20)
513
+ expect(::Time.now - start_time).to be > 3
514
+ expect(browser.ready_state).to eq 'complete'
515
+
516
+ browser.close
517
+ ensure
518
+ WatirSpec.implementation = @original.clone
519
+ end
520
+ end
521
+
522
+ describe '#inspect' do
523
+ it 'works even if browser is closed' do
524
+ allow(browser).to receive(:url).and_raise(Errno::ECONNREFUSED)
525
+ expect { browser.inspect }.not_to raise_error
526
+ expect(browser).to have_received(:url).once
527
+ end
528
+ end
529
+
530
+ describe '#screenshot' do
531
+ it 'returns an instance of of Watir::Screenshot' do
532
+ expect(browser.screenshot).to be_a(Watir::Screenshot)
533
+ end
534
+ end
535
+ end
536
+ end