selenium-webdriver 3.5.0 → 4.0.0-alpha.4

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 (366) hide show
  1. package/CHANGES.md +246 -0
  2. package/LICENSE +1 -1
  3. package/NOTICE +1 -1
  4. package/README.md +40 -40
  5. package/chrome.js +118 -134
  6. package/edge.js +43 -117
  7. package/example/chrome_android.js +8 -9
  8. package/example/chrome_mobile_emulation.js +8 -9
  9. package/example/firefox_channels.js +23 -19
  10. package/example/google_search.js +3 -3
  11. package/example/google_search_test.js +38 -27
  12. package/example/{chrome_headless.js → headless.js} +15 -7
  13. package/example/logging.js +40 -7
  14. package/firefox.js +789 -0
  15. package/http/index.js +62 -9
  16. package/http/util.js +11 -6
  17. package/ie.js +83 -97
  18. package/index.js +198 -114
  19. package/io/exec.js +29 -15
  20. package/io/index.js +1 -1
  21. package/io/zip.js +1 -1
  22. package/lib/actions.js +68 -63
  23. package/lib/atoms/get-attribute.js +86 -0
  24. package/lib/atoms/is-displayed.js +76 -76
  25. package/lib/by.js +7 -4
  26. package/lib/capabilities.js +310 -210
  27. package/lib/command.js +27 -51
  28. package/lib/error.js +100 -41
  29. package/lib/http.js +161 -120
  30. package/lib/input.js +1044 -8
  31. package/lib/logging.js +1 -5
  32. package/lib/promise.js +222 -3331
  33. package/lib/proxy.js +134 -39
  34. package/lib/session.js +2 -2
  35. package/lib/symbols.js +0 -0
  36. package/lib/until.js +1 -1
  37. package/lib/webdriver.js +717 -953
  38. package/net/index.js +21 -25
  39. package/net/portprober.js +51 -68
  40. package/package.json +17 -12
  41. package/proxy.js +0 -0
  42. package/remote/index.js +63 -44
  43. package/safari.js +41 -128
  44. package/testing/index.js +386 -315
  45. package/.npmignore +0 -2
  46. package/example/async_await_test.js +0 -68
  47. package/example/google_search_generator.js +0 -50
  48. package/example/parallel_flows.js +0 -54
  49. package/firefox/binary.js +0 -344
  50. package/firefox/extension.js +0 -224
  51. package/firefox/index.js +0 -626
  52. package/firefox/profile.js +0 -394
  53. package/lib/README +0 -5
  54. package/lib/atoms/getAttribute.js +0 -9
  55. package/lib/devmode.js +0 -34
  56. package/lib/events.js +0 -210
  57. package/lib/firefox/webdriver.json +0 -70
  58. package/lib/test/build.js +0 -151
  59. package/lib/test/data/ClickTest_testClicksASurroundingStrongTag.html +0 -11
  60. package/lib/test/data/Page.aspx +0 -17
  61. package/lib/test/data/Page.aspx.cs +0 -22
  62. package/lib/test/data/Redirect.aspx +0 -11
  63. package/lib/test/data/Redirect.aspx.cs +0 -9
  64. package/lib/test/data/Settings.StyleCop +0 -759
  65. package/lib/test/data/Web.Config +0 -59
  66. package/lib/test/data/actualXhtmlPage.xhtml +0 -14
  67. package/lib/test/data/ajaxy_page.html +0 -81
  68. package/lib/test/data/alerts.html +0 -85
  69. package/lib/test/data/banner.gif +0 -0
  70. package/lib/test/data/beach.jpg +0 -0
  71. package/lib/test/data/blank.html +0 -1
  72. package/lib/test/data/bodyTypingTest.html +0 -41
  73. package/lib/test/data/booleanAttributes.html +0 -19
  74. package/lib/test/data/child/childPage.html +0 -8
  75. package/lib/test/data/child/grandchild/grandchildPage.html +0 -8
  76. package/lib/test/data/clickEventPage.html +0 -26
  77. package/lib/test/data/click_frames.html +0 -10
  78. package/lib/test/data/click_jacker.html +0 -38
  79. package/lib/test/data/click_out_of_bounds.html +0 -23
  80. package/lib/test/data/click_out_of_bounds_overflow.html +0 -85
  81. package/lib/test/data/click_rtl.html +0 -19
  82. package/lib/test/data/click_source.html +0 -18
  83. package/lib/test/data/click_tests/click_iframe.html +0 -6
  84. package/lib/test/data/click_tests/click_in_iframe.html +0 -8
  85. package/lib/test/data/click_tests/disabled_element.html +0 -12
  86. package/lib/test/data/click_tests/disappearing_element.html +0 -62
  87. package/lib/test/data/click_tests/google_map.html +0 -15
  88. package/lib/test/data/click_tests/google_map.png +0 -0
  89. package/lib/test/data/click_tests/html5_submit_buttons.html +0 -16
  90. package/lib/test/data/click_tests/issue5237.html +0 -9
  91. package/lib/test/data/click_tests/issue5237_frame.html +0 -1
  92. package/lib/test/data/click_tests/issue5237_target.html +0 -10
  93. package/lib/test/data/click_tests/link_that_wraps.html +0 -11
  94. package/lib/test/data/click_tests/mapped_page1.html +0 -9
  95. package/lib/test/data/click_tests/mapped_page2.html +0 -9
  96. package/lib/test/data/click_tests/mapped_page3.html +0 -9
  97. package/lib/test/data/click_tests/overlapping_elements.html +0 -70
  98. package/lib/test/data/click_tests/partially_overlapping_elements.html +0 -124
  99. package/lib/test/data/click_tests/span_that_wraps.html +0 -11
  100. package/lib/test/data/click_tests/submitted_page.html +0 -9
  101. package/lib/test/data/click_tests/wrapped_overlapping_elements.html +0 -13
  102. package/lib/test/data/click_too_big.html +0 -10
  103. package/lib/test/data/click_too_big_in_frame.html +0 -11
  104. package/lib/test/data/clicks.html +0 -35
  105. package/lib/test/data/closeable_window.html +0 -8
  106. package/lib/test/data/cn-test.html +0 -156
  107. package/lib/test/data/colorPage.html +0 -20
  108. package/lib/test/data/cookies.html +0 -30
  109. package/lib/test/data/coordinates_tests/element_in_frame.html +0 -9
  110. package/lib/test/data/coordinates_tests/element_in_nested_frame.html +0 -9
  111. package/lib/test/data/coordinates_tests/page_with_element_out_of_view.html +0 -11
  112. package/lib/test/data/coordinates_tests/page_with_empty_element.html +0 -10
  113. package/lib/test/data/coordinates_tests/page_with_fixed_element.html +0 -12
  114. package/lib/test/data/coordinates_tests/page_with_hidden_element.html +0 -10
  115. package/lib/test/data/coordinates_tests/page_with_invisible_element.html +0 -10
  116. package/lib/test/data/coordinates_tests/page_with_transparent_element.html +0 -10
  117. package/lib/test/data/coordinates_tests/simple_page.html +0 -10
  118. package/lib/test/data/css/ui-lightness/images/ui-bg_diagonals-thick_18_b81900_40x40.png +0 -0
  119. package/lib/test/data/css/ui-lightness/images/ui-bg_diagonals-thick_20_666666_40x40.png +0 -0
  120. package/lib/test/data/css/ui-lightness/images/ui-bg_flat_10_000000_40x100.png +0 -0
  121. package/lib/test/data/css/ui-lightness/images/ui-bg_glass_100_f6f6f6_1x400.png +0 -0
  122. package/lib/test/data/css/ui-lightness/images/ui-bg_glass_100_fdf5ce_1x400.png +0 -0
  123. package/lib/test/data/css/ui-lightness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  124. package/lib/test/data/css/ui-lightness/images/ui-bg_gloss-wave_35_f6a828_500x100.png +0 -0
  125. package/lib/test/data/css/ui-lightness/images/ui-bg_highlight-soft_100_eeeeee_1x100.png +0 -0
  126. package/lib/test/data/css/ui-lightness/images/ui-bg_highlight-soft_75_ffe45c_1x100.png +0 -0
  127. package/lib/test/data/css/ui-lightness/images/ui-icons_222222_256x240.png +0 -0
  128. package/lib/test/data/css/ui-lightness/images/ui-icons_228ef1_256x240.png +0 -0
  129. package/lib/test/data/css/ui-lightness/images/ui-icons_ef8c08_256x240.png +0 -0
  130. package/lib/test/data/css/ui-lightness/images/ui-icons_ffd27a_256x240.png +0 -0
  131. package/lib/test/data/css/ui-lightness/images/ui-icons_ffffff_256x240.png +0 -0
  132. package/lib/test/data/css/ui-lightness/jquery-ui-1.8.10.custom.css +0 -573
  133. package/lib/test/data/cssTransform.html +0 -61
  134. package/lib/test/data/cssTransform2.html +0 -20
  135. package/lib/test/data/document_write_in_onload.html +0 -13
  136. package/lib/test/data/dragAndDropInsideScrolledDiv.html +0 -67
  137. package/lib/test/data/dragAndDropTest.html +0 -102
  138. package/lib/test/data/dragDropOverflow.html +0 -104
  139. package/lib/test/data/draggableLists.html +0 -67
  140. package/lib/test/data/droppableItems.html +0 -65
  141. package/lib/test/data/dynamic.html +0 -39
  142. package/lib/test/data/dynamicallyModifiedPage.html +0 -42
  143. package/lib/test/data/errors.html +0 -15
  144. package/lib/test/data/firefox/jetpack-sample.xpi +0 -0
  145. package/lib/test/data/firefox/sample.xpi +0 -0
  146. package/lib/test/data/firefox/webextension.xpi +0 -0
  147. package/lib/test/data/fixedFooterNoScroll.html +0 -13
  148. package/lib/test/data/fixedFooterNoScrollQuirksMode.html +0 -12
  149. package/lib/test/data/formPage.html +0 -175
  150. package/lib/test/data/formSelectionPage.html +0 -46
  151. package/lib/test/data/form_handling_js_submit.html +0 -30
  152. package/lib/test/data/framePage3.html +0 -7
  153. package/lib/test/data/frameScrollChild.html +0 -26
  154. package/lib/test/data/frameScrollPage.html +0 -14
  155. package/lib/test/data/frameScrollParent.html +0 -11
  156. package/lib/test/data/frameWithAnimals.html +0 -11
  157. package/lib/test/data/frame_switching_tests/bug4876.html +0 -9
  158. package/lib/test/data/frame_switching_tests/bug4876_iframe.html +0 -9
  159. package/lib/test/data/frame_switching_tests/deletingFrame.html +0 -29
  160. package/lib/test/data/frame_switching_tests/deletingFrame_iframe.html +0 -8
  161. package/lib/test/data/frame_switching_tests/deletingFrame_iframe2.html +0 -7
  162. package/lib/test/data/frameset.html +0 -14
  163. package/lib/test/data/framesetPage2.html +0 -7
  164. package/lib/test/data/framesetPage3.html +0 -4
  165. package/lib/test/data/globalscope.html +0 -15
  166. package/lib/test/data/hidden.html +0 -5
  167. package/lib/test/data/hidden_partially.html +0 -45
  168. package/lib/test/data/html5/blue.jpg +0 -0
  169. package/lib/test/data/html5/database.js +0 -84
  170. package/lib/test/data/html5/geolocation.js +0 -18
  171. package/lib/test/data/html5/green.jpg +0 -0
  172. package/lib/test/data/html5/red.jpg +0 -0
  173. package/lib/test/data/html5/status.html +0 -1
  174. package/lib/test/data/html5/test.appcache +0 -11
  175. package/lib/test/data/html5/yellow.jpg +0 -0
  176. package/lib/test/data/html5Page.html +0 -32
  177. package/lib/test/data/icon.gif +0 -0
  178. package/lib/test/data/idElements.html +0 -2
  179. package/lib/test/data/iframeAtBottom.html +0 -15
  180. package/lib/test/data/iframeWithAlert.html +0 -1
  181. package/lib/test/data/iframeWithIframe.html +0 -1
  182. package/lib/test/data/iframes.html +0 -11
  183. package/lib/test/data/injectableContent.html +0 -22
  184. package/lib/test/data/javascriptEnhancedForm.html +0 -30
  185. package/lib/test/data/javascriptPage.html +0 -285
  186. package/lib/test/data/jquery-1.3.2.js +0 -4376
  187. package/lib/test/data/js/jquery-1.4.4.min.js +0 -167
  188. package/lib/test/data/js/jquery-ui-1.8.10.custom.min.js +0 -782
  189. package/lib/test/data/js/skins/lightgray/content.inline.min.css +0 -1
  190. package/lib/test/data/js/skins/lightgray/content.min.css +0 -1
  191. package/lib/test/data/js/skins/lightgray/fonts/readme.md +0 -1
  192. package/lib/test/data/js/skins/lightgray/fonts/tinymce-small.dev.svg +0 -175
  193. package/lib/test/data/js/skins/lightgray/fonts/tinymce-small.eot +0 -0
  194. package/lib/test/data/js/skins/lightgray/fonts/tinymce-small.svg +0 -62
  195. package/lib/test/data/js/skins/lightgray/fonts/tinymce-small.ttf +0 -0
  196. package/lib/test/data/js/skins/lightgray/fonts/tinymce-small.woff +0 -0
  197. package/lib/test/data/js/skins/lightgray/fonts/tinymce.dev.svg +0 -153
  198. package/lib/test/data/js/skins/lightgray/fonts/tinymce.eot +0 -0
  199. package/lib/test/data/js/skins/lightgray/fonts/tinymce.svg +0 -63
  200. package/lib/test/data/js/skins/lightgray/fonts/tinymce.ttf +0 -0
  201. package/lib/test/data/js/skins/lightgray/fonts/tinymce.woff +0 -0
  202. package/lib/test/data/js/skins/lightgray/img/anchor.gif +0 -0
  203. package/lib/test/data/js/skins/lightgray/img/loader.gif +0 -0
  204. package/lib/test/data/js/skins/lightgray/img/object.gif +0 -0
  205. package/lib/test/data/js/skins/lightgray/img/trans.gif +0 -0
  206. package/lib/test/data/js/skins/lightgray/skin.ie7.min.css +0 -1
  207. package/lib/test/data/js/skins/lightgray/skin.min.css +0 -1
  208. package/lib/test/data/js/themes/modern/theme.min.js +0 -1
  209. package/lib/test/data/js/tinymce.min.js +0 -10
  210. package/lib/test/data/key_logger.html +0 -34
  211. package/lib/test/data/key_tests/remove_on_keypress.html +0 -36
  212. package/lib/test/data/keyboard_shortcut.html +0 -36
  213. package/lib/test/data/linked_image.html +0 -16
  214. package/lib/test/data/locators_tests/boolean_attribute_selected.html +0 -13
  215. package/lib/test/data/locators_tests/boolean_attribute_selected_html4.html +0 -13
  216. package/lib/test/data/longContentPage.html +0 -55
  217. package/lib/test/data/macbeth.html +0 -5255
  218. package/lib/test/data/map.png +0 -0
  219. package/lib/test/data/map_visibility.html +0 -8
  220. package/lib/test/data/markerTransparent.png +0 -0
  221. package/lib/test/data/messages.html +0 -15
  222. package/lib/test/data/meta-redirect.html +0 -11
  223. package/lib/test/data/missedJsReference.html +0 -11
  224. package/lib/test/data/modal_dialogs/modal_1.html +0 -21
  225. package/lib/test/data/modal_dialogs/modal_2.html +0 -21
  226. package/lib/test/data/modal_dialogs/modal_3.html +0 -15
  227. package/lib/test/data/modal_dialogs/modalindex.html +0 -21
  228. package/lib/test/data/mouseOver.html +0 -17
  229. package/lib/test/data/mousePositionTracker.html +0 -33
  230. package/lib/test/data/nestedElements.html +0 -164
  231. package/lib/test/data/overflow/x_auto_y_auto.html +0 -30
  232. package/lib/test/data/overflow/x_auto_y_hidden.html +0 -30
  233. package/lib/test/data/overflow/x_auto_y_scroll.html +0 -30
  234. package/lib/test/data/overflow/x_hidden_y_auto.html +0 -30
  235. package/lib/test/data/overflow/x_hidden_y_hidden.html +0 -30
  236. package/lib/test/data/overflow/x_hidden_y_scroll.html +0 -30
  237. package/lib/test/data/overflow/x_scroll_y_auto.html +0 -30
  238. package/lib/test/data/overflow/x_scroll_y_hidden.html +0 -30
  239. package/lib/test/data/overflow/x_scroll_y_scroll.html +0 -30
  240. package/lib/test/data/overflow-body.html +0 -15
  241. package/lib/test/data/pageWithOnBeforeUnloadMessage.html +0 -20
  242. package/lib/test/data/pageWithOnLoad.html +0 -6
  243. package/lib/test/data/pageWithOnUnload.html +0 -6
  244. package/lib/test/data/page_with_link_to_slow_loading_page.html +0 -6
  245. package/lib/test/data/plain.txt +0 -1
  246. package/lib/test/data/proxy/page1.html +0 -20
  247. package/lib/test/data/proxy/page2.html +0 -24
  248. package/lib/test/data/proxy/page3.html +0 -5
  249. package/lib/test/data/readOnlyPage.html +0 -24
  250. package/lib/test/data/rectangles.html +0 -40
  251. package/lib/test/data/resultPage.html +0 -25
  252. package/lib/test/data/rich_text.html +0 -161
  253. package/lib/test/data/safari/frames_benchmark.html +0 -31
  254. package/lib/test/data/screen/screen.css +0 -19
  255. package/lib/test/data/screen/screen.html +0 -72
  256. package/lib/test/data/screen/screen.js +0 -7
  257. package/lib/test/data/screen/screen_frame1.html +0 -72
  258. package/lib/test/data/screen/screen_frame2.html +0 -72
  259. package/lib/test/data/screen/screen_frames.html +0 -11
  260. package/lib/test/data/screen/screen_iframes.html +0 -12
  261. package/lib/test/data/screen/screen_too_long.html +0 -68
  262. package/lib/test/data/screen/screen_x_long.html +0 -72
  263. package/lib/test/data/screen/screen_x_too_long.html +0 -72
  264. package/lib/test/data/screen/screen_y_long.html +0 -72
  265. package/lib/test/data/screen/screen_y_too_long.html +0 -72
  266. package/lib/test/data/scroll.html +0 -27
  267. package/lib/test/data/scroll2.html +0 -21
  268. package/lib/test/data/scroll3.html +0 -8
  269. package/lib/test/data/scroll4.html +0 -7
  270. package/lib/test/data/scroll5.html +0 -18
  271. package/lib/test/data/scrolling_tests/frame_with_height_above_200.html +0 -26
  272. package/lib/test/data/scrolling_tests/frame_with_height_above_2000.html +0 -26
  273. package/lib/test/data/scrolling_tests/frame_with_nested_scrolling_frame.html +0 -11
  274. package/lib/test/data/scrolling_tests/frame_with_nested_scrolling_frame_out_of_view.html +0 -12
  275. package/lib/test/data/scrolling_tests/frame_with_small_height.html +0 -10
  276. package/lib/test/data/scrolling_tests/page_with_double_overflow_auto.html +0 -19
  277. package/lib/test/data/scrolling_tests/page_with_frame_out_of_view.html +0 -12
  278. package/lib/test/data/scrolling_tests/page_with_nested_scrolling_frames.html +0 -11
  279. package/lib/test/data/scrolling_tests/page_with_nested_scrolling_frames_out_of_view.html +0 -12
  280. package/lib/test/data/scrolling_tests/page_with_non_scrolling_frame.html +0 -11
  281. package/lib/test/data/scrolling_tests/page_with_scrolling_frame.html +0 -11
  282. package/lib/test/data/scrolling_tests/page_with_scrolling_frame_out_of_view.html +0 -12
  283. package/lib/test/data/scrolling_tests/page_with_tall_frame.html +0 -11
  284. package/lib/test/data/scrolling_tests/page_with_y_overflow_auto.html +0 -14
  285. package/lib/test/data/scrolling_tests/target_page.html +0 -9
  286. package/lib/test/data/selectPage.html +0 -58
  287. package/lib/test/data/selectableItems.html +0 -65
  288. package/lib/test/data/sessionCookie.html +0 -21
  289. package/lib/test/data/sessionCookieDest.html +0 -34
  290. package/lib/test/data/simple.xml +0 -5
  291. package/lib/test/data/simpleTest.html +0 -98
  292. package/lib/test/data/single_text_input.html +0 -12
  293. package/lib/test/data/slowLoadingAlert.html +0 -10
  294. package/lib/test/data/slowLoadingResourcePage.html +0 -12
  295. package/lib/test/data/slow_loading_iframes.html +0 -14
  296. package/lib/test/data/styledPage.html +0 -28
  297. package/lib/test/data/svgPiechart.xhtml +0 -81
  298. package/lib/test/data/svgTest.svg +0 -4
  299. package/lib/test/data/tables.html +0 -36
  300. package/lib/test/data/tinymce.html +0 -10
  301. package/lib/test/data/transformable.xml +0 -11
  302. package/lib/test/data/transformable.xsl +0 -37
  303. package/lib/test/data/transparentUpload.html +0 -70
  304. package/lib/test/data/underscore.html +0 -9
  305. package/lib/test/data/unicode_ltr.html +0 -8
  306. package/lib/test/data/upload.html +0 -45
  307. package/lib/test/data/userDefinedProperty.html +0 -8
  308. package/lib/test/data/veryLargeCanvas.html +0 -81
  309. package/lib/test/data/visibility-css.html +0 -21
  310. package/lib/test/data/win32frameset.html +0 -8
  311. package/lib/test/data/window_switching_tests/page_with_frame.html +0 -12
  312. package/lib/test/data/window_switching_tests/simple_page.html +0 -9
  313. package/lib/test/data/xhtmlFormPage.xhtml +0 -17
  314. package/lib/test/data/xhtmlTest.html +0 -76
  315. package/lib/test/fileserver.js +0 -321
  316. package/lib/test/httpserver.js +0 -120
  317. package/lib/test/index.js +0 -270
  318. package/lib/test/promise.js +0 -79
  319. package/lib/test/resources.js +0 -44
  320. package/opera.js +0 -405
  321. package/phantomjs.js +0 -282
  322. package/test/actions_test.js +0 -52
  323. package/test/chrome/options_test.js +0 -227
  324. package/test/chrome/service_test.js +0 -45
  325. package/test/cookie_test.js +0 -214
  326. package/test/element_finding_test.js +0 -426
  327. package/test/execute_script_test.js +0 -350
  328. package/test/fingerprint_test.js +0 -62
  329. package/test/firefox/extension_test.js +0 -120
  330. package/test/firefox/firefox_test.js +0 -261
  331. package/test/firefox/profile_test.js +0 -140
  332. package/test/http/http_test.js +0 -223
  333. package/test/http/util_test.js +0 -178
  334. package/test/io/io_test.js +0 -360
  335. package/test/io/zip_test.js +0 -128
  336. package/test/lib/by_test.js +0 -160
  337. package/test/lib/capabilities_test.js +0 -111
  338. package/test/lib/error_test.js +0 -305
  339. package/test/lib/events_test.js +0 -177
  340. package/test/lib/http_test.js +0 -696
  341. package/test/lib/logging_test.js +0 -272
  342. package/test/lib/promise_aplus_test.js +0 -78
  343. package/test/lib/promise_error_test.js +0 -884
  344. package/test/lib/promise_flow_test.js +0 -2288
  345. package/test/lib/promise_generator_test.js +0 -310
  346. package/test/lib/promise_test.js +0 -1109
  347. package/test/lib/testutil.js +0 -90
  348. package/test/lib/until_test.js +0 -478
  349. package/test/lib/webdriver_test.js +0 -2311
  350. package/test/logging_test.js +0 -167
  351. package/test/net/index_test.js +0 -60
  352. package/test/net/portprober_test.js +0 -128
  353. package/test/page_loading_test.js +0 -166
  354. package/test/phantomjs/execute_phantomjs_test.js +0 -59
  355. package/test/proxy_test.js +0 -180
  356. package/test/rect_test.js +0 -60
  357. package/test/remote_test.js +0 -117
  358. package/test/safari_test.js +0 -108
  359. package/test/session_test.js +0 -99
  360. package/test/stale_element_test.js +0 -63
  361. package/test/tag_name_test.js +0 -36
  362. package/test/testing/assert_test.js +0 -373
  363. package/test/testing/index_test.js +0 -224
  364. package/test/upload_test.js +0 -86
  365. package/test/window_test.js +0 -161
  366. package/testing/assert.js +0 -378
package/http/index.js CHANGED
@@ -59,6 +59,15 @@ function getRequestOptions(aUrl) {
59
59
  }
60
60
 
61
61
 
62
+ /** @const {string} */
63
+ const USER_AGENT = (function() {
64
+ const version = require('../package.json').version;
65
+ const platform =
66
+ ({'darwin': 'mac', 'win32': 'windows'}[process.platform]) || 'linux';
67
+ return `selenium/${version} (js ${platform})`;
68
+ })();
69
+
70
+
62
71
  /**
63
72
  * A basic HTTP client used to send messages to a remote end.
64
73
  *
@@ -93,10 +102,14 @@ class HttpClient {
93
102
  let data;
94
103
 
95
104
  let headers = {};
96
- httpRequest.headers.forEach(function(value, name) {
97
- headers[name] = value;
98
- });
99
105
 
106
+ if (httpRequest.headers) {
107
+ httpRequest.headers.forEach(function(value, name) {
108
+ headers[name] = value;
109
+ });
110
+ }
111
+
112
+ headers['User-Agent'] = USER_AGENT;
100
113
  headers['Content-Length'] = 0;
101
114
  if (httpRequest.method == 'POST' || httpRequest.method == 'PUT') {
102
115
  data = JSON.stringify(httpRequest.data);
@@ -144,8 +157,9 @@ class HttpClient {
144
157
  * @param {function(!Error)} onError The function to call if the request fails.
145
158
  * @param {?string=} opt_data The data to send with the request.
146
159
  * @param {?RequestOptions=} opt_proxy The proxy server to use for the request.
160
+ * @param {number=} opt_retries The current number of retries.
147
161
  */
148
- function sendRequest(options, onOk, onError, opt_data, opt_proxy) {
162
+ function sendRequest(options, onOk, onError, opt_data, opt_proxy, opt_retries) {
149
163
  var hostname = options.hostname;
150
164
  var port = options.port;
151
165
 
@@ -161,7 +175,7 @@ function sendRequest(options, onOk, onError, opt_data, opt_proxy) {
161
175
  // An HTTP/1.1 proxy MUST ensure that any request message it forwards does
162
176
  // contain an appropriate Host header field that identifies the service
163
177
  // being requested by the proxy.
164
- let targetHost = options.hostname
178
+ let targetHost = options.hostname;
165
179
  if (options.port) {
166
180
  targetHost += ':' + options.port;
167
181
  }
@@ -208,7 +222,8 @@ function sendRequest(options, onOk, onError, opt_data, opt_proxy) {
208
222
  search: location.search,
209
223
  hash: location.hash,
210
224
  headers: {
211
- 'Accept': 'application/json; charset=utf-8'
225
+ 'Accept': 'application/json; charset=utf-8',
226
+ 'User-Agent': USER_AGENT,
212
227
  }
213
228
  }, onOk, onError, undefined, opt_proxy);
214
229
  return;
@@ -220,15 +235,20 @@ function sendRequest(options, onOk, onError, opt_data, opt_proxy) {
220
235
  var resp = new httpLib.Response(
221
236
  /** @type {number} */(response.statusCode),
222
237
  /** @type {!Object<string>} */(response.headers),
223
- body.join('').replace(/\0/g, ''));
238
+ Buffer.concat(body).toString('utf8').replace(/\0/g, ''));
224
239
  onOk(resp);
225
240
  });
226
241
  });
227
242
 
228
243
  request.on('error', function(e) {
229
- if (e.code === 'ECONNRESET') {
244
+ if (typeof opt_retries === 'undefined') {
245
+ opt_retries = 0;
246
+ }
247
+
248
+ if (shouldRetryRequest(opt_retries, e)) {
249
+ opt_retries += 1;
230
250
  setTimeout(function() {
231
- sendRequest(options, onOk, onError, opt_data, opt_proxy);
251
+ sendRequest(options, onOk, onError, opt_data, opt_proxy, opt_retries);
232
252
  }, 15);
233
253
  } else {
234
254
  var message = e.message;
@@ -247,8 +267,41 @@ function sendRequest(options, onOk, onError, opt_data, opt_proxy) {
247
267
  }
248
268
 
249
269
 
270
+ const MAX_RETRIES = 3;
271
+
272
+ /**
273
+ * A retry is sometimes needed on Windows where we may quickly run out of
274
+ * ephemeral ports. A more robust solution is bumping the MaxUserPort setting
275
+ * as described here: http://msdn.microsoft.com/en-us/library/aa560610%28v=bts.20%29.aspx
276
+ *
277
+ * @param {!number} retries
278
+ * @param {!Error} err
279
+ * @return {boolean}
280
+ */
281
+ function shouldRetryRequest(retries, err) {
282
+ return retries < MAX_RETRIES && isRetryableNetworkError(err);
283
+ }
284
+
285
+ /**
286
+ * @param {!Error} err
287
+ * @return {boolean}
288
+ */
289
+ function isRetryableNetworkError(err) {
290
+ if (err && err.code) {
291
+ return err.code === 'ECONNABORTED' ||
292
+ err.code === 'ECONNRESET' ||
293
+ err.code === 'ECONNREFUSED' ||
294
+ err.code === 'EADDRINUSE' ||
295
+ err.code === 'EPIPE';
296
+ }
297
+
298
+ return false;
299
+ }
300
+
301
+
250
302
  // PUBLIC API
251
303
 
304
+ exports.Agent = http.Agent;
252
305
  exports.Executor = httpLib.Executor;
253
306
  exports.HttpClient = HttpClient;
254
307
  exports.Request = httpLib.Request;
package/http/util.js CHANGED
@@ -26,8 +26,7 @@ const Executor = require('./index').Executor,
26
26
  HttpRequest = require('./index').Request,
27
27
  Command = require('../lib/command').Command,
28
28
  CommandName = require('../lib/command').Name,
29
- error = require('../lib/error'),
30
- promise = require('../lib/promise');
29
+ error = require('../lib/error');
31
30
 
32
31
 
33
32
 
@@ -45,6 +44,9 @@ function getStatus(url) {
45
44
  }
46
45
 
47
46
 
47
+ class CancellationError {}
48
+
49
+
48
50
  // PUBLIC API
49
51
 
50
52
 
@@ -57,13 +59,16 @@ function getStatus(url) {
57
59
  exports.getStatus = getStatus;
58
60
 
59
61
 
62
+ exports.CancellationError = CancellationError;
63
+
64
+
60
65
  /**
61
66
  * Waits for a WebDriver server to be healthy and accepting requests.
62
67
  * @param {string} url Base URL of the server to query.
63
68
  * @param {number} timeout How long to wait for the server.
64
69
  * @param {Promise=} opt_cancelToken A promise used as a cancellation signal:
65
70
  * if resolved before the server is ready, the wait will be terminated
66
- * early with a {@link promise.CancellationError}.
71
+ * early with a {@link CancellationError}.
67
72
  * @return {!Promise} A promise that will resolve when the server is ready, or
68
73
  * if the wait is cancelled.
69
74
  */
@@ -82,7 +87,7 @@ exports.waitForServer = function(url, timeout, opt_cancelToken) {
82
87
  };
83
88
 
84
89
  if (opt_cancelToken) {
85
- opt_cancelToken.then(_ => reject(new promise.CancellationError));
90
+ opt_cancelToken.then(_ => reject(new CancellationError));
86
91
  }
87
92
 
88
93
  checkServerStatus();
@@ -119,7 +124,7 @@ exports.waitForServer = function(url, timeout, opt_cancelToken) {
119
124
  * @param {number} timeout How long to wait, in milliseconds.
120
125
  * @param {Promise=} opt_cancelToken A promise used as a cancellation signal:
121
126
  * if resolved before the a 2xx response is received, the wait will be
122
- * terminated early with a {@link promise.CancellationError}.
127
+ * terminated early with a {@link CancellationError}.
123
128
  * @return {!Promise} A promise that will resolve when a 2xx is received from
124
129
  * the given URL, or if the wait is cancelled.
125
130
  */
@@ -140,7 +145,7 @@ exports.waitForUrl = function(url, timeout, opt_cancelToken) {
140
145
  };
141
146
 
142
147
  if (opt_cancelToken) {
143
- opt_cancelToken.then(_ => reject(new promise.CancellationError));
148
+ opt_cancelToken.then(_ => reject(new CancellationError));
144
149
  }
145
150
 
146
151
  testUrl();
package/ie.js CHANGED
@@ -27,16 +27,16 @@
27
27
 
28
28
  'use strict';
29
29
 
30
- const fs = require('fs'),
31
- util = require('util');
30
+ const fs = require('fs');
31
+ const util = require('util');
32
32
 
33
- const http = require('./http'),
34
- io = require('./io'),
35
- capabilities = require('./lib/capabilities'),
36
- promise = require('./lib/promise'),
37
- webdriver = require('./lib/webdriver'),
38
- portprober = require('./net/portprober'),
39
- remote = require('./remote');
33
+ const http = require('./http');
34
+ const io = require('./io');
35
+ const portprober = require('./net/portprober');
36
+ const promise = require('./lib/promise');
37
+ const remote = require('./remote');
38
+ const webdriver = require('./lib/webdriver');
39
+ const {Browser, Capabilities, Capability} = require('./lib/capabilities');
40
40
 
41
41
 
42
42
  const IEDRIVER_EXE = 'IEDriverServer.exe';
@@ -86,37 +86,14 @@ const Key = {
86
86
  /**
87
87
  * Class for managing IEDriver specific options.
88
88
  */
89
- class Options {
90
- constructor() {
91
- /** @private {!Object<(boolean|number|string|!Array<string>)>} */
92
- this.options_ = {};
93
-
94
- /** @private {(capabilities.ProxyConfig|null)} */
95
- this.proxy_ = null;
96
- }
97
-
89
+ class Options extends Capabilities {
98
90
  /**
99
- * Extracts the IEDriver specific options from the given capabilities
100
- * object.
101
- * @param {!capabilities.Capabilities} caps The capabilities object.
102
- * @return {!Options} The IEDriver options.
91
+ * @param {(Capabilities|Map<string, ?>|Object)=} other Another set of
92
+ * capabilities to initialize this instance from.
103
93
  */
104
- static fromCapabilities(caps) {
105
- var options = new Options();
106
- var map = options.options_;
107
-
108
- Object.keys(Key).forEach(function(key) {
109
- key = Key[key];
110
- if (caps.has(key)) {
111
- map[key] = caps.get(key);
112
- }
113
- });
114
-
115
- if (caps.has(capabilities.Capability.PROXY)) {
116
- options.setProxy(caps.get(capabilities.Capability.PROXY));
117
- }
118
-
119
- return options;
94
+ constructor(other = undefined) {
95
+ super(other);
96
+ this.setBrowserName(Browser.IE);
120
97
  }
121
98
 
122
99
  /**
@@ -132,7 +109,7 @@ class Options {
132
109
  * @return {!Options} A self reference.
133
110
  */
134
111
  introduceFlakinessByIgnoringProtectedModeSettings(ignoreSettings) {
135
- this.options_[Key.IGNORE_PROTECTED_MODE_SETTINGS] = !!ignoreSettings;
112
+ this.set(Key.IGNORE_PROTECTED_MODE_SETTINGS, !!ignoreSettings);
136
113
  return this;
137
114
  }
138
115
 
@@ -144,7 +121,7 @@ class Options {
144
121
  * @return {!Options} A self reference.
145
122
  */
146
123
  ignoreZoomSetting(ignore) {
147
- this.options_[Key.IGNORE_ZOOM_SETTING] = !!ignore;
124
+ this.set(Key.IGNORE_ZOOM_SETTING, !!ignore);
148
125
  return this;
149
126
  }
150
127
 
@@ -159,7 +136,7 @@ class Options {
159
136
  * @return {!Options} A self reference.
160
137
  */
161
138
  initialBrowserUrl(url) {
162
- this.options_[Key.INITIAL_BROWSER_URL] = url;
139
+ this.set(Key.INITIAL_BROWSER_URL, url);
163
140
  return this;
164
141
  }
165
142
 
@@ -172,7 +149,7 @@ class Options {
172
149
  * @return {!Options} A self reference.
173
150
  */
174
151
  enablePersistentHover(enable) {
175
- this.options_[Key.ENABLE_PERSISTENT_HOVER] = !!enable;
152
+ this.set(Key.ENABLE_PERSISTENT_HOVER, !!enable);
176
153
  return this;
177
154
  }
178
155
 
@@ -186,7 +163,7 @@ class Options {
186
163
  * @return {!Options} A self reference.
187
164
  */
188
165
  enableElementCacheCleanup(enable) {
189
- this.options_[Key.ENABLE_ELEMENT_CACHE_CLEANUP] = !!enable;
166
+ this.set(Key.ENABLE_ELEMENT_CACHE_CLEANUP, !!enable);
190
167
  return this;
191
168
  }
192
169
 
@@ -200,7 +177,7 @@ class Options {
200
177
  * @return {!Options} A self reference.
201
178
  */
202
179
  requireWindowFocus(require) {
203
- this.options_[Key.REQUIRE_WINDOW_FOCUS] = !!require;
180
+ this.set(Key.REQUIRE_WINDOW_FOCUS, !!require);
204
181
  return this;
205
182
  }
206
183
 
@@ -213,7 +190,7 @@ class Options {
213
190
  * @return {!Options} A self reference.
214
191
  */
215
192
  browserAttachTimeout(timeout) {
216
- this.options_[Key.BROWSER_ATTACH_TIMEOUT] = Math.max(timeout, 0);
193
+ this.set(Key.BROWSER_ATTACH_TIMEOUT, Math.max(timeout, 0));
217
194
  return this;
218
195
  }
219
196
 
@@ -227,7 +204,7 @@ class Options {
227
204
  * @return {!Options} A self reference.
228
205
  */
229
206
  forceCreateProcessApi(force) {
230
- this.options_[Key.FORCE_CREATE_PROCESS] = !!force;
207
+ this.set(Key.FORCE_CREATE_PROCESS, !!force);
231
208
  return this;
232
209
  }
233
210
 
@@ -235,13 +212,14 @@ class Options {
235
212
  * Specifies command-line switches to use when launching Internet Explorer.
236
213
  * This is only valid when used with {@link #forceCreateProcessApi}.
237
214
  *
238
- * @param {...(string|!Array.<string>)} var_args The arguments to add.
215
+ * @param {...(string|!Array.<string>)} args The arguments to add.
239
216
  * @return {!Options} A self reference.
240
217
  */
241
- addArguments(var_args) {
242
- var args = this.options_[Key.BROWSER_COMMAND_LINE_SWITCHES] || [];
243
- args = args.concat.apply(args, arguments);
244
- this.options_[Key.BROWSER_COMMAND_LINE_SWITCHES] = args;
218
+ addArguments(...args) {
219
+ let current = this.get(Key.BROWSER_COMMAND_LINE_SWITCHES) || [];
220
+ this.set(
221
+ Key.BROWSER_COMMAND_LINE_SWITCHES,
222
+ current.concat.apply(current, args));
245
223
  return this;
246
224
  }
247
225
 
@@ -254,7 +232,7 @@ class Options {
254
232
  * @return {!Options} A self reference.
255
233
  */
256
234
  usePerProcessProxy(enable) {
257
- this.options_[Key.USE_PER_PROCESS_PROXY] = !!enable;
235
+ this.set(Key.USE_PER_PROCESS_PROXY, !!enable);
258
236
  return this;
259
237
  }
260
238
 
@@ -268,7 +246,7 @@ class Options {
268
246
  * @return {!Options} A self reference.
269
247
  */
270
248
  ensureCleanSession(cleanSession) {
271
- this.options_[Key.ENSURE_CLEAN_SESSION] = !!cleanSession;
249
+ this.set(Key.ENSURE_CLEAN_SESSION, !!cleanSession);
272
250
  return this;
273
251
  }
274
252
 
@@ -278,7 +256,7 @@ class Options {
278
256
  * @return {!Options} A self reference.
279
257
  */
280
258
  setLogFile(file) {
281
- this.options_[Key.LOG_FILE] = file;
259
+ this.set(Key.LOG_FILE, file);
282
260
  return this;
283
261
  }
284
262
 
@@ -288,7 +266,7 @@ class Options {
288
266
  * @return {!Options} A self reference.
289
267
  */
290
268
  setLogLevel(level) {
291
- this.options_[Key.LOG_LEVEL] = level;
269
+ this.set(Key.LOG_LEVEL, level);
292
270
  return this;
293
271
  }
294
272
 
@@ -298,7 +276,7 @@ class Options {
298
276
  * @return {!Options} A self reference.
299
277
  */
300
278
  setHost(host) {
301
- this.options_[Key.HOST] = host;
279
+ this.set(Key.HOST, host);
302
280
  return this;
303
281
  }
304
282
 
@@ -308,7 +286,7 @@ class Options {
308
286
  * @return {!Options} A self reference.
309
287
  */
310
288
  setExtractPath(path) {
311
- this.options_[Key.EXTRACT_PATH] = path;
289
+ this.set(Key.EXTRACT_PATH, path);
312
290
  return this;
313
291
  }
314
292
 
@@ -318,37 +296,21 @@ class Options {
318
296
  * @return {!Options} A self reference.
319
297
  */
320
298
  silent(silent) {
321
- this.options_[Key.SILENT] = silent;
299
+ this.set(Key.SILENT, silent);
322
300
  return this;
323
301
  }
302
+ }
324
303
 
325
- /**
326
- * Sets the proxy settings for the new session.
327
- * @param {capabilities.ProxyConfig} proxy The proxy configuration to use.
328
- * @return {!Options} A self reference.
329
- */
330
- setProxy(proxy) {
331
- this.proxy_ = proxy;
332
- return this;
333
- }
334
304
 
335
- /**
336
- * Converts this options instance to a {@link capabilities.Capabilities}
337
- * object.
338
- * @param {capabilities.Capabilities=} opt_capabilities The capabilities to
339
- * merge these options into, if any.
340
- * @return {!capabilities.Capabilities} The capabilities.
341
- */
342
- toCapabilities(opt_capabilities) {
343
- var caps = opt_capabilities || capabilities.Capabilities.ie();
344
- if (this.proxy_) {
345
- caps.set(capabilities.Capability.PROXY, this.proxy_);
346
- }
347
- Object.keys(this.options_).forEach(function(key) {
348
- caps.set(key, this.options_[key]);
349
- }, this);
350
- return caps;
351
- }
305
+ /**
306
+ * _Synchronously_ attempts to locate the IE driver executable on the current
307
+ * system.
308
+ *
309
+ * @return {?string} the located executable, or `null`.
310
+ */
311
+ function locateSynchronously() {
312
+ return process.platform === 'win32'
313
+ ? io.findInPath(IEDRIVER_EXE, true) : null;
352
314
  }
353
315
 
354
316
 
@@ -360,7 +322,7 @@ function createServiceFromCapabilities(capabilities) {
360
322
  'WebDriver server?');
361
323
  }
362
324
 
363
- let exe = io.findInPath(IEDRIVER_EXE, true);
325
+ let exe = locateSynchronously();
364
326
  if (!exe || !fs.existsSync(exe)) {
365
327
  throw Error(
366
328
  `${IEDRIVER_EXE} could not be found on the current PATH. Please ` +
@@ -398,6 +360,23 @@ function createServiceFromCapabilities(capabilities) {
398
360
  }
399
361
 
400
362
 
363
+ /**
364
+ * Creates {@link selenium-webdriver/remote.DriverService} instances that manage
365
+ * an [IEDriverServer](https://github.com/SeleniumHQ/selenium/wiki/InternetExplorerDriver)
366
+ * server in a child process.
367
+ */
368
+ class ServiceBuilder extends remote.DriverService.Builder {
369
+ /**
370
+ * @param {string=} opt_exe Path to the server executable to use. If omitted,
371
+ * the builder will attempt to locate the IEDriverServer on the system PATH.
372
+ */
373
+ constructor(opt_exe) {
374
+ super(opt_exe || IEDRIVER_EXE);
375
+ this.setLoopback(true); // Required.
376
+ }
377
+ }
378
+
379
+
401
380
  /**
402
381
  * A WebDriver client for Microsoft's Internet Explorer.
403
382
  */
@@ -405,23 +384,27 @@ class Driver extends webdriver.WebDriver {
405
384
  /**
406
385
  * Creates a new session for Microsoft's Internet Explorer.
407
386
  *
408
- * @param {(capabilities.Capabilities|Options)=} opt_config The configuration
409
- * options.
410
- * @param {promise.ControlFlow=} opt_flow The control flow to use,
411
- * or {@code null} to use the currently active flow.
387
+ * @param {(Capabilities|Options)=} options The configuration options.
388
+ * @param {(remote.DriverService)=} opt_service The `DriverService` to use
389
+ * to start the IEDriverServer in a child process, optionally.
412
390
  * @return {!Driver} A new driver instance.
413
391
  */
414
- static createSession(opt_config, opt_flow) {
415
- var caps = opt_config instanceof Options ?
416
- opt_config.toCapabilities() :
417
- (opt_config || capabilities.Capabilities.ie());
392
+ static createSession(options, opt_service) {
393
+ options = options || new Options();
418
394
 
419
- var service = createServiceFromCapabilities(caps);
420
- var client = service.start().then(url => new http.HttpClient(url));
421
- var executor = new http.Executor(client);
395
+ let service;
396
+
397
+ if (opt_service instanceof remote.DriverService) {
398
+ service = opt_service;
399
+ } else {
400
+ service = createServiceFromCapabilities(options);
401
+ }
402
+
403
+ let client = service.start().then(url => new http.HttpClient(url));
404
+ let executor = new http.Executor(client);
422
405
 
423
406
  return /** @type {!Driver} */(super.createSession(
424
- executor, caps, opt_flow, () => service.kill()));
407
+ executor, options, () => service.kill()));
425
408
  }
426
409
 
427
410
  /**
@@ -439,3 +422,6 @@ class Driver extends webdriver.WebDriver {
439
422
  exports.Driver = Driver;
440
423
  exports.Options = Options;
441
424
  exports.Level = Level;
425
+ exports.ServiceBuilder = ServiceBuilder;
426
+ exports.locateSynchronously = locateSynchronously;
427
+