selenium-webdriver 2.48.2 → 2.53.3

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 (534) hide show
  1. package/CHANGES.md +116 -0
  2. package/NOTICE +1 -1
  3. package/README.md +59 -9
  4. package/builder.js +375 -358
  5. package/chrome.js +549 -586
  6. package/edge.js +378 -0
  7. package/error.js +9 -6
  8. package/example/google_search.js +1 -1
  9. package/example/google_search_generator.js +2 -4
  10. package/example/logging.js +6 -2
  11. package/example/sample.js +21 -0
  12. package/executors.js +11 -27
  13. package/firefox/binary.js +149 -98
  14. package/firefox/extension.js +15 -19
  15. package/firefox/index.js +256 -163
  16. package/firefox/profile.js +223 -243
  17. package/http/index.js +487 -81
  18. package/http/util.js +40 -36
  19. package/ie.js +288 -309
  20. package/index.js +34 -125
  21. package/io/exec.js +58 -39
  22. package/io/index.js +72 -60
  23. package/lib/README +4 -0
  24. package/lib/actions.js +596 -0
  25. package/lib/by.js +277 -0
  26. package/lib/capabilities.js +450 -0
  27. package/lib/{webdriver/command.js → command.js} +91 -72
  28. package/lib/{webdriver/button.js → devmode.js} +13 -8
  29. package/lib/error.js +690 -0
  30. package/lib/events.js +212 -0
  31. package/lib/firefox/amd64/libnoblur64.so +0 -0
  32. package/lib/firefox/i386/libnoblur.so +0 -0
  33. package/lib/firefox/webdriver.json +5 -1
  34. package/lib/firefox/webdriver.xpi +0 -0
  35. package/lib/{webdriver/key.js → input.js} +84 -2
  36. package/lib/logging.js +670 -0
  37. package/lib/{webdriver/promise.js → promise.js} +817 -644
  38. package/lib/safari/client.js +266 -214
  39. package/lib/session.js +80 -0
  40. package/lib/{webdriver/serializable.js → symbols.js} +16 -19
  41. package/lib/test/build.js +4 -4
  42. package/lib/test/data/click_tests/html5_submit_buttons.html +2 -1
  43. package/lib/test/data/click_tests/overlapping_elements.html +15 -4
  44. package/lib/test/data/click_tests/partially_overlapping_elements.html +124 -0
  45. package/lib/test/data/click_tests/wrapped_overlapping_elements.html +13 -0
  46. package/lib/test/data/hidden_partially.html +45 -0
  47. package/lib/test/data/readOnlyPage.html +1 -1
  48. package/lib/test/data/selectPage.html +18 -2
  49. package/lib/test/fileserver.js +3 -4
  50. package/lib/test/index.js +7 -3
  51. package/lib/test/resources.js +1 -1
  52. package/lib/until.js +376 -0
  53. package/lib/webdriver.js +2440 -0
  54. package/net/index.js +4 -0
  55. package/net/portprober.js +16 -12
  56. package/opera.js +295 -314
  57. package/package.json +6 -5
  58. package/phantomjs.js +144 -147
  59. package/proxy.js +10 -6
  60. package/remote/index.js +289 -238
  61. package/safari.js +326 -311
  62. package/test/chrome/options_test.js +11 -9
  63. package/test/element_finding_test.js +51 -13
  64. package/test/execute_script_test.js +17 -3
  65. package/test/firefox/firefox_test.js +0 -32
  66. package/test/http/http_test.js +671 -61
  67. package/test/http/util_test.js +25 -23
  68. package/test/io_test.js +67 -1
  69. package/test/lib/by_test.js +139 -0
  70. package/test/lib/capabilities_test.js +111 -0
  71. package/test/lib/error_test.js +325 -0
  72. package/test/lib/events_test.js +177 -0
  73. package/test/lib/logging_test.js +272 -0
  74. package/test/{promise_aplus_test.js → lib/promise_aplus_test.js} +4 -13
  75. package/test/lib/promise_error_test.js +808 -0
  76. package/test/lib/promise_flow_test.js +2282 -0
  77. package/test/lib/promise_generator_test.js +308 -0
  78. package/test/lib/promise_test.js +996 -0
  79. package/test/lib/testutil.js +90 -0
  80. package/test/lib/until_test.js +400 -0
  81. package/test/lib/webdriver_test.js +2157 -0
  82. package/test/page_loading_test.js +7 -9
  83. package/test/remote_test.js +50 -3
  84. package/test/session_test.js +53 -0
  85. package/test/stale_element_test.js +2 -2
  86. package/test/testing/assert_test.js +374 -0
  87. package/test/testing/index_test.js +9 -11
  88. package/testing/assert.js +334 -17
  89. package/testing/index.js +12 -2
  90. package/_base.js +0 -200
  91. package/docs/Changes.html +0 -356
  92. package/docs/class_bot_Error.html +0 -15
  93. package/docs/class_webdriver_ActionSequence.html +0 -115
  94. package/docs/class_webdriver_Alert.html +0 -24
  95. package/docs/class_webdriver_AlertPromise.html +0 -92
  96. package/docs/class_webdriver_Capabilities.html +0 -60
  97. package/docs/class_webdriver_Command.html +0 -15
  98. package/docs/class_webdriver_EventEmitter.html +0 -35
  99. package/docs/class_webdriver_FileDetector.html +0 -21
  100. package/docs/class_webdriver_Locator.html +0 -12
  101. package/docs/class_webdriver_Serializable.html +0 -9
  102. package/docs/class_webdriver_Session.html +0 -13
  103. package/docs/class_webdriver_TouchSequence.html +0 -49
  104. package/docs/class_webdriver_UnhandledAlertError.html +0 -18
  105. package/docs/class_webdriver_WebDriver.html +0 -313
  106. package/docs/class_webdriver_WebDriver_Logs.html +0 -15
  107. package/docs/class_webdriver_WebDriver_Navigation.html +0 -16
  108. package/docs/class_webdriver_WebDriver_Options.html +0 -41
  109. package/docs/class_webdriver_WebDriver_TargetLocator.html +0 -38
  110. package/docs/class_webdriver_WebDriver_Timeouts.html +0 -29
  111. package/docs/class_webdriver_WebDriver_Window.html +0 -27
  112. package/docs/class_webdriver_WebElement.html +0 -223
  113. package/docs/class_webdriver_WebElementPromise.html +0 -274
  114. package/docs/class_webdriver_http_Executor.html +0 -22
  115. package/docs/class_webdriver_http_Request.html +0 -12
  116. package/docs/class_webdriver_http_Response.html +0 -13
  117. package/docs/class_webdriver_logging_Entry.html +0 -15
  118. package/docs/class_webdriver_logging_Level.html +0 -55
  119. package/docs/class_webdriver_logging_LogRecord.html +0 -45
  120. package/docs/class_webdriver_logging_Logger.html +0 -119
  121. package/docs/class_webdriver_logging_Preferences.html +0 -8
  122. package/docs/class_webdriver_promise_CancellationError.html +0 -17
  123. package/docs/class_webdriver_promise_ControlFlow.html +0 -153
  124. package/docs/class_webdriver_promise_Deferred.html +0 -84
  125. package/docs/class_webdriver_promise_MultipleUnhandledRejectionError.html +0 -14
  126. package/docs/class_webdriver_promise_Promise.html +0 -75
  127. package/docs/class_webdriver_stacktrace_Frame.html +0 -20
  128. package/docs/class_webdriver_stacktrace_Snapshot.html +0 -6
  129. package/docs/class_webdriver_testing_Assertion.html +0 -99
  130. package/docs/class_webdriver_testing_Assertion_DelegatingMatcher_.html +0 -13
  131. package/docs/class_webdriver_testing_ContainsMatcher.html +0 -11
  132. package/docs/class_webdriver_testing_NegatedAssertion.html +0 -97
  133. package/docs/class_webdriver_until_Condition.html +0 -7
  134. package/docs/dossier.css +0 -1
  135. package/docs/dossier.js +0 -86
  136. package/docs/enum_bot_ErrorCode.html +0 -3
  137. package/docs/enum_bot_Error_State.html +0 -2
  138. package/docs/enum_webdriver_Browser.html +0 -2
  139. package/docs/enum_webdriver_Button.html +0 -2
  140. package/docs/enum_webdriver_Capability.html +0 -33
  141. package/docs/enum_webdriver_CommandName.html +0 -3
  142. package/docs/enum_webdriver_Key.html +0 -12
  143. package/docs/enum_webdriver_logging_Type.html +0 -6
  144. package/docs/enum_webdriver_promise_ControlFlow_EventType.html +0 -9
  145. package/docs/index.html +0 -125
  146. package/docs/interface_webdriver_CommandExecutor.html +0 -9
  147. package/docs/interface_webdriver_http_Client.html +0 -10
  148. package/docs/interface_webdriver_promise_Thenable.html +0 -77
  149. package/docs/module_selenium-webdriver.html +0 -23
  150. package/docs/module_selenium-webdriver__base.html +0 -23
  151. package/docs/module_selenium-webdriver__base_class_Context.html +0 -5
  152. package/docs/module_selenium-webdriver_builder.html +0 -2
  153. package/docs/module_selenium-webdriver_builder_class_Builder.html +0 -138
  154. package/docs/module_selenium-webdriver_chrome.html +0 -90
  155. package/docs/module_selenium-webdriver_chrome_class_Driver.html +0 -280
  156. package/docs/module_selenium-webdriver_chrome_class_Options.html +0 -127
  157. package/docs/module_selenium-webdriver_chrome_class_ServiceBuilder.html +0 -46
  158. package/docs/module_selenium-webdriver_class_ActionSequence.html +0 -115
  159. package/docs/module_selenium-webdriver_class_Builder.html +0 -138
  160. package/docs/module_selenium-webdriver_class_Capabilities.html +0 -60
  161. package/docs/module_selenium-webdriver_class_Command.html +0 -15
  162. package/docs/module_selenium-webdriver_class_EventEmitter.html +0 -35
  163. package/docs/module_selenium-webdriver_class_FileDetector.html +0 -21
  164. package/docs/module_selenium-webdriver_class_Serializable.html +0 -9
  165. package/docs/module_selenium-webdriver_class_Session.html +0 -13
  166. package/docs/module_selenium-webdriver_class_WebDriver.html +0 -313
  167. package/docs/module_selenium-webdriver_class_WebElement.html +0 -223
  168. package/docs/module_selenium-webdriver_class_WebElementPromise.html +0 -274
  169. package/docs/module_selenium-webdriver_enum_Browser.html +0 -2
  170. package/docs/module_selenium-webdriver_enum_Button.html +0 -2
  171. package/docs/module_selenium-webdriver_enum_Capability.html +0 -33
  172. package/docs/module_selenium-webdriver_enum_CommandName.html +0 -3
  173. package/docs/module_selenium-webdriver_enum_Key.html +0 -12
  174. package/docs/module_selenium-webdriver_error.html +0 -4
  175. package/docs/module_selenium-webdriver_error_class_Error.html +0 -15
  176. package/docs/module_selenium-webdriver_error_enum_ErrorCode.html +0 -3
  177. package/docs/module_selenium-webdriver_executors.html +0 -10
  178. package/docs/module_selenium-webdriver_executors_class_DeferredExecutor.html +0 -12
  179. package/docs/module_selenium-webdriver_firefox.html +0 -68
  180. package/docs/module_selenium-webdriver_firefox_binary.html +0 -5
  181. package/docs/module_selenium-webdriver_firefox_binary_class_Binary.html +0 -20
  182. package/docs/module_selenium-webdriver_firefox_class_Binary.html +0 -20
  183. package/docs/module_selenium-webdriver_firefox_class_Driver.html +0 -276
  184. package/docs/module_selenium-webdriver_firefox_class_Options.html +0 -19
  185. package/docs/module_selenium-webdriver_firefox_class_Profile.html +0 -50
  186. package/docs/module_selenium-webdriver_firefox_extension.html +0 -8
  187. package/docs/module_selenium-webdriver_firefox_profile.html +0 -13
  188. package/docs/module_selenium-webdriver_firefox_profile_class_Profile.html +0 -50
  189. package/docs/module_selenium-webdriver_http.html +0 -9
  190. package/docs/module_selenium-webdriver_http_class_Executor.html +0 -22
  191. package/docs/module_selenium-webdriver_http_class_HttpClient.html +0 -16
  192. package/docs/module_selenium-webdriver_http_class_Request.html +0 -12
  193. package/docs/module_selenium-webdriver_http_class_Response.html +0 -13
  194. package/docs/module_selenium-webdriver_http_util.html +0 -17
  195. package/docs/module_selenium-webdriver_ie.html +0 -11
  196. package/docs/module_selenium-webdriver_ie_class_Driver.html +0 -274
  197. package/docs/module_selenium-webdriver_ie_class_Options.html +0 -89
  198. package/docs/module_selenium-webdriver_ie_enum_Level.html +0 -1
  199. package/docs/module_selenium-webdriver_io.html +0 -37
  200. package/docs/module_selenium-webdriver_io_exec.html +0 -6
  201. package/docs/module_selenium-webdriver_namespace_By.html +0 -56
  202. package/docs/module_selenium-webdriver_namespace_error.html +0 -4
  203. package/docs/module_selenium-webdriver_namespace_logging.html +0 -18
  204. package/docs/module_selenium-webdriver_namespace_promise.html +0 -163
  205. package/docs/module_selenium-webdriver_namespace_stacktrace.html +0 -17
  206. package/docs/module_selenium-webdriver_namespace_until.html +0 -82
  207. package/docs/module_selenium-webdriver_net.html +0 -7
  208. package/docs/module_selenium-webdriver_net_portprober.html +0 -12
  209. package/docs/module_selenium-webdriver_opera.html +0 -62
  210. package/docs/module_selenium-webdriver_opera_class_Driver.html +0 -276
  211. package/docs/module_selenium-webdriver_opera_class_Options.html +0 -44
  212. package/docs/module_selenium-webdriver_opera_class_ServiceBuilder.html +0 -35
  213. package/docs/module_selenium-webdriver_phantomjs.html +0 -2
  214. package/docs/module_selenium-webdriver_phantomjs_class_Driver.html +0 -299
  215. package/docs/module_selenium-webdriver_proxy.html +0 -28
  216. package/docs/module_selenium-webdriver_remote.html +0 -8
  217. package/docs/module_selenium-webdriver_remote_class_DriverService.html +0 -32
  218. package/docs/module_selenium-webdriver_remote_class_FileDetector.html +0 -22
  219. package/docs/module_selenium-webdriver_remote_class_SeleniumServer.html +0 -41
  220. package/docs/module_selenium-webdriver_safari.html +0 -9
  221. package/docs/module_selenium-webdriver_safari_class_Driver.html +0 -279
  222. package/docs/module_selenium-webdriver_safari_class_Options.html +0 -23
  223. package/docs/module_selenium-webdriver_testing.html +0 -74
  224. package/docs/module_selenium-webdriver_testing_assert.html +0 -9
  225. package/docs/namespace_bot.html +0 -4
  226. package/docs/namespace_bot_json.html +0 -20
  227. package/docs/namespace_bot_response.html +0 -18
  228. package/docs/namespace_bot_userAgent.html +0 -33
  229. package/docs/namespace_webdriver.html +0 -30
  230. package/docs/namespace_webdriver_By.html +0 -56
  231. package/docs/namespace_webdriver_http.html +0 -6
  232. package/docs/namespace_webdriver_logging.html +0 -70
  233. package/docs/namespace_webdriver_promise.html +0 -688
  234. package/docs/namespace_webdriver_stacktrace.html +0 -17
  235. package/docs/namespace_webdriver_testing.html +0 -7
  236. package/docs/namespace_webdriver_testing_assert.html +0 -9
  237. package/docs/namespace_webdriver_testing_asserts.html +0 -18
  238. package/docs/namespace_webdriver_until.html +0 -82
  239. package/docs/source/_base.js.src.html +0 -1
  240. package/docs/source/builder.js.src.html +0 -1
  241. package/docs/source/chrome.js.src.html +0 -1
  242. package/docs/source/error.js.src.html +0 -1
  243. package/docs/source/executors.js.src.html +0 -1
  244. package/docs/source/firefox/binary.js.src.html +0 -1
  245. package/docs/source/firefox/extension.js.src.html +0 -1
  246. package/docs/source/firefox/index.js.src.html +0 -1
  247. package/docs/source/firefox/profile.js.src.html +0 -1
  248. package/docs/source/http/index.js.src.html +0 -1
  249. package/docs/source/http/util.js.src.html +0 -1
  250. package/docs/source/ie.js.src.html +0 -1
  251. package/docs/source/index.js.src.html +0 -1
  252. package/docs/source/io/exec.js.src.html +0 -1
  253. package/docs/source/io/index.js.src.html +0 -1
  254. package/docs/source/lib/atoms/error.js.src.html +0 -1
  255. package/docs/source/lib/atoms/json.js.src.html +0 -1
  256. package/docs/source/lib/atoms/response.js.src.html +0 -1
  257. package/docs/source/lib/atoms/userAgent.js.src.html +0 -1
  258. package/docs/source/lib/goog/array/array.js.src.html +0 -1
  259. package/docs/source/lib/goog/asserts/asserts.js.src.html +0 -1
  260. package/docs/source/lib/goog/async/freelist.js.src.html +0 -1
  261. package/docs/source/lib/goog/async/nexttick.js.src.html +0 -1
  262. package/docs/source/lib/goog/async/run.js.src.html +0 -1
  263. package/docs/source/lib/goog/async/workqueue.js.src.html +0 -1
  264. package/docs/source/lib/goog/base.js.src.html +0 -1
  265. package/docs/source/lib/goog/debug/debug.js.src.html +0 -1
  266. package/docs/source/lib/goog/debug/entrypointregistry.js.src.html +0 -1
  267. package/docs/source/lib/goog/debug/error.js.src.html +0 -1
  268. package/docs/source/lib/goog/debug/logbuffer.js.src.html +0 -1
  269. package/docs/source/lib/goog/debug/logger.js.src.html +0 -1
  270. package/docs/source/lib/goog/debug/logrecord.js.src.html +0 -1
  271. package/docs/source/lib/goog/deps.js.src.html +0 -1
  272. package/docs/source/lib/goog/disposable/disposable.js.src.html +0 -1
  273. package/docs/source/lib/goog/disposable/idisposable.js.src.html +0 -1
  274. package/docs/source/lib/goog/dom/browserfeature.js.src.html +0 -1
  275. package/docs/source/lib/goog/dom/dom.js.src.html +0 -1
  276. package/docs/source/lib/goog/dom/nodetype.js.src.html +0 -1
  277. package/docs/source/lib/goog/dom/safe.js.src.html +0 -1
  278. package/docs/source/lib/goog/dom/tagname.js.src.html +0 -1
  279. package/docs/source/lib/goog/dom/tags.js.src.html +0 -1
  280. package/docs/source/lib/goog/dom/vendor.js.src.html +0 -1
  281. package/docs/source/lib/goog/events/browserevent.js.src.html +0 -1
  282. package/docs/source/lib/goog/events/browserfeature.js.src.html +0 -1
  283. package/docs/source/lib/goog/events/event.js.src.html +0 -1
  284. package/docs/source/lib/goog/events/eventid.js.src.html +0 -1
  285. package/docs/source/lib/goog/events/events.js.src.html +0 -1
  286. package/docs/source/lib/goog/events/eventtarget.js.src.html +0 -1
  287. package/docs/source/lib/goog/events/eventtype.js.src.html +0 -1
  288. package/docs/source/lib/goog/events/keycodes.js.src.html +0 -1
  289. package/docs/source/lib/goog/events/listenable.js.src.html +0 -1
  290. package/docs/source/lib/goog/events/listener.js.src.html +0 -1
  291. package/docs/source/lib/goog/events/listenermap.js.src.html +0 -1
  292. package/docs/source/lib/goog/fs/url.js.src.html +0 -1
  293. package/docs/source/lib/goog/functions/functions.js.src.html +0 -1
  294. package/docs/source/lib/goog/html/safehtml.js.src.html +0 -1
  295. package/docs/source/lib/goog/html/safescript.js.src.html +0 -1
  296. package/docs/source/lib/goog/html/safestyle.js.src.html +0 -1
  297. package/docs/source/lib/goog/html/safestylesheet.js.src.html +0 -1
  298. package/docs/source/lib/goog/html/safeurl.js.src.html +0 -1
  299. package/docs/source/lib/goog/html/trustedresourceurl.js.src.html +0 -1
  300. package/docs/source/lib/goog/html/uncheckedconversions.js.src.html +0 -1
  301. package/docs/source/lib/goog/i18n/bidi.js.src.html +0 -1
  302. package/docs/source/lib/goog/iter/iter.js.src.html +0 -1
  303. package/docs/source/lib/goog/json/json.js.src.html +0 -1
  304. package/docs/source/lib/goog/labs/testing/assertthat.js.src.html +0 -1
  305. package/docs/source/lib/goog/labs/testing/logicmatcher.js.src.html +0 -1
  306. package/docs/source/lib/goog/labs/testing/matcher.js.src.html +0 -1
  307. package/docs/source/lib/goog/labs/testing/numbermatcher.js.src.html +0 -1
  308. package/docs/source/lib/goog/labs/testing/objectmatcher.js.src.html +0 -1
  309. package/docs/source/lib/goog/labs/testing/stringmatcher.js.src.html +0 -1
  310. package/docs/source/lib/goog/labs/useragent/browser.js.src.html +0 -1
  311. package/docs/source/lib/goog/labs/useragent/engine.js.src.html +0 -1
  312. package/docs/source/lib/goog/labs/useragent/platform.js.src.html +0 -1
  313. package/docs/source/lib/goog/labs/useragent/util.js.src.html +0 -1
  314. package/docs/source/lib/goog/log/log.js.src.html +0 -1
  315. package/docs/source/lib/goog/math/box.js.src.html +0 -1
  316. package/docs/source/lib/goog/math/coordinate.js.src.html +0 -1
  317. package/docs/source/lib/goog/math/math.js.src.html +0 -1
  318. package/docs/source/lib/goog/math/rect.js.src.html +0 -1
  319. package/docs/source/lib/goog/math/size.js.src.html +0 -1
  320. package/docs/source/lib/goog/net/wrapperxmlhttpfactory.js.src.html +0 -1
  321. package/docs/source/lib/goog/net/xhrlike.js.src.html +0 -1
  322. package/docs/source/lib/goog/net/xmlhttp.js.src.html +0 -1
  323. package/docs/source/lib/goog/net/xmlhttpfactory.js.src.html +0 -1
  324. package/docs/source/lib/goog/object/object.js.src.html +0 -1
  325. package/docs/source/lib/goog/promise/promise.js.src.html +0 -1
  326. package/docs/source/lib/goog/promise/resolver.js.src.html +0 -1
  327. package/docs/source/lib/goog/promise/thenable.js.src.html +0 -1
  328. package/docs/source/lib/goog/reflect/reflect.js.src.html +0 -1
  329. package/docs/source/lib/goog/string/const.js.src.html +0 -1
  330. package/docs/source/lib/goog/string/string.js.src.html +0 -1
  331. package/docs/source/lib/goog/string/typedstring.js.src.html +0 -1
  332. package/docs/source/lib/goog/structs/collection.js.src.html +0 -1
  333. package/docs/source/lib/goog/structs/map.js.src.html +0 -1
  334. package/docs/source/lib/goog/structs/set.js.src.html +0 -1
  335. package/docs/source/lib/goog/structs/structs.js.src.html +0 -1
  336. package/docs/source/lib/goog/style/style.js.src.html +0 -1
  337. package/docs/source/lib/goog/testing/asserts.js.src.html +0 -1
  338. package/docs/source/lib/goog/testing/events/events.js.src.html +0 -1
  339. package/docs/source/lib/goog/testing/functionmock.js.src.html +0 -1
  340. package/docs/source/lib/goog/testing/jsunit.js.src.html +0 -1
  341. package/docs/source/lib/goog/testing/loosemock.js.src.html +0 -1
  342. package/docs/source/lib/goog/testing/mock.js.src.html +0 -1
  343. package/docs/source/lib/goog/testing/mockclock.js.src.html +0 -1
  344. package/docs/source/lib/goog/testing/mockcontrol.js.src.html +0 -1
  345. package/docs/source/lib/goog/testing/mockinterface.js.src.html +0 -1
  346. package/docs/source/lib/goog/testing/mockmatchers.js.src.html +0 -1
  347. package/docs/source/lib/goog/testing/objectpropertystring.js.src.html +0 -1
  348. package/docs/source/lib/goog/testing/propertyreplacer.js.src.html +0 -1
  349. package/docs/source/lib/goog/testing/recordfunction.js.src.html +0 -1
  350. package/docs/source/lib/goog/testing/stacktrace.js.src.html +0 -1
  351. package/docs/source/lib/goog/testing/strictmock.js.src.html +0 -1
  352. package/docs/source/lib/goog/testing/testcase.js.src.html +0 -1
  353. package/docs/source/lib/goog/testing/testrunner.js.src.html +0 -1
  354. package/docs/source/lib/goog/uri/uri.js.src.html +0 -1
  355. package/docs/source/lib/goog/uri/utils.js.src.html +0 -1
  356. package/docs/source/lib/goog/useragent/product.js.src.html +0 -1
  357. package/docs/source/lib/goog/useragent/product_isversion.js.src.html +0 -1
  358. package/docs/source/lib/goog/useragent/useragent.js.src.html +0 -1
  359. package/docs/source/lib/webdriver/actionsequence.js.src.html +0 -1
  360. package/docs/source/lib/webdriver/button.js.src.html +0 -1
  361. package/docs/source/lib/webdriver/capabilities.js.src.html +0 -1
  362. package/docs/source/lib/webdriver/command.js.src.html +0 -1
  363. package/docs/source/lib/webdriver/events.js.src.html +0 -1
  364. package/docs/source/lib/webdriver/http/http.js.src.html +0 -1
  365. package/docs/source/lib/webdriver/key.js.src.html +0 -1
  366. package/docs/source/lib/webdriver/locators.js.src.html +0 -1
  367. package/docs/source/lib/webdriver/logging.js.src.html +0 -1
  368. package/docs/source/lib/webdriver/promise.js.src.html +0 -1
  369. package/docs/source/lib/webdriver/serializable.js.src.html +0 -1
  370. package/docs/source/lib/webdriver/session.js.src.html +0 -1
  371. package/docs/source/lib/webdriver/stacktrace.js.src.html +0 -1
  372. package/docs/source/lib/webdriver/testing/asserts.js.src.html +0 -1
  373. package/docs/source/lib/webdriver/touchsequence.js.src.html +0 -1
  374. package/docs/source/lib/webdriver/until.js.src.html +0 -1
  375. package/docs/source/lib/webdriver/webdriver.js.src.html +0 -1
  376. package/docs/source/net/index.js.src.html +0 -1
  377. package/docs/source/net/portprober.js.src.html +0 -1
  378. package/docs/source/opera.js.src.html +0 -1
  379. package/docs/source/phantomjs.js.src.html +0 -1
  380. package/docs/source/proxy.js.src.html +0 -1
  381. package/docs/source/remote/index.js.src.html +0 -1
  382. package/docs/source/safari.js.src.html +0 -1
  383. package/docs/source/testing/assert.js.src.html +0 -1
  384. package/docs/source/testing/index.js.src.html +0 -1
  385. package/docs/types.js +0 -1
  386. package/lib/atoms/error.js +0 -202
  387. package/lib/atoms/json.js +0 -80
  388. package/lib/atoms/response.js +0 -110
  389. package/lib/atoms/userAgent.js +0 -257
  390. package/lib/goog/LICENSE +0 -176
  391. package/lib/goog/array/array.js +0 -1654
  392. package/lib/goog/asserts/asserts.js +0 -365
  393. package/lib/goog/async/freelist.js +0 -88
  394. package/lib/goog/async/nexttick.js +0 -241
  395. package/lib/goog/async/run.js +0 -133
  396. package/lib/goog/async/workqueue.js +0 -139
  397. package/lib/goog/base.js +0 -2548
  398. package/lib/goog/debug/debug.js +0 -653
  399. package/lib/goog/debug/entrypointregistry.js +0 -158
  400. package/lib/goog/debug/error.js +0 -63
  401. package/lib/goog/debug/logbuffer.js +0 -148
  402. package/lib/goog/debug/logger.js +0 -873
  403. package/lib/goog/debug/logrecord.js +0 -242
  404. package/lib/goog/deps.js +0 -151
  405. package/lib/goog/disposable/disposable.js +0 -307
  406. package/lib/goog/disposable/idisposable.js +0 -45
  407. package/lib/goog/dom/browserfeature.js +0 -72
  408. package/lib/goog/dom/dom.js +0 -2991
  409. package/lib/goog/dom/nodetype.js +0 -48
  410. package/lib/goog/dom/safe.js +0 -347
  411. package/lib/goog/dom/tagname.js +0 -160
  412. package/lib/goog/dom/tags.js +0 -41
  413. package/lib/goog/dom/vendor.js +0 -96
  414. package/lib/goog/events/browserevent.js +0 -400
  415. package/lib/goog/events/browserfeature.js +0 -85
  416. package/lib/goog/events/event.js +0 -143
  417. package/lib/goog/events/eventid.js +0 -47
  418. package/lib/goog/events/events.js +0 -984
  419. package/lib/goog/events/eventtarget.js +0 -394
  420. package/lib/goog/events/eventtype.js +0 -237
  421. package/lib/goog/events/keycodes.js +0 -427
  422. package/lib/goog/events/listenable.js +0 -335
  423. package/lib/goog/events/listener.js +0 -131
  424. package/lib/goog/events/listenermap.js +0 -308
  425. package/lib/goog/fs/url.js +0 -109
  426. package/lib/goog/functions/functions.js +0 -442
  427. package/lib/goog/html/safehtml.js +0 -757
  428. package/lib/goog/html/safescript.js +0 -234
  429. package/lib/goog/html/safestyle.js +0 -442
  430. package/lib/goog/html/safestylesheet.js +0 -276
  431. package/lib/goog/html/safeurl.js +0 -398
  432. package/lib/goog/html/trustedresourceurl.js +0 -224
  433. package/lib/goog/html/uncheckedconversions.js +0 -232
  434. package/lib/goog/i18n/bidi.js +0 -908
  435. package/lib/goog/iter/iter.js +0 -1302
  436. package/lib/goog/json/json.js +0 -363
  437. package/lib/goog/labs/testing/assertthat.js +0 -58
  438. package/lib/goog/labs/testing/logicmatcher.js +0 -212
  439. package/lib/goog/labs/testing/matcher.js +0 -80
  440. package/lib/goog/labs/testing/numbermatcher.js +0 -346
  441. package/lib/goog/labs/testing/objectmatcher.js +0 -317
  442. package/lib/goog/labs/testing/stringmatcher.js +0 -415
  443. package/lib/goog/labs/useragent/browser.js +0 -341
  444. package/lib/goog/labs/useragent/engine.js +0 -160
  445. package/lib/goog/labs/useragent/platform.js +0 -160
  446. package/lib/goog/labs/useragent/util.js +0 -148
  447. package/lib/goog/log/log.js +0 -197
  448. package/lib/goog/math/box.js +0 -398
  449. package/lib/goog/math/coordinate.js +0 -268
  450. package/lib/goog/math/math.js +0 -451
  451. package/lib/goog/math/rect.js +0 -476
  452. package/lib/goog/math/size.js +0 -227
  453. package/lib/goog/net/wrapperxmlhttpfactory.js +0 -71
  454. package/lib/goog/net/xhrlike.js +0 -124
  455. package/lib/goog/net/xmlhttp.js +0 -246
  456. package/lib/goog/net/xmlhttpfactory.js +0 -67
  457. package/lib/goog/object/object.js +0 -686
  458. package/lib/goog/promise/promise.js +0 -1350
  459. package/lib/goog/promise/resolver.js +0 -48
  460. package/lib/goog/promise/thenable.js +0 -126
  461. package/lib/goog/reflect/reflect.js +0 -77
  462. package/lib/goog/string/const.js +0 -182
  463. package/lib/goog/string/string.js +0 -1599
  464. package/lib/goog/string/typedstring.js +0 -48
  465. package/lib/goog/structs/collection.js +0 -56
  466. package/lib/goog/structs/map.js +0 -457
  467. package/lib/goog/structs/set.js +0 -279
  468. package/lib/goog/structs/structs.js +0 -354
  469. package/lib/goog/style/style.js +0 -2037
  470. package/lib/goog/testing/asserts.js +0 -1278
  471. package/lib/goog/testing/events/events.js +0 -767
  472. package/lib/goog/testing/functionmock.js +0 -175
  473. package/lib/goog/testing/jsunit.js +0 -162
  474. package/lib/goog/testing/loosemock.js +0 -242
  475. package/lib/goog/testing/mock.js +0 -645
  476. package/lib/goog/testing/mockclock.js +0 -606
  477. package/lib/goog/testing/mockcontrol.js +0 -220
  478. package/lib/goog/testing/mockinterface.js +0 -45
  479. package/lib/goog/testing/mockmatchers.js +0 -400
  480. package/lib/goog/testing/objectpropertystring.js +0 -68
  481. package/lib/goog/testing/propertyreplacer.js +0 -262
  482. package/lib/goog/testing/recordfunction.js +0 -215
  483. package/lib/goog/testing/stacktrace.js +0 -594
  484. package/lib/goog/testing/strictmock.js +0 -130
  485. package/lib/goog/testing/testcase.js +0 -1629
  486. package/lib/goog/testing/testrunner.js +0 -440
  487. package/lib/goog/uri/uri.js +0 -1524
  488. package/lib/goog/uri/utils.js +0 -1064
  489. package/lib/goog/useragent/product.js +0 -183
  490. package/lib/goog/useragent/product_isversion.js +0 -144
  491. package/lib/goog/useragent/useragent.js +0 -572
  492. package/lib/webdriver/actionsequence.js +0 -356
  493. package/lib/webdriver/builder.js +0 -207
  494. package/lib/webdriver/capabilities.js +0 -412
  495. package/lib/webdriver/events.js +0 -179
  496. package/lib/webdriver/firefoxdomexecutor.js +0 -175
  497. package/lib/webdriver/http/corsclient.js +0 -133
  498. package/lib/webdriver/http/http.js +0 -525
  499. package/lib/webdriver/http/xhrclient.js +0 -67
  500. package/lib/webdriver/locators.js +0 -257
  501. package/lib/webdriver/logging.js +0 -347
  502. package/lib/webdriver/session.js +0 -74
  503. package/lib/webdriver/stacktrace.js +0 -619
  504. package/lib/webdriver/test/builder_test.js +0 -53
  505. package/lib/webdriver/test/capabilities_test.js +0 -72
  506. package/lib/webdriver/test/events_test.js +0 -203
  507. package/lib/webdriver/test/http/corsclient_test.js +0 -151
  508. package/lib/webdriver/test/http/http_test.js +0 -428
  509. package/lib/webdriver/test/http/xhrclient_test.js +0 -196
  510. package/lib/webdriver/test/locators_test.js +0 -59
  511. package/lib/webdriver/test/logging_test.js +0 -85
  512. package/lib/webdriver/test/promise_error_test.js +0 -892
  513. package/lib/webdriver/test/promise_flow_test.js +0 -2365
  514. package/lib/webdriver/test/promise_generator_test.js +0 -323
  515. package/lib/webdriver/test/promise_test.js +0 -2012
  516. package/lib/webdriver/test/stacktrace_test.js +0 -480
  517. package/lib/webdriver/test/test_bootstrap.js +0 -67
  518. package/lib/webdriver/test/testing/asserts_test.js +0 -117
  519. package/lib/webdriver/test/testing/client_test.js +0 -88
  520. package/lib/webdriver/test/testing/testcase_test.js +0 -229
  521. package/lib/webdriver/test/testutil.js +0 -209
  522. package/lib/webdriver/test/testutil_test.js +0 -104
  523. package/lib/webdriver/test/until_test.js +0 -411
  524. package/lib/webdriver/test/webdriver_generator_test.js +0 -92
  525. package/lib/webdriver/test/webdriver_test.js +0 -2369
  526. package/lib/webdriver/testing/asserts.js +0 -487
  527. package/lib/webdriver/testing/client.js +0 -179
  528. package/lib/webdriver/testing/jsunit.js +0 -363
  529. package/lib/webdriver/testing/testcase.js +0 -168
  530. package/lib/webdriver/testing/window.js +0 -244
  531. package/lib/webdriver/touchsequence.js +0 -248
  532. package/lib/webdriver/until.js +0 -412
  533. package/lib/webdriver/webdriver.js +0 -2511
  534. package/test/_base_test.js +0 -129
package/http/index.js CHANGED
@@ -16,96 +16,299 @@
16
16
  // under the License.
17
17
 
18
18
  /**
19
- * @fileoverview Defines the {@code webdriver.http.Client} for use with
20
- * NodeJS.
19
+ * @fileoverview Defines an {@linkplain cmd.Executor command executor} that
20
+ * communicates with a remote end using HTTP + JSON.
21
21
  */
22
22
 
23
- var http = require('http'),
24
- url = require('url');
23
+ 'use strict';
25
24
 
26
- var base = require('../_base'),
27
- HttpResponse = base.require('webdriver.http.Response');
25
+ const http = require('http');
26
+ const https = require('https');
27
+ const url = require('url');
28
+
29
+ const cmd = require('../lib/command');
30
+ const error = require('../lib/error');
31
+ const logging = require('../lib/logging');
32
+ const promise = require('../lib/promise');
33
+ const Session = require('../lib/session').Session;
34
+
35
+
36
+
37
+ /**
38
+ * Converts a headers map to a HTTP header block string.
39
+ * @param {!Map<string, string>} headers The map to convert.
40
+ * @return {string} The headers as a string.
41
+ */
42
+ function headersToString(headers) {
43
+ let ret = [];
44
+ headers.forEach(function(value, name) {
45
+ ret.push(`${name.toLowerCase()}: ${value}`);
46
+ });
47
+ return ret.join('\n');
48
+ }
28
49
 
29
50
 
30
51
  /**
31
- * A {@link webdriver.http.Client} implementation using Node's built-in http
32
- * module.
33
- * @param {string} serverUrl URL for the WebDriver server to send commands to.
34
- * @param {http.Agent=} opt_agent The agent to use for each request.
35
- * Defaults to {@code http.globalAgent}.
36
- * @param {string=} opt_proxy The proxy to use for the connection to the server.
37
- * Default is to use no proxy.
38
- * @constructor
39
- * @implements {webdriver.http.Client}
52
+ * Represents a HTTP request message. This class is a "partial" request and only
53
+ * defines the path on the server to send a request to. It is each client's
54
+ * responsibility to build the full URL for the final request.
55
+ * @final
40
56
  */
41
- var HttpClient = function(serverUrl, opt_agent, opt_proxy) {
42
- var parsedUrl = url.parse(serverUrl);
43
- if (!parsedUrl.hostname) {
44
- throw new Error('Invalid server URL: ' + serverUrl);
57
+ class HttpRequest {
58
+ /**
59
+ * @param {string} method The HTTP method to use for the request.
60
+ * @param {string} path The path on the server to send the request to.
61
+ * @param {Object=} opt_data This request's non-serialized JSON payload data.
62
+ */
63
+ constructor(method, path, opt_data) {
64
+ this.method = /** string */method;
65
+ this.path = /** string */path;
66
+ this.data = /** Object */opt_data;
67
+ this.headers = /** !Map<string, string> */new Map(
68
+ [['Accept', 'application/json; charset=utf-8']]);
45
69
  }
46
70
 
47
- /** @private {http.Agent} */
48
- this.agent_ = opt_agent;
71
+ /** @override */
72
+ toString() {
73
+ let ret = `${this.method} ${this.path} HTTP/1.1\n`;
74
+ ret += headersToString(this.headers) + '\n\n';
75
+ if (this.data) {
76
+ ret += JSON.stringify(this.data);
77
+ }
78
+ return ret;
79
+ }
80
+ }
49
81
 
50
- /** @private {string} */
51
- this.proxy_ = opt_proxy;
52
82
 
83
+ /**
84
+ * Represents a HTTP response message.
85
+ * @final
86
+ */
87
+ class HttpResponse {
53
88
  /**
54
- * Base options for each request.
55
- * @private {!Object}
89
+ * @param {number} status The response code.
90
+ * @param {!Object<string>} headers The response headers. All header names
91
+ * will be converted to lowercase strings for consistent lookups.
92
+ * @param {string} body The response body.
56
93
  */
57
- this.options_ = {
58
- auth: parsedUrl.auth,
59
- host: parsedUrl.hostname,
60
- path: parsedUrl.pathname,
61
- port: parsedUrl.port
62
- };
63
- };
64
-
65
-
66
- /** @override */
67
- HttpClient.prototype.send = function(httpRequest, callback) {
68
- var data;
69
- httpRequest.headers['Content-Length'] = 0;
70
- if (httpRequest.method == 'POST' || httpRequest.method == 'PUT') {
71
- data = JSON.stringify(httpRequest.data);
72
- httpRequest.headers['Content-Length'] = Buffer.byteLength(data, 'utf8');
73
- httpRequest.headers['Content-Type'] = 'application/json;charset=UTF-8';
94
+ constructor(status, headers, body) {
95
+ this.status = /** number */status;
96
+ this.body = /** string */body;
97
+ this.headers = /** !Map<string, string>*/new Map;
98
+ for (let header in headers) {
99
+ this.headers.set(header.toLowerCase(), headers[header]);
100
+ }
74
101
  }
75
102
 
76
- var path = this.options_.path;
77
- if (path[path.length - 1] === '/' && httpRequest.path[0] === '/') {
78
- path += httpRequest.path.substring(1);
79
- } else {
80
- path += httpRequest.path;
103
+ /** @override */
104
+ toString() {
105
+ let ret = `HTTP/1.1 ${this.status}\n${headersToString(this.headers)}\n\n`;
106
+ if (this.body) {
107
+ ret += this.body;
108
+ }
109
+ return ret;
81
110
  }
111
+ }
112
+
113
+
114
+ function post(path) { return resource('POST', path); }
115
+ function del(path) { return resource('DELETE', path); }
116
+ function get(path) { return resource('GET', path); }
117
+ function resource(method, path) { return {method: method, path: path}; }
118
+
119
+
120
+ /** @const {!Map<string, {method: string, path: string}>} */
121
+ const COMMAND_MAP = new Map([
122
+ [cmd.Name.GET_SERVER_STATUS, get('/status')],
123
+ [cmd.Name.NEW_SESSION, post('/session')],
124
+ [cmd.Name.GET_SESSIONS, get('/sessions')],
125
+ [cmd.Name.DESCRIBE_SESSION, get('/session/:sessionId')],
126
+ [cmd.Name.QUIT, del('/session/:sessionId')],
127
+ [cmd.Name.CLOSE, del('/session/:sessionId/window')],
128
+ [cmd.Name.GET_CURRENT_WINDOW_HANDLE, get('/session/:sessionId/window_handle')],
129
+ [cmd.Name.GET_WINDOW_HANDLES, get('/session/:sessionId/window_handles')],
130
+ [cmd.Name.GET_CURRENT_URL, get('/session/:sessionId/url')],
131
+ [cmd.Name.GET, post('/session/:sessionId/url')],
132
+ [cmd.Name.GO_BACK, post('/session/:sessionId/back')],
133
+ [cmd.Name.GO_FORWARD, post('/session/:sessionId/forward')],
134
+ [cmd.Name.REFRESH, post('/session/:sessionId/refresh')],
135
+ [cmd.Name.ADD_COOKIE, post('/session/:sessionId/cookie')],
136
+ [cmd.Name.GET_ALL_COOKIES, get('/session/:sessionId/cookie')],
137
+ [cmd.Name.DELETE_ALL_COOKIES, del('/session/:sessionId/cookie')],
138
+ [cmd.Name.DELETE_COOKIE, del('/session/:sessionId/cookie/:name')],
139
+ [cmd.Name.FIND_ELEMENT, post('/session/:sessionId/element')],
140
+ [cmd.Name.FIND_ELEMENTS, post('/session/:sessionId/elements')],
141
+ [cmd.Name.GET_ACTIVE_ELEMENT, post('/session/:sessionId/element/active')],
142
+ [cmd.Name.FIND_CHILD_ELEMENT, post('/session/:sessionId/element/:id/element')],
143
+ [cmd.Name.FIND_CHILD_ELEMENTS, post('/session/:sessionId/element/:id/elements')],
144
+ [cmd.Name.CLEAR_ELEMENT, post('/session/:sessionId/element/:id/clear')],
145
+ [cmd.Name.CLICK_ELEMENT, post('/session/:sessionId/element/:id/click')],
146
+ [cmd.Name.SEND_KEYS_TO_ELEMENT, post('/session/:sessionId/element/:id/value')],
147
+ [cmd.Name.SUBMIT_ELEMENT, post('/session/:sessionId/element/:id/submit')],
148
+ [cmd.Name.GET_ELEMENT_TEXT, get('/session/:sessionId/element/:id/text')],
149
+ [cmd.Name.GET_ELEMENT_TAG_NAME, get('/session/:sessionId/element/:id/name')],
150
+ [cmd.Name.IS_ELEMENT_SELECTED, get('/session/:sessionId/element/:id/selected')],
151
+ [cmd.Name.IS_ELEMENT_ENABLED, get('/session/:sessionId/element/:id/enabled')],
152
+ [cmd.Name.IS_ELEMENT_DISPLAYED, get('/session/:sessionId/element/:id/displayed')],
153
+ [cmd.Name.GET_ELEMENT_LOCATION, get('/session/:sessionId/element/:id/location')],
154
+ [cmd.Name.GET_ELEMENT_SIZE, get('/session/:sessionId/element/:id/size')],
155
+ [cmd.Name.GET_ELEMENT_ATTRIBUTE, get('/session/:sessionId/element/:id/attribute/:name')],
156
+ [cmd.Name.GET_ELEMENT_VALUE_OF_CSS_PROPERTY, get('/session/:sessionId/element/:id/css/:propertyName')],
157
+ [cmd.Name.ELEMENT_EQUALS, get('/session/:sessionId/element/:id/equals/:other')],
158
+ [cmd.Name.TAKE_ELEMENT_SCREENSHOT, get('/session/:sessionId/element/:id/screenshot')],
159
+ [cmd.Name.SWITCH_TO_WINDOW, post('/session/:sessionId/window')],
160
+ [cmd.Name.MAXIMIZE_WINDOW, post('/session/:sessionId/window/current/maximize')],
161
+ [cmd.Name.GET_WINDOW_POSITION, get('/session/:sessionId/window/current/position')],
162
+ [cmd.Name.SET_WINDOW_POSITION, post('/session/:sessionId/window/current/position')],
163
+ [cmd.Name.GET_WINDOW_SIZE, get('/session/:sessionId/window/current/size')],
164
+ [cmd.Name.SET_WINDOW_SIZE, post('/session/:sessionId/window/current/size')],
165
+ [cmd.Name.SWITCH_TO_FRAME, post('/session/:sessionId/frame')],
166
+ [cmd.Name.GET_PAGE_SOURCE, get('/session/:sessionId/source')],
167
+ [cmd.Name.GET_TITLE, get('/session/:sessionId/title')],
168
+ [cmd.Name.EXECUTE_SCRIPT, post('/session/:sessionId/execute')],
169
+ [cmd.Name.EXECUTE_ASYNC_SCRIPT, post('/session/:sessionId/execute_async')],
170
+ [cmd.Name.SCREENSHOT, get('/session/:sessionId/screenshot')],
171
+ [cmd.Name.SET_TIMEOUT, post('/session/:sessionId/timeouts')],
172
+ [cmd.Name.SET_SCRIPT_TIMEOUT, post('/session/:sessionId/timeouts/async_script')],
173
+ [cmd.Name.IMPLICITLY_WAIT, post('/session/:sessionId/timeouts/implicit_wait')],
174
+ [cmd.Name.MOVE_TO, post('/session/:sessionId/moveto')],
175
+ [cmd.Name.CLICK, post('/session/:sessionId/click')],
176
+ [cmd.Name.DOUBLE_CLICK, post('/session/:sessionId/doubleclick')],
177
+ [cmd.Name.MOUSE_DOWN, post('/session/:sessionId/buttondown')],
178
+ [cmd.Name.MOUSE_UP, post('/session/:sessionId/buttonup')],
179
+ [cmd.Name.MOVE_TO, post('/session/:sessionId/moveto')],
180
+ [cmd.Name.SEND_KEYS_TO_ACTIVE_ELEMENT, post('/session/:sessionId/keys')],
181
+ [cmd.Name.TOUCH_SINGLE_TAP, post('/session/:sessionId/touch/click')],
182
+ [cmd.Name.TOUCH_DOUBLE_TAP, post('/session/:sessionId/touch/doubleclick')],
183
+ [cmd.Name.TOUCH_DOWN, post('/session/:sessionId/touch/down')],
184
+ [cmd.Name.TOUCH_UP, post('/session/:sessionId/touch/up')],
185
+ [cmd.Name.TOUCH_MOVE, post('/session/:sessionId/touch/move')],
186
+ [cmd.Name.TOUCH_SCROLL, post('/session/:sessionId/touch/scroll')],
187
+ [cmd.Name.TOUCH_LONG_PRESS, post('/session/:sessionId/touch/longclick')],
188
+ [cmd.Name.TOUCH_FLICK, post('/session/:sessionId/touch/flick')],
189
+ [cmd.Name.ACCEPT_ALERT, post('/session/:sessionId/accept_alert')],
190
+ [cmd.Name.DISMISS_ALERT, post('/session/:sessionId/dismiss_alert')],
191
+ [cmd.Name.GET_ALERT_TEXT, get('/session/:sessionId/alert_text')],
192
+ [cmd.Name.SET_ALERT_TEXT, post('/session/:sessionId/alert_text')],
193
+ [cmd.Name.SET_ALERT_CREDENTIALS, post('/session/:sessionId/alert/credentials')],
194
+ [cmd.Name.GET_LOG, post('/session/:sessionId/log')],
195
+ [cmd.Name.GET_AVAILABLE_LOG_TYPES, get('/session/:sessionId/log/types')],
196
+ [cmd.Name.GET_SESSION_LOGS, post('/logs')],
197
+ [cmd.Name.UPLOAD_FILE, post('/session/:sessionId/file')],
198
+ ]);
199
+
200
+
201
+ /** @const {!Map<string, {method: string, path: string}>} */
202
+ const W3C_COMMAND_MAP = new Map([
203
+ [cmd.Name.GET_WINDOW_SIZE, get('/session/:sessionId/window/size')],
204
+ [cmd.Name.SET_WINDOW_SIZE, post('/session/:sessionId/window/size')],
205
+ [cmd.Name.MAXIMIZE_WINDOW, post('/session/:sessionId/window/maximize')],
206
+ ]);
82
207
 
83
- var options = {
84
- method: httpRequest.method,
85
- auth: this.options_.auth,
86
- host: this.options_.host,
87
- port: this.options_.port,
88
- path: path,
89
- headers: httpRequest.headers
90
- };
91
-
92
- if (this.agent_) {
93
- options.agent = this.agent_;
208
+
209
+ /**
210
+ * A basic HTTP client used to send messages to a remote end.
211
+ */
212
+ class HttpClient {
213
+ /**
214
+ * @param {string} serverUrl URL for the WebDriver server to send commands to.
215
+ * @param {http.Agent=} opt_agent The agent to use for each request.
216
+ * Defaults to `http.globalAgent`.
217
+ * @param {?string=} opt_proxy The proxy to use for the connection to the
218
+ * server. Default is to use no proxy.
219
+ */
220
+ constructor(serverUrl, opt_agent, opt_proxy) {
221
+ let parsedUrl = url.parse(serverUrl);
222
+ if (!parsedUrl.hostname) {
223
+ throw new Error('Invalid server URL: ' + serverUrl);
224
+ }
225
+
226
+ /** @private {http.Agent} */
227
+ this.agent_ = opt_agent || null;
228
+
229
+ /** @private {?string} */
230
+ this.proxy_ = opt_proxy || null;
231
+
232
+ /**
233
+ * Base options for each request.
234
+ * @private {{auth: (?string|undefined),
235
+ * host: string,
236
+ * path: (?string|undefined),
237
+ * port: (?string|undefined),
238
+ * protocol: (?string|undefined)}}
239
+ */
240
+ this.options_ = {
241
+ auth: parsedUrl.auth,
242
+ host: parsedUrl.hostname,
243
+ path: parsedUrl.pathname,
244
+ port: parsedUrl.port,
245
+ protocol: parsedUrl.protocol
246
+ };
94
247
  }
95
248
 
96
- sendRequest(options, callback, data, this.proxy_);
97
- };
249
+ /**
250
+ * Sends a request to the server. The client will automatically follow any
251
+ * redirects returned by the server, fulfilling the returned promise with the
252
+ * final response.
253
+ *
254
+ * @param {!HttpRequest} httpRequest The request to send.
255
+ * @return {!promise.Promise<HttpResponse>} A promise that will be fulfilled
256
+ * with the server's response.
257
+ */
258
+ send(httpRequest) {
259
+ var data;
260
+
261
+ let headers = {};
262
+ httpRequest.headers.forEach(function(value, name) {
263
+ headers[name] = value;
264
+ });
265
+
266
+ headers['Content-Length'] = 0;
267
+ if (httpRequest.method == 'POST' || httpRequest.method == 'PUT') {
268
+ data = JSON.stringify(httpRequest.data);
269
+ headers['Content-Length'] = Buffer.byteLength(data, 'utf8');
270
+ headers['Content-Type'] = 'application/json;charset=UTF-8';
271
+ }
272
+
273
+ var path = this.options_.path;
274
+ if (path[path.length - 1] === '/' && httpRequest.path[0] === '/') {
275
+ path += httpRequest.path.substring(1);
276
+ } else {
277
+ path += httpRequest.path;
278
+ }
279
+
280
+ var options = {
281
+ method: httpRequest.method,
282
+ auth: this.options_.auth,
283
+ host: this.options_.host,
284
+ port: this.options_.port,
285
+ protocol: this.options_.protocol,
286
+ path: path,
287
+ headers: headers
288
+ };
289
+
290
+ if (this.agent_) {
291
+ options.agent = this.agent_;
292
+ }
293
+
294
+ var proxy = this.proxy_;
295
+ return new promise.Promise(function(fulfill, reject) {
296
+ sendRequest(options, fulfill, reject, data, proxy);
297
+ });
298
+ }
299
+ }
98
300
 
99
301
 
100
302
  /**
101
303
  * Sends a single HTTP request.
102
304
  * @param {!Object} options The request options.
103
- * @param {function(Error, !webdriver.http.Response=)} callback The function to
104
- * invoke with the server's response.
105
- * @param {string=} opt_data The data to send with the request.
106
- * @param {string=} opt_proxy The proxy server to use for the request.
305
+ * @param {function(!HttpResponse)} onOk The function to call if the
306
+ * request succeeds.
307
+ * @param {function(!Error)} onError The function to call if the request fails.
308
+ * @param {?string=} opt_data The data to send with the request.
309
+ * @param {?string=} opt_proxy The proxy server to use for the request.
107
310
  */
108
- var sendRequest = function(options, callback, opt_data, opt_proxy) {
311
+ function sendRequest(options, onOk, onError, opt_data, opt_proxy) {
109
312
  var host = options.host;
110
313
  var port = options.port;
111
314
 
@@ -122,12 +325,13 @@ var sendRequest = function(options, callback, opt_data, opt_proxy) {
122
325
  }
123
326
  }
124
327
 
125
- var request = http.request(options, function(response) {
328
+ let requestFn = options.protocol === 'https:' ? https.request : http.request;
329
+ var request = requestFn(options, function onResponse(response) {
126
330
  if (response.statusCode == 302 || response.statusCode == 303) {
127
331
  try {
128
332
  var location = url.parse(response.headers['location']);
129
333
  } catch (ex) {
130
- callback(Error(
334
+ onError(Error(
131
335
  'Failed to parse "Location" header for server redirect: ' +
132
336
  ex.message + '\nResponse was: \n' +
133
337
  new HttpResponse(response.statusCode, response.headers, '')));
@@ -145,33 +349,36 @@ var sendRequest = function(options, callback, opt_data, opt_proxy) {
145
349
  host: location.hostname,
146
350
  path: location.pathname + (location.search || ''),
147
351
  port: location.port,
352
+ protocol: location.protocol,
148
353
  headers: {
149
354
  'Accept': 'application/json; charset=utf-8'
150
355
  }
151
- }, callback, undefined, opt_proxy);
356
+ }, onOk, onError, undefined, opt_proxy);
152
357
  return;
153
358
  }
154
359
 
155
360
  var body = [];
156
361
  response.on('data', body.push.bind(body));
157
362
  response.on('end', function() {
158
- var resp = new HttpResponse(response.statusCode,
159
- response.headers, body.join('').replace(/\0/g, ''));
160
- callback(null, resp);
363
+ var resp = new HttpResponse(
364
+ /** @type {number} */(response.statusCode),
365
+ /** @type {!Object<string>} */(response.headers),
366
+ body.join('').replace(/\0/g, ''));
367
+ onOk(resp);
161
368
  });
162
369
  });
163
370
 
164
371
  request.on('error', function(e) {
165
372
  if (e.code === 'ECONNRESET') {
166
373
  setTimeout(function() {
167
- sendRequest(options, callback, opt_data, opt_proxy);
374
+ sendRequest(options, onOk, onError, opt_data, opt_proxy);
168
375
  }, 15);
169
376
  } else {
170
377
  var message = e.message;
171
378
  if (e.code) {
172
379
  message = e.code + ' ' + message;
173
380
  }
174
- callback(new Error(message));
381
+ onError(new Error(message));
175
382
  }
176
383
  });
177
384
 
@@ -180,18 +387,217 @@ var sendRequest = function(options, callback, opt_data, opt_proxy) {
180
387
  }
181
388
 
182
389
  request.end();
183
- };
390
+ }
184
391
 
185
392
 
186
- // PUBLIC API
393
+ /**
394
+ * A command executor that communicates with the server using HTTP + JSON.
395
+ *
396
+ * By default, each instance of this class will use the legacy wire protocol
397
+ * from [Selenium project][json]. The executor will automatically switch to the
398
+ * [W3C wire protocol][w3c] if the remote end returns a compliant response to
399
+ * a new session command.
400
+ *
401
+ * [json]: https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol
402
+ * [w3c]: https://w3c.github.io/webdriver/webdriver-spec.html
403
+ *
404
+ * @implements {cmd.Executor}
405
+ */
406
+ class Executor {
407
+ /**
408
+ * @param {!HttpClient} client The client to use for sending requests to the
409
+ * server.
410
+ */
411
+ constructor(client) {
412
+ /** @private {!HttpClient} */
413
+ this.client_ = client;
414
+
415
+ /**
416
+ * Whether this executor should use the W3C wire protocol. The executor
417
+ * will automatically switch if the remote end sends a compliant response
418
+ * to a new session command, however, this property may be directly set to
419
+ * `true` to force the executor into W3C mode.
420
+ * @type {boolean}
421
+ */
422
+ this.w3c = false;
423
+
424
+ /** @private {Map<string, {method: string, path: string}>} */
425
+ this.customCommands_ = null;
426
+
427
+ /** @private {!logging.Logger} */
428
+ this.log_ = logging.getLogger('webdriver.http.Executor');
429
+ }
187
430
 
188
- /** @type {webdriver.http.Executor.} */
189
- exports.Executor = base.require('webdriver.http.Executor');
431
+ /**
432
+ * Defines a new command for use with this executor. When a command is sent,
433
+ * the {@code path} will be preprocessed using the command's parameters; any
434
+ * path segments prefixed with ":" will be replaced by the parameter of the
435
+ * same name. For example, given "/person/:name" and the parameters
436
+ * "{name: 'Bob'}", the final command path will be "/person/Bob".
437
+ *
438
+ * @param {string} name The command name.
439
+ * @param {string} method The HTTP method to use when sending this command.
440
+ * @param {string} path The path to send the command to, relative to
441
+ * the WebDriver server's command root and of the form
442
+ * "/path/:variable/segment".
443
+ */
444
+ defineCommand(name, method, path) {
445
+ if (!this.customCommands_) {
446
+ this.customCommands_ = new Map;
447
+ }
448
+ this.customCommands_.set(name, {method, path});
449
+ }
190
450
 
191
- /** @type {webdriver.http.Request.} */
192
- exports.Request = base.require('webdriver.http.Request');
451
+ /** @override */
452
+ execute(command) {
453
+ let resource =
454
+ (this.customCommands_ && this.customCommands_.get(command.getName()))
455
+ || (this.w3c && W3C_COMMAND_MAP.get(command.getName()))
456
+ || COMMAND_MAP.get(command.getName());
457
+ if (!resource) {
458
+ throw new error.UnknownCommandError(
459
+ 'Unrecognized command: ' + command.getName());
460
+ }
461
+
462
+ let parameters = command.getParameters();
463
+ let path = buildPath(resource.path, parameters);
464
+ let request = new HttpRequest(resource.method, path, parameters);
465
+
466
+ let log = this.log_;
467
+ log.finer(() => '>>>\n' + request);
468
+ return this.client_.send(request).then(response => {
469
+ log.finer(() => '<<<\n' + response);
470
+
471
+ let parsed =
472
+ parseHttpResponse(/** @type {!HttpResponse} */ (response), this.w3c);
473
+
474
+ if (command.getName() === cmd.Name.NEW_SESSION
475
+ || command.getName() === cmd.Name.DESCRIBE_SESSION) {
476
+ if (!parsed || !parsed['sessionId']) {
477
+ throw new error.WebDriverError(
478
+ 'Unable to parse new session response: ' + response.body);
479
+ }
193
480
 
194
- /** @type {webdriver.http.Response.} */
195
- exports.Response = base.require('webdriver.http.Response');
481
+ // The remote end is a W3C compliant server if there is no `status`
482
+ // field in the response. This is not appliable for the DESCRIBE_SESSION
483
+ // command, which is not defined in the W3C spec.
484
+ if (command.getName() === cmd.Name.NEW_SESSION) {
485
+ this.w3c = this.w3c || !('status' in parsed);
486
+ }
487
+
488
+ return new Session(parsed['sessionId'], parsed['value']);
489
+ }
490
+
491
+ if (parsed) {
492
+ let value = parsed['value'];
493
+ return typeof value === 'undefined' ? null : value;
494
+ }
495
+ return parsed;
496
+ });
497
+ }
498
+ }
499
+
500
+
501
+ /**
502
+ * @param {string} str .
503
+ * @return {?} .
504
+ */
505
+ function tryParse(str) {
506
+ try {
507
+ return JSON.parse(str);
508
+ } catch (ignored) {
509
+ // Do nothing.
510
+ }
511
+ }
512
+
513
+
514
+ /**
515
+ * Callback used to parse {@link HttpResponse} objects from a
516
+ * {@link HttpClient}.
517
+ * @param {!HttpResponse} httpResponse The HTTP response to parse.
518
+ * @param {boolean} w3c Whether the response should be processed using the
519
+ * W3C wire protocol.
520
+ * @return {{value: ?}} The parsed response.
521
+ * @throws {WebDriverError} If the HTTP response is an error.
522
+ */
523
+ function parseHttpResponse(httpResponse, w3c) {
524
+ let parsed = tryParse(httpResponse.body);
525
+ if (parsed !== undefined) {
526
+ if (w3c) {
527
+ if (httpResponse.status > 399) {
528
+ error.throwDecodedError(parsed);
529
+ }
530
+
531
+ if (httpResponse.status < 200) {
532
+ // This should never happen, but throw the raw response so
533
+ // users report it.
534
+ throw new error.WebDriverError(
535
+ `Unexpected HTTP response:\n${httpResponse}`);
536
+ }
537
+ } else {
538
+ error.checkLegacyResponse(parsed);
539
+ }
540
+
541
+ if (!parsed || typeof parsed !== 'object') {
542
+ parsed = {value: parsed};
543
+ }
544
+ return parsed
545
+ }
546
+
547
+ let value = httpResponse.body.replace(/\r\n/g, '\n');
548
+
549
+ // 404 represents an unknown command; anything else > 399 is a generic unknown
550
+ // error.
551
+ if (httpResponse.status == 404) {
552
+ throw new error.UnsupportedOperationError(value);
553
+ } else if (httpResponse.status >= 400) {
554
+ throw new error.WebDriverError(value);
555
+ }
556
+
557
+ return {value: value || null};
558
+ }
559
+
560
+
561
+ /**
562
+ * Builds a fully qualified path using the given set of command parameters. Each
563
+ * path segment prefixed with ':' will be replaced by the value of the
564
+ * corresponding parameter. All parameters spliced into the path will be
565
+ * removed from the parameter map.
566
+ * @param {string} path The original resource path.
567
+ * @param {!Object<*>} parameters The parameters object to splice into the path.
568
+ * @return {string} The modified path.
569
+ */
570
+ function buildPath(path, parameters) {
571
+ let pathParameters = path.match(/\/:(\w+)\b/g);
572
+ if (pathParameters) {
573
+ for (let i = 0; i < pathParameters.length; ++i) {
574
+ let key = pathParameters[i].substring(2); // Trim the /:
575
+ if (key in parameters) {
576
+ let value = parameters[key];
577
+ // TODO: move webdriver.WebElement.ELEMENT definition to a
578
+ // common file so we can reference it here without pulling in all of
579
+ // webdriver.WebElement's dependencies.
580
+ if (value && value['ELEMENT']) {
581
+ // When inserting a WebElement into the URL, only use its ID value,
582
+ // not the full JSON.
583
+ value = value['ELEMENT'];
584
+ }
585
+ path = path.replace(pathParameters[i], '/' + value);
586
+ delete parameters[key];
587
+ } else {
588
+ throw new error.InvalidArgumentError(
589
+ 'Missing required parameter: ' + key);
590
+ }
591
+ }
592
+ }
593
+ return path;
594
+ }
595
+
596
+
597
+ // PUBLIC API
196
598
 
599
+ exports.Executor = Executor;
197
600
  exports.HttpClient = HttpClient;
601
+ exports.Request = HttpRequest;
602
+ exports.Response = HttpResponse;
603
+ exports.buildPath = buildPath; // Exported for testing.