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/lib/http.js CHANGED
@@ -29,21 +29,37 @@ const cmd = require('./command');
29
29
  const error = require('./error');
30
30
  const logging = require('./logging');
31
31
  const promise = require('./promise');
32
- const Session = require('./session').Session;
33
- const WebElement = require('./webdriver').WebElement;
32
+ const {Session} = require('./session');
33
+ const {WebElement} = require('./webdriver');
34
34
 
35
- const {getAttribute, isDisplayed} = /** @suppress {undefinedVars|uselessCode} */(function() {
35
+ const getAttribute = requireAtom(
36
+ './atoms/get-attribute.js',
37
+ '//javascript/node/selenium-webdriver/lib/atoms:get-attribute.js');
38
+ const isDisplayed = requireAtom(
39
+ './atoms/is-displayed.js',
40
+ '//javascript/node/selenium-webdriver/lib/atoms:is-displayed.js');
41
+
42
+ /**
43
+ * @param {string} module
44
+ * @param {string} bazelTarget
45
+ * @return {!Function}
46
+ */
47
+ function requireAtom(module, bazelTarget) {
36
48
  try {
37
- return {
38
- getAttribute: require('./atoms/getAttribute.js'),
39
- isDisplayed: require('./atoms/is-displayed.js')
40
- };
49
+ return require(module);
41
50
  } catch (ex) {
42
- throw Error(
43
- 'Failed to import atoms modules. If running in devmode, you need to run'
44
- + ' `./go node:atoms` from the project root: ' + ex);
51
+ try {
52
+ const file = bazelTarget.slice(2).replace(':', '/');
53
+ return require(`../../../../bazel-genfiles/${file}`);
54
+ } catch (ex2) {
55
+ console.log(ex2);
56
+ throw Error(
57
+ `Failed to import atoms module ${module}. If running in dev mode, you`
58
+ + ` need to run \`bazel build ${bazelTarget}\` from the project`
59
+ + `root: ${ex}`);
60
+ }
45
61
  }
46
- })();
62
+ }
47
63
 
48
64
 
49
65
  /**
@@ -145,7 +161,7 @@ function resource(method, path) { return {method: method, path: path}; }
145
161
  var CommandSpec;
146
162
 
147
163
 
148
- /** @typedef {function(!cmd.Command): !Promise<!cmd.Command>} */
164
+ /** @typedef {function(!cmd.Command): !cmd.Command} */
149
165
  var CommandTransformer;
150
166
 
151
167
 
@@ -155,21 +171,17 @@ class InternalTypeError extends TypeError {}
155
171
  /**
156
172
  * @param {!cmd.Command} command The initial command.
157
173
  * @param {Atom} atom The name of the atom to execute.
158
- * @return {!Promise<!cmd.Command>} The transformed command to execute.
174
+ * @return {!cmd.Command} The transformed command to execute.
159
175
  */
160
176
  function toExecuteAtomCommand(command, atom, ...params) {
161
- return new Promise((resolve, reject) => {
162
- if (typeof atom !== 'function') {
163
- reject(new InternalTypeError('atom is not a function: ' + typeof atom));
164
- return;
165
- }
177
+ if (typeof atom !== 'function') {
178
+ throw new InternalTypeError('atom is not a function: ' + typeof atom);
179
+ }
166
180
 
167
- let newCmd = new cmd.Command(cmd.Name.EXECUTE_SCRIPT)
168
- .setParameter('sessionId', command.getParameter('sessionId'))
169
- .setParameter('script', `return (${atom}).apply(null, arguments)`)
170
- .setParameter('args', params.map(param => command.getParameter(param)));
171
- resolve(newCmd);
172
- });
181
+ return new cmd.Command(cmd.Name.EXECUTE_SCRIPT)
182
+ .setParameter('sessionId', command.getParameter('sessionId'))
183
+ .setParameter('script', `return (${atom}).apply(null, arguments)`)
184
+ .setParameter('args', params.map(param => command.getParameter(param)));
173
185
  }
174
186
 
175
187
 
@@ -179,7 +191,6 @@ const COMMAND_MAP = new Map([
179
191
  [cmd.Name.GET_SERVER_STATUS, get('/status')],
180
192
  [cmd.Name.NEW_SESSION, post('/session')],
181
193
  [cmd.Name.GET_SESSIONS, get('/sessions')],
182
- [cmd.Name.DESCRIBE_SESSION, get('/session/:sessionId')],
183
194
  [cmd.Name.QUIT, del('/session/:sessionId')],
184
195
  [cmd.Name.CLOSE, del('/session/:sessionId/window')],
185
196
  [cmd.Name.GET_CURRENT_WINDOW_HANDLE, get('/session/:sessionId/window_handle')],
@@ -211,7 +222,6 @@ const COMMAND_MAP = new Map([
211
222
  [cmd.Name.GET_ELEMENT_SIZE, get('/session/:sessionId/element/:id/size')],
212
223
  [cmd.Name.GET_ELEMENT_ATTRIBUTE, get('/session/:sessionId/element/:id/attribute/:name')],
213
224
  [cmd.Name.GET_ELEMENT_VALUE_OF_CSS_PROPERTY, get('/session/:sessionId/element/:id/css/:propertyName')],
214
- [cmd.Name.ELEMENT_EQUALS, get('/session/:sessionId/element/:id/equals/:other')],
215
225
  [cmd.Name.TAKE_ELEMENT_SCREENSHOT, get('/session/:sessionId/element/:id/screenshot')],
216
226
  [cmd.Name.SWITCH_TO_WINDOW, post('/session/:sessionId/window')],
217
227
  [cmd.Name.MAXIMIZE_WINDOW, post('/session/:sessionId/window/current/maximize')],
@@ -220,6 +230,7 @@ const COMMAND_MAP = new Map([
220
230
  [cmd.Name.GET_WINDOW_SIZE, get('/session/:sessionId/window/current/size')],
221
231
  [cmd.Name.SET_WINDOW_SIZE, post('/session/:sessionId/window/current/size')],
222
232
  [cmd.Name.SWITCH_TO_FRAME, post('/session/:sessionId/frame')],
233
+ [cmd.Name.SWITCH_TO_FRAME_PARENT, post('/session/:sessionId/frame/parent')],
223
234
  [cmd.Name.GET_PAGE_SOURCE, get('/session/:sessionId/source')],
224
235
  [cmd.Name.GET_TITLE, get('/session/:sessionId/title')],
225
236
  [cmd.Name.EXECUTE_SCRIPT, post('/session/:sessionId/execute')],
@@ -227,57 +238,104 @@ const COMMAND_MAP = new Map([
227
238
  [cmd.Name.SCREENSHOT, get('/session/:sessionId/screenshot')],
228
239
  [cmd.Name.GET_TIMEOUT, get('/session/:sessionId/timeouts')],
229
240
  [cmd.Name.SET_TIMEOUT, post('/session/:sessionId/timeouts')],
230
- [cmd.Name.MOVE_TO, post('/session/:sessionId/moveto')],
231
- [cmd.Name.CLICK, post('/session/:sessionId/click')],
232
- [cmd.Name.DOUBLE_CLICK, post('/session/:sessionId/doubleclick')],
233
- [cmd.Name.MOUSE_DOWN, post('/session/:sessionId/buttondown')],
234
- [cmd.Name.MOUSE_UP, post('/session/:sessionId/buttonup')],
235
- [cmd.Name.MOVE_TO, post('/session/:sessionId/moveto')],
236
- [cmd.Name.SEND_KEYS_TO_ACTIVE_ELEMENT, post('/session/:sessionId/keys')],
237
- [cmd.Name.TOUCH_SINGLE_TAP, post('/session/:sessionId/touch/click')],
238
- [cmd.Name.TOUCH_DOUBLE_TAP, post('/session/:sessionId/touch/doubleclick')],
239
- [cmd.Name.TOUCH_DOWN, post('/session/:sessionId/touch/down')],
240
- [cmd.Name.TOUCH_UP, post('/session/:sessionId/touch/up')],
241
- [cmd.Name.TOUCH_MOVE, post('/session/:sessionId/touch/move')],
242
- [cmd.Name.TOUCH_SCROLL, post('/session/:sessionId/touch/scroll')],
243
- [cmd.Name.TOUCH_LONG_PRESS, post('/session/:sessionId/touch/longclick')],
244
- [cmd.Name.TOUCH_FLICK, post('/session/:sessionId/touch/flick')],
245
241
  [cmd.Name.ACCEPT_ALERT, post('/session/:sessionId/accept_alert')],
246
242
  [cmd.Name.DISMISS_ALERT, post('/session/:sessionId/dismiss_alert')],
247
243
  [cmd.Name.GET_ALERT_TEXT, get('/session/:sessionId/alert_text')],
248
244
  [cmd.Name.SET_ALERT_TEXT, post('/session/:sessionId/alert_text')],
249
- [cmd.Name.SET_ALERT_CREDENTIALS, post('/session/:sessionId/alert/credentials')],
250
245
  [cmd.Name.GET_LOG, post('/session/:sessionId/log')],
251
246
  [cmd.Name.GET_AVAILABLE_LOG_TYPES, get('/session/:sessionId/log/types')],
252
247
  [cmd.Name.GET_SESSION_LOGS, post('/logs')],
253
248
  [cmd.Name.UPLOAD_FILE, post('/session/:sessionId/file')],
249
+ [cmd.Name.LEGACY_ACTION_CLICK, post('/session/:sessionId/click')],
250
+ [cmd.Name.LEGACY_ACTION_DOUBLE_CLICK, post('/session/:sessionId/doubleclick')],
251
+ [cmd.Name.LEGACY_ACTION_MOUSE_DOWN, post('/session/:sessionId/buttondown')],
252
+ [cmd.Name.LEGACY_ACTION_MOUSE_UP, post('/session/:sessionId/buttonup')],
253
+ [cmd.Name.LEGACY_ACTION_MOUSE_MOVE, post('/session/:sessionId/moveto')],
254
+ [cmd.Name.LEGACY_ACTION_SEND_KEYS, post('/session/:sessionId/keys')],
255
+ [cmd.Name.LEGACY_ACTION_TOUCH_DOWN, post('/session/:sessionId/touch/down')],
256
+ [cmd.Name.LEGACY_ACTION_TOUCH_UP, post('/session/:sessionId/touch/up')],
257
+ [cmd.Name.LEGACY_ACTION_TOUCH_MOVE, post('/session/:sessionId/touch/move')],
258
+ [cmd.Name.LEGACY_ACTION_TOUCH_SCROLL, post('/session/:sessionId/touch/scroll')],
259
+ [cmd.Name.LEGACY_ACTION_TOUCH_LONG_PRESS, post('/session/:sessionId/touch/longclick')],
260
+ [cmd.Name.LEGACY_ACTION_TOUCH_FLICK, post('/session/:sessionId/touch/flick')],
261
+ [cmd.Name.LEGACY_ACTION_TOUCH_SINGLE_TAP, post('/session/:sessionId/touch/click')],
262
+ [cmd.Name.LEGACY_ACTION_TOUCH_DOUBLE_TAP, post('/session/:sessionId/touch/doubleclick')],
254
263
  ]);
255
264
 
256
265
 
257
266
  /** @const {!Map<string, (CommandSpec|CommandTransformer)>} */
258
267
  const W3C_COMMAND_MAP = new Map([
268
+ // Server status.
269
+ [cmd.Name.GET_SERVER_STATUS, get('/status')],
270
+ // Session management.
271
+ [cmd.Name.NEW_SESSION, post('/session')],
272
+ [cmd.Name.QUIT, del('/session/:sessionId')],
273
+ [cmd.Name.GET_TIMEOUT, get('/session/:sessionId/timeouts')],
274
+ [cmd.Name.SET_TIMEOUT, post('/session/:sessionId/timeouts')],
275
+ // Navigation.
276
+ [cmd.Name.GET_CURRENT_URL, get('/session/:sessionId/url')],
277
+ [cmd.Name.GET, post('/session/:sessionId/url')],
278
+ [cmd.Name.GO_BACK, post('/session/:sessionId/back')],
279
+ [cmd.Name.GO_FORWARD, post('/session/:sessionId/forward')],
280
+ [cmd.Name.REFRESH, post('/session/:sessionId/refresh')],
281
+ // Page inspection.
282
+ [cmd.Name.GET_PAGE_SOURCE, get('/session/:sessionId/source')],
283
+ [cmd.Name.GET_TITLE, get('/session/:sessionId/title')],
284
+ // Script execution.
285
+ [cmd.Name.EXECUTE_SCRIPT, post('/session/:sessionId/execute/sync')],
286
+ [cmd.Name.EXECUTE_ASYNC_SCRIPT, post('/session/:sessionId/execute/async')],
287
+ // Frame selection.
288
+ [cmd.Name.SWITCH_TO_FRAME, post('/session/:sessionId/frame')],
289
+ [cmd.Name.SWITCH_TO_FRAME_PARENT, post('/session/:sessionId/frame/parent')],
290
+ // Window management.
291
+ [cmd.Name.GET_CURRENT_WINDOW_HANDLE, get('/session/:sessionId/window')],
292
+ [cmd.Name.CLOSE, del('/session/:sessionId/window')],
293
+ [cmd.Name.SWITCH_TO_WINDOW, post('/session/:sessionId/window')],
294
+ [cmd.Name.SWITCH_TO_NEW_WINDOW, post('/session/:sessionId/window/new')],
295
+ [cmd.Name.GET_WINDOW_HANDLES, get('/session/:sessionId/window/handles')],
296
+ [cmd.Name.GET_WINDOW_RECT, get('/session/:sessionId/window/rect')],
297
+ [cmd.Name.SET_WINDOW_RECT, post('/session/:sessionId/window/rect')],
298
+ [cmd.Name.MAXIMIZE_WINDOW, post('/session/:sessionId/window/maximize')],
299
+ [cmd.Name.MINIMIZE_WINDOW, post('/session/:sessionId/window/minimize')],
300
+ [cmd.Name.FULLSCREEN_WINDOW, post('/session/:sessionId/window/fullscreen')],
301
+ // Actions.
302
+ [cmd.Name.ACTIONS, post('/session/:sessionId/actions')],
303
+ [cmd.Name.CLEAR_ACTIONS, del('/session/:sessionId/actions')],
304
+ // Locating elements.
259
305
  [cmd.Name.GET_ACTIVE_ELEMENT, get('/session/:sessionId/element/active')],
260
- [cmd.Name.GET_ALERT_TEXT, get('/session/:sessionId/alert/text')],
261
- [cmd.Name.SET_ALERT_TEXT, post('/session/:sessionId/alert/text')],
262
- [cmd.Name.ACCEPT_ALERT, post('/session/:sessionId/alert/accept')],
263
- [cmd.Name.DISMISS_ALERT, post('/session/:sessionId/alert/dismiss')],
306
+ [cmd.Name.FIND_ELEMENT, post('/session/:sessionId/element')],
307
+ [cmd.Name.FIND_ELEMENTS, post('/session/:sessionId/elements')],
308
+ [cmd.Name.FIND_CHILD_ELEMENT, post('/session/:sessionId/element/:id/element')],
309
+ [cmd.Name.FIND_CHILD_ELEMENTS, post('/session/:sessionId/element/:id/elements')],
310
+ // Element interaction.
311
+ [cmd.Name.GET_ELEMENT_TAG_NAME, get('/session/:sessionId/element/:id/name')],
312
+ [cmd.Name.GET_ELEMENT_VALUE_OF_CSS_PROPERTY, get('/session/:sessionId/element/:id/css/:propertyName')],
313
+ [cmd.Name.GET_ELEMENT_RECT, get('/session/:sessionId/element/:id/rect')],
314
+ [cmd.Name.CLEAR_ELEMENT, post('/session/:sessionId/element/:id/clear')],
315
+ [cmd.Name.CLICK_ELEMENT, post('/session/:sessionId/element/:id/click')],
316
+ [cmd.Name.SEND_KEYS_TO_ELEMENT, post('/session/:sessionId/element/:id/value')],
317
+ [cmd.Name.GET_ELEMENT_TEXT, get('/session/:sessionId/element/:id/text')],
318
+ [cmd.Name.IS_ELEMENT_ENABLED, get('/session/:sessionId/element/:id/enabled')],
264
319
  [cmd.Name.GET_ELEMENT_ATTRIBUTE, (cmd) => {
265
320
  return toExecuteAtomCommand(cmd, Atom.GET_ATTRIBUTE, 'id', 'name');
266
321
  }],
267
- [cmd.Name.GET_ELEMENT_LOCATION, get('/session/:sessionId/element/:id/rect')],
268
- [cmd.Name.GET_ELEMENT_SIZE, get('/session/:sessionId/element/:id/rect')],
269
322
  [cmd.Name.IS_ELEMENT_DISPLAYED, (cmd) => {
270
323
  return toExecuteAtomCommand(cmd, Atom.IS_DISPLAYED, 'id');
271
324
  }],
272
- [cmd.Name.EXECUTE_SCRIPT, post('/session/:sessionId/execute/sync')],
273
- [cmd.Name.EXECUTE_ASYNC_SCRIPT, post('/session/:sessionId/execute/async')],
274
- [cmd.Name.MAXIMIZE_WINDOW, post('/session/:sessionId/window/maximize')],
275
- [cmd.Name.GET_WINDOW_POSITION, get('/session/:sessionId/window/position')],
276
- [cmd.Name.SET_WINDOW_POSITION, post('/session/:sessionId/window/position')],
277
- [cmd.Name.GET_WINDOW_SIZE, get('/session/:sessionId/window/size')],
278
- [cmd.Name.SET_WINDOW_SIZE, post('/session/:sessionId/window/size')],
279
- [cmd.Name.GET_CURRENT_WINDOW_HANDLE, get('/session/:sessionId/window')],
280
- [cmd.Name.GET_WINDOW_HANDLES, get('/session/:sessionId/window/handles')],
325
+ // Cookie management.
326
+ [cmd.Name.GET_ALL_COOKIES, get('/session/:sessionId/cookie')],
327
+ [cmd.Name.ADD_COOKIE, post('/session/:sessionId/cookie')],
328
+ [cmd.Name.DELETE_ALL_COOKIES, del('/session/:sessionId/cookie')],
329
+ [cmd.Name.GET_COOKIE, get('/session/:sessionId/cookie/:name')],
330
+ [cmd.Name.DELETE_COOKIE, del('/session/:sessionId/cookie/:name')],
331
+ // Alert management.
332
+ [cmd.Name.ACCEPT_ALERT, post('/session/:sessionId/alert/accept')],
333
+ [cmd.Name.DISMISS_ALERT, post('/session/:sessionId/alert/dismiss')],
334
+ [cmd.Name.GET_ALERT_TEXT, get('/session/:sessionId/alert/text')],
335
+ [cmd.Name.SET_ALERT_TEXT, post('/session/:sessionId/alert/text')],
336
+ // Screenshots.
337
+ [cmd.Name.SCREENSHOT, get('/session/:sessionId/screenshot')],
338
+ [cmd.Name.TAKE_ELEMENT_SCREENSHOT, get('/session/:sessionId/element/:id/screenshot')],
281
339
  ]);
282
340
 
283
341
 
@@ -301,35 +359,13 @@ class Client {
301
359
  }
302
360
 
303
361
 
304
- const CLIENTS =
305
- /** !WeakMap<!Executor, !(Client|IThenable<!Client>)> */new WeakMap;
306
-
307
-
308
- /**
309
- * Sends a request using the given executor.
310
- * @param {!Executor} executor
311
- * @param {!Request} request
312
- * @return {!Promise<Response>}
313
- */
314
- function doSend(executor, request) {
315
- const client = CLIENTS.get(executor);
316
- if (promise.isPromise(client)) {
317
- return client.then(client => {
318
- CLIENTS.set(executor, client);
319
- return client.send(request);
320
- });
321
- } else {
322
- return client.send(request);
323
- }
324
- }
325
-
326
362
 
327
363
  /**
328
364
  * @param {Map<string, CommandSpec>} customCommands
329
365
  * A map of custom command definitions.
330
366
  * @param {boolean} w3c Whether to use W3C command mappings.
331
367
  * @param {!cmd.Command} command The command to resolve.
332
- * @return {!Promise<!Request>} A promise that will resolve with the
368
+ * @return {!Request} A promise that will resolve with the
333
369
  * command to execute.
334
370
  */
335
371
  function buildRequest(customCommands, w3c, command) {
@@ -343,8 +379,8 @@ function buildRequest(customCommands, w3c, command) {
343
379
  spec = W3C_COMMAND_MAP.get(command.getName());
344
380
  if (typeof spec === 'function') {
345
381
  LOG.finest(() => `Transforming command for W3C: ${command.getName()}`);
346
- return spec(command)
347
- .then(newCommand => buildRequest(customCommands, w3c, newCommand));
382
+ let newCommand = spec(command);
383
+ return buildRequest(customCommands, w3c, newCommand);
348
384
  } else if (spec) {
349
385
  return toHttpRequest(spec);
350
386
  }
@@ -354,23 +390,26 @@ function buildRequest(customCommands, w3c, command) {
354
390
  if (spec) {
355
391
  return toHttpRequest(spec);
356
392
  }
357
- return Promise.reject(
358
- new error.UnknownCommandError(
359
- 'Unrecognized command: ' + command.getName()));
393
+ throw new error.UnknownCommandError(
394
+ 'Unrecognized command: ' + command.getName());
360
395
 
361
396
  /**
362
397
  * @param {CommandSpec} resource
363
- * @return {!Promise<!Request>}
398
+ * @return {!Request}
364
399
  */
365
400
  function toHttpRequest(resource) {
366
401
  LOG.finest(() => `Building HTTP request: ${JSON.stringify(resource)}`);
367
402
  let parameters = command.getParameters();
368
403
  let path = buildPath(resource.path, parameters);
369
- return Promise.resolve(new Request(resource.method, path, parameters));
404
+ return new Request(resource.method, path, parameters);
370
405
  }
371
406
  }
372
407
 
373
408
 
409
+ const CLIENTS =
410
+ /** !WeakMap<!Executor, !(Client|IThenable<!Client>)> */new WeakMap;
411
+
412
+
374
413
  /**
375
414
  * A command executor that communicates with the server using JSON over HTTP.
376
415
  *
@@ -430,38 +469,41 @@ class Executor {
430
469
  }
431
470
 
432
471
  /** @override */
433
- execute(command) {
472
+ async execute(command) {
434
473
  let request = buildRequest(this.customCommands_, this.w3c, command);
435
- return request.then(request => {
436
- this.log_.finer(() => `>>> ${request.method} ${request.path}`);
437
- return doSend(this, request).then(response => {
438
- this.log_.finer(() => `>>>\n${request}\n<<<\n${response}`);
439
-
440
- let httpResponse = /** @type {!Response} */(response);
441
- let {isW3C, value} = parseHttpResponse(command, httpResponse);
442
-
443
- if (command.getName() === cmd.Name.NEW_SESSION
444
- || command.getName() === cmd.Name.DESCRIBE_SESSION) {
445
- if (!value || !value.sessionId) {
446
- throw new error.WebDriverError(
447
- `Unable to parse new session response: ${response.body}`);
448
- }
449
-
450
- // The remote end is a W3C compliant server if there is no `status`
451
- // field in the response. This is not applicable for the DESCRIBE_SESSION
452
- // command, which is not defined in the W3C spec.
453
- if (command.getName() === cmd.Name.NEW_SESSION) {
454
- this.w3c = this.w3c || isW3C;
455
- }
456
-
457
- // No implementations use the `capabilities` key yet...
458
- let capabilities = value.capabilities || value.value;
459
- return new Session(value.sessionId, capabilities);
460
- }
474
+ this.log_.finer(() => `>>> ${request.method} ${request.path}`);
475
+
476
+ let client = CLIENTS.get(this);
477
+ if (promise.isPromise(client)) {
478
+ client = await client;
479
+ CLIENTS.set(this, client);
480
+ }
481
+
482
+ let response = await client.send(request);
483
+ this.log_.finer(() => `>>>\n${request}\n<<<\n${response}`);
484
+
485
+ let httpResponse = /** @type {!Response} */(response);
486
+ let {isW3C, value} = parseHttpResponse(command, httpResponse);
487
+
488
+ if (command.getName() === cmd.Name.NEW_SESSION) {
489
+ if (!value || !value.sessionId) {
490
+ throw new error.WebDriverError(
491
+ `Unable to parse new session response: ${response.body}`);
492
+ }
493
+
494
+ // The remote end is a W3C compliant server if there is no `status`
495
+ // field in the response.
496
+ if (command.getName() === cmd.Name.NEW_SESSION) {
497
+ this.w3c = this.w3c || isW3C;
498
+ }
499
+
500
+ // No implementations use the `capabilities` key yet...
501
+ let capabilities = value.capabilities || value.value;
502
+ return new Session(
503
+ /** @type {{sessionId: string}} */(value).sessionId, capabilities);
504
+ }
461
505
 
462
- return typeof value === 'undefined' ? null : value;
463
- });
464
- });
506
+ return typeof value === 'undefined' ? null : value;
465
507
  }
466
508
  }
467
509
 
@@ -510,8 +552,7 @@ function parseHttpResponse(command, httpResponse) {
510
552
 
511
553
  // Adjust legacy new session responses to look like W3C to simplify
512
554
  // later processing.
513
- if (command.getName() === cmd.Name.NEW_SESSION
514
- || command.getName() == cmd.Name.DESCRIBE_SESSION) {
555
+ if (command.getName() === cmd.Name.NEW_SESSION) {
515
556
  value = parsed;
516
557
  }
517
558
 
@@ -531,7 +572,7 @@ function parseHttpResponse(command, httpResponse) {
531
572
  // 404 represents an unknown command; anything else > 399 is a generic unknown
532
573
  // error.
533
574
  if (httpResponse.status == 404) {
534
- throw new error.UnsupportedOperationError(value);
575
+ throw new error.UnsupportedOperationError(command.getName() + ': ' + value);
535
576
  } else if (httpResponse.status >= 400) {
536
577
  throw new error.WebDriverError(value);
537
578
  }