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
@@ -1 +0,0 @@
1
- <!DOCTYPE html><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"><meta http-equiv="Content-Language" content="en"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>index.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><header><div><form><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></header><main><article class="srcfile"><h1>remote/index.js</h1><div><table><tr><td><a id="l1"></a><a href="#l1">1</a><td>// Licensed to the Software Freedom Conservancy (SFC) under one<tr><td><a id="l2"></a><a href="#l2">2</a><td>// or more contributor license agreements. See the NOTICE file<tr><td><a id="l3"></a><a href="#l3">3</a><td>// distributed with this work for additional information<tr><td><a id="l4"></a><a href="#l4">4</a><td>// regarding copyright ownership. The SFC licenses this file<tr><td><a id="l5"></a><a href="#l5">5</a><td>// to you under the Apache License, Version 2.0 (the<tr><td><a id="l6"></a><a href="#l6">6</a><td>// &quot;License&quot;); you may not use this file except in compliance<tr><td><a id="l7"></a><a href="#l7">7</a><td>// with the License. You may obtain a copy of the License at<tr><td><a id="l8"></a><a href="#l8">8</a><td>//<tr><td><a id="l9"></a><a href="#l9">9</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a id="l10"></a><a href="#l10">10</a><td>//<tr><td><a id="l11"></a><a href="#l11">11</a><td>// Unless required by applicable law or agreed to in writing,<tr><td><a id="l12"></a><a href="#l12">12</a><td>// software distributed under the License is distributed on an<tr><td><a id="l13"></a><a href="#l13">13</a><td>// &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<tr><td><a id="l14"></a><a href="#l14">14</a><td>// KIND, either express or implied. See the License for the<tr><td><a id="l15"></a><a href="#l15">15</a><td>// specific language governing permissions and limitations<tr><td><a id="l16"></a><a href="#l16">16</a><td>// under the License.<tr><td><a id="l17"></a><a href="#l17">17</a><td><tr><td><a id="l18"></a><a href="#l18">18</a><td>&#39;use strict&#39;;<tr><td><a id="l19"></a><a href="#l19">19</a><td><tr><td><a id="l20"></a><a href="#l20">20</a><td>var AdmZip = require(&#39;adm-zip&#39;),<tr><td><a id="l21"></a><a href="#l21">21</a><td> AdmConstants = require(&#39;adm-zip/util/constants&#39;),<tr><td><a id="l22"></a><a href="#l22">22</a><td> fs = require(&#39;fs&#39;),<tr><td><a id="l23"></a><a href="#l23">23</a><td> path = require(&#39;path&#39;),<tr><td><a id="l24"></a><a href="#l24">24</a><td> url = require(&#39;url&#39;),<tr><td><a id="l25"></a><a href="#l25">25</a><td> util = require(&#39;util&#39;);<tr><td><a id="l26"></a><a href="#l26">26</a><td><tr><td><a id="l27"></a><a href="#l27">27</a><td>var _base = require(&#39;../_base&#39;),<tr><td><a id="l28"></a><a href="#l28">28</a><td> webdriver = require(&#39;../&#39;),<tr><td><a id="l29"></a><a href="#l29">29</a><td> promise = require(&#39;../&#39;).promise,<tr><td><a id="l30"></a><a href="#l30">30</a><td> httpUtil = require(&#39;../http/util&#39;),<tr><td><a id="l31"></a><a href="#l31">31</a><td> exec = require(&#39;../io/exec&#39;),<tr><td><a id="l32"></a><a href="#l32">32</a><td> net = require(&#39;../net&#39;),<tr><td><a id="l33"></a><a href="#l33">33</a><td> portprober = require(&#39;../net/portprober&#39;);<tr><td><a id="l34"></a><a href="#l34">34</a><td><tr><td><a id="l35"></a><a href="#l35">35</a><td><tr><td><a id="l36"></a><a href="#l36">36</a><td><tr><td><a id="l37"></a><a href="#l37">37</a><td>/**<tr><td><a id="l38"></a><a href="#l38">38</a><td> * Configuration options for a DriverService instance.<tr><td><a id="l39"></a><a href="#l39">39</a><td> *<tr><td><a id="l40"></a><a href="#l40">40</a><td> * - `loopback` - Whether the service should only be accessed on this host&#39;s<tr><td><a id="l41"></a><a href="#l41">41</a><td> * loopback address.<tr><td><a id="l42"></a><a href="#l42">42</a><td> * - `port` - The port to start the server on (must be &gt; 0). If the port is<tr><td><a id="l43"></a><a href="#l43">43</a><td> * provided as a promise, the service will wait for the promise to resolve<tr><td><a id="l44"></a><a href="#l44">44</a><td> * before starting.<tr><td><a id="l45"></a><a href="#l45">45</a><td> * - `args` - The arguments to pass to the service. If a promise is provided,<tr><td><a id="l46"></a><a href="#l46">46</a><td> * the service will wait for it to resolve before starting.<tr><td><a id="l47"></a><a href="#l47">47</a><td> * - `path` - The base path on the server for the WebDriver wire protocol<tr><td><a id="l48"></a><a href="#l48">48</a><td> * (e.g. &#39;/wd/hub&#39;). Defaults to &#39;/&#39;.<tr><td><a id="l49"></a><a href="#l49">49</a><td> * - `env` - The environment variables that should be visible to the server<tr><td><a id="l50"></a><a href="#l50">50</a><td> * process. Defaults to inheriting the current process&#39;s environment.<tr><td><a id="l51"></a><a href="#l51">51</a><td> * - `stdio` - IO configuration for the spawned server process. For more<tr><td><a id="l52"></a><a href="#l52">52</a><td> * information, refer to the documentation of `child_process.spawn`.<tr><td><a id="l53"></a><a href="#l53">53</a><td> *<tr><td><a id="l54"></a><a href="#l54">54</a><td> * @typedef {{<tr><td><a id="l55"></a><a href="#l55">55</a><td> * loopback: (boolean|undefined),<tr><td><a id="l56"></a><a href="#l56">56</a><td> * port: (number|!webdriver.promise.Promise.&lt;number&gt;),<tr><td><a id="l57"></a><a href="#l57">57</a><td> * args: !(Array.&lt;string&gt;|webdriver.promise.Promise.&lt;!Array.&lt;string&gt;&gt;),<tr><td><a id="l58"></a><a href="#l58">58</a><td> * path: (string|undefined),<tr><td><a id="l59"></a><a href="#l59">59</a><td> * env: (!Object.&lt;string, string&gt;|undefined),<tr><td><a id="l60"></a><a href="#l60">60</a><td> * stdio: (string|!Array.&lt;string|number|!Stream|null|undefined&gt;|undefined)<tr><td><a id="l61"></a><a href="#l61">61</a><td> * }}<tr><td><a id="l62"></a><a href="#l62">62</a><td> */<tr><td><a id="l63"></a><a href="#l63">63</a><td>var ServiceOptions;<tr><td><a id="l64"></a><a href="#l64">64</a><td><tr><td><a id="l65"></a><a href="#l65">65</a><td><tr><td><a id="l66"></a><a href="#l66">66</a><td>/**<tr><td><a id="l67"></a><a href="#l67">67</a><td> * Manages the life and death of a native executable WebDriver server.<tr><td><a id="l68"></a><a href="#l68">68</a><td> *<tr><td><a id="l69"></a><a href="#l69">69</a><td> * It is expected that the driver server implements the<tr><td><a id="l70"></a><a href="#l70">70</a><td> * https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol.<tr><td><a id="l71"></a><a href="#l71">71</a><td> * Furthermore, the managed server should support multiple concurrent sessions,<tr><td><a id="l72"></a><a href="#l72">72</a><td> * so that this class may be reused for multiple clients.<tr><td><a id="l73"></a><a href="#l73">73</a><td> *<tr><td><a id="l74"></a><a href="#l74">74</a><td> * @param {string} executable Path to the executable to run.<tr><td><a id="l75"></a><a href="#l75">75</a><td> * @param {!ServiceOptions} options Configuration options for the service.<tr><td><a id="l76"></a><a href="#l76">76</a><td> * @constructor<tr><td><a id="l77"></a><a href="#l77">77</a><td> */<tr><td><a id="l78"></a><a href="#l78">78</a><td>function DriverService(executable, options) {<tr><td><a id="l79"></a><a href="#l79">79</a><td><tr><td><a id="l80"></a><a href="#l80">80</a><td> /** @private {string} */<tr><td><a id="l81"></a><a href="#l81">81</a><td> this.executable_ = executable;<tr><td><a id="l82"></a><a href="#l82">82</a><td><tr><td><a id="l83"></a><a href="#l83">83</a><td> /** @private {boolean} */<tr><td><a id="l84"></a><a href="#l84">84</a><td> this.loopbackOnly_ = !!options.loopback;<tr><td><a id="l85"></a><a href="#l85">85</a><td><tr><td><a id="l86"></a><a href="#l86">86</a><td> /** @private {(number|!webdriver.promise.Promise.&lt;number&gt;)} */<tr><td><a id="l87"></a><a href="#l87">87</a><td> this.port_ = options.port;<tr><td><a id="l88"></a><a href="#l88">88</a><td><tr><td><a id="l89"></a><a href="#l89">89</a><td> /**<tr><td><a id="l90"></a><a href="#l90">90</a><td> * @private {!(Array.&lt;string&gt;|webdriver.promise.Promise.&lt;!Array.&lt;string&gt;&gt;)}<tr><td><a id="l91"></a><a href="#l91">91</a><td> */<tr><td><a id="l92"></a><a href="#l92">92</a><td> this.args_ = options.args;<tr><td><a id="l93"></a><a href="#l93">93</a><td><tr><td><a id="l94"></a><a href="#l94">94</a><td> /** @private {string} */<tr><td><a id="l95"></a><a href="#l95">95</a><td> this.path_ = options.path || &#39;/&#39;;<tr><td><a id="l96"></a><a href="#l96">96</a><td><tr><td><a id="l97"></a><a href="#l97">97</a><td> /** @private {!Object.&lt;string, string&gt;} */<tr><td><a id="l98"></a><a href="#l98">98</a><td> this.env_ = options.env || process.env;<tr><td><a id="l99"></a><a href="#l99">99</a><td><tr><td><a id="l100"></a><a href="#l100">100</a><td> /** @private {(string|!Array.&lt;string|number|!Stream|null|undefined&gt;)} */<tr><td><a id="l101"></a><a href="#l101">101</a><td> this.stdio_ = options.stdio || &#39;ignore&#39;;<tr><td><a id="l102"></a><a href="#l102">102</a><td><tr><td><a id="l103"></a><a href="#l103">103</a><td> /**<tr><td><a id="l104"></a><a href="#l104">104</a><td> * A promise for the managed subprocess, or null if the server has not been<tr><td><a id="l105"></a><a href="#l105">105</a><td> * started yet. This promise will never be rejected.<tr><td><a id="l106"></a><a href="#l106">106</a><td> * @private {promise.Promise.&lt;!exec.Command&gt;}<tr><td><a id="l107"></a><a href="#l107">107</a><td> */<tr><td><a id="l108"></a><a href="#l108">108</a><td> this.command_ = null;<tr><td><a id="l109"></a><a href="#l109">109</a><td><tr><td><a id="l110"></a><a href="#l110">110</a><td> /**<tr><td><a id="l111"></a><a href="#l111">111</a><td> * Promise that resolves to the server&#39;s address or null if the server has<tr><td><a id="l112"></a><a href="#l112">112</a><td> * not been started. This promise will be rejected if the server terminates<tr><td><a id="l113"></a><a href="#l113">113</a><td> * before it starts accepting WebDriver requests.<tr><td><a id="l114"></a><a href="#l114">114</a><td> * @private {promise.Promise.&lt;string&gt;}<tr><td><a id="l115"></a><a href="#l115">115</a><td> */<tr><td><a id="l116"></a><a href="#l116">116</a><td> this.address_ = null;<tr><td><a id="l117"></a><a href="#l117">117</a><td>}<tr><td><a id="l118"></a><a href="#l118">118</a><td><tr><td><a id="l119"></a><a href="#l119">119</a><td><tr><td><a id="l120"></a><a href="#l120">120</a><td>/**<tr><td><a id="l121"></a><a href="#l121">121</a><td> * The default amount of time, in milliseconds, to wait for the server to<tr><td><a id="l122"></a><a href="#l122">122</a><td> * start.<tr><td><a id="l123"></a><a href="#l123">123</a><td> * @type {number}<tr><td><a id="l124"></a><a href="#l124">124</a><td> */<tr><td><a id="l125"></a><a href="#l125">125</a><td>DriverService.DEFAULT_START_TIMEOUT_MS = 30 * 1000;<tr><td><a id="l126"></a><a href="#l126">126</a><td><tr><td><a id="l127"></a><a href="#l127">127</a><td><tr><td><a id="l128"></a><a href="#l128">128</a><td>/**<tr><td><a id="l129"></a><a href="#l129">129</a><td> * @return {!webdriver.promise.Promise.&lt;string&gt;} A promise that resolves to<tr><td><a id="l130"></a><a href="#l130">130</a><td> * the server&#39;s address.<tr><td><a id="l131"></a><a href="#l131">131</a><td> * @throws {Error} If the server has not been started.<tr><td><a id="l132"></a><a href="#l132">132</a><td> */<tr><td><a id="l133"></a><a href="#l133">133</a><td>DriverService.prototype.address = function() {<tr><td><a id="l134"></a><a href="#l134">134</a><td> if (this.address_) {<tr><td><a id="l135"></a><a href="#l135">135</a><td> return this.address_;<tr><td><a id="l136"></a><a href="#l136">136</a><td> }<tr><td><a id="l137"></a><a href="#l137">137</a><td> throw Error(&#39;Server has not been started.&#39;);<tr><td><a id="l138"></a><a href="#l138">138</a><td>};<tr><td><a id="l139"></a><a href="#l139">139</a><td><tr><td><a id="l140"></a><a href="#l140">140</a><td><tr><td><a id="l141"></a><a href="#l141">141</a><td>/**<tr><td><a id="l142"></a><a href="#l142">142</a><td> * Returns whether the underlying process is still running. This does not take<tr><td><a id="l143"></a><a href="#l143">143</a><td> * into account whether the process is in the process of shutting down.<tr><td><a id="l144"></a><a href="#l144">144</a><td> * @return {boolean} Whether the underlying service process is running.<tr><td><a id="l145"></a><a href="#l145">145</a><td> */<tr><td><a id="l146"></a><a href="#l146">146</a><td>DriverService.prototype.isRunning = function() {<tr><td><a id="l147"></a><a href="#l147">147</a><td> return !!this.address_;<tr><td><a id="l148"></a><a href="#l148">148</a><td>};<tr><td><a id="l149"></a><a href="#l149">149</a><td><tr><td><a id="l150"></a><a href="#l150">150</a><td><tr><td><a id="l151"></a><a href="#l151">151</a><td>/**<tr><td><a id="l152"></a><a href="#l152">152</a><td> * Starts the server if it is not already running.<tr><td><a id="l153"></a><a href="#l153">153</a><td> * @param {number=} opt_timeoutMs How long to wait, in milliseconds, for the<tr><td><a id="l154"></a><a href="#l154">154</a><td> * server to start accepting requests. Defaults to 30 seconds.<tr><td><a id="l155"></a><a href="#l155">155</a><td> * @return {!promise.Promise.&lt;string&gt;} A promise that will resolve<tr><td><a id="l156"></a><a href="#l156">156</a><td> * to the server&#39;s base URL when it has started accepting requests. If the<tr><td><a id="l157"></a><a href="#l157">157</a><td> * timeout expires before the server has started, the promise will be<tr><td><a id="l158"></a><a href="#l158">158</a><td> * rejected.<tr><td><a id="l159"></a><a href="#l159">159</a><td> */<tr><td><a id="l160"></a><a href="#l160">160</a><td>DriverService.prototype.start = function(opt_timeoutMs) {<tr><td><a id="l161"></a><a href="#l161">161</a><td> if (this.address_) {<tr><td><a id="l162"></a><a href="#l162">162</a><td> return this.address_;<tr><td><a id="l163"></a><a href="#l163">163</a><td> }<tr><td><a id="l164"></a><a href="#l164">164</a><td><tr><td><a id="l165"></a><a href="#l165">165</a><td> var timeout = opt_timeoutMs || DriverService.DEFAULT_START_TIMEOUT_MS;<tr><td><a id="l166"></a><a href="#l166">166</a><td><tr><td><a id="l167"></a><a href="#l167">167</a><td> var self = this;<tr><td><a id="l168"></a><a href="#l168">168</a><td> this.command_ = promise.defer();<tr><td><a id="l169"></a><a href="#l169">169</a><td> this.address_ = promise.defer();<tr><td><a id="l170"></a><a href="#l170">170</a><td> this.address_.fulfill(promise.when(this.port_, function(port) {<tr><td><a id="l171"></a><a href="#l171">171</a><td> if (port &lt;= 0) {<tr><td><a id="l172"></a><a href="#l172">172</a><td> throw Error(&#39;Port must be &gt; 0: &#39; + port);<tr><td><a id="l173"></a><a href="#l173">173</a><td> }<tr><td><a id="l174"></a><a href="#l174">174</a><td> return promise.when(self.args_, function(args) {<tr><td><a id="l175"></a><a href="#l175">175</a><td> var command = exec(self.executable_, {<tr><td><a id="l176"></a><a href="#l176">176</a><td> args: args,<tr><td><a id="l177"></a><a href="#l177">177</a><td> env: self.env_,<tr><td><a id="l178"></a><a href="#l178">178</a><td> stdio: self.stdio_<tr><td><a id="l179"></a><a href="#l179">179</a><td> });<tr><td><a id="l180"></a><a href="#l180">180</a><td><tr><td><a id="l181"></a><a href="#l181">181</a><td> self.command_.fulfill(command);<tr><td><a id="l182"></a><a href="#l182">182</a><td><tr><td><a id="l183"></a><a href="#l183">183</a><td> var earlyTermination = command.result().then(function(result) {<tr><td><a id="l184"></a><a href="#l184">184</a><td> var error = result.code == null ?<tr><td><a id="l185"></a><a href="#l185">185</a><td> Error(&#39;Server was killed with &#39; + result.signal) :<tr><td><a id="l186"></a><a href="#l186">186</a><td> Error(&#39;Server terminated early with status &#39; + result.code);<tr><td><a id="l187"></a><a href="#l187">187</a><td> self.address_.reject(error);<tr><td><a id="l188"></a><a href="#l188">188</a><td> self.address_ = null;<tr><td><a id="l189"></a><a href="#l189">189</a><td> self.command_ = null;<tr><td><a id="l190"></a><a href="#l190">190</a><td> throw error;<tr><td><a id="l191"></a><a href="#l191">191</a><td> });<tr><td><a id="l192"></a><a href="#l192">192</a><td><tr><td><a id="l193"></a><a href="#l193">193</a><td> var serverUrl = url.format({<tr><td><a id="l194"></a><a href="#l194">194</a><td> protocol: &#39;http&#39;,<tr><td><a id="l195"></a><a href="#l195">195</a><td> hostname: !self.loopbackOnly_ &amp;&amp; net.getAddress() ||<tr><td><a id="l196"></a><a href="#l196">196</a><td> net.getLoopbackAddress(),<tr><td><a id="l197"></a><a href="#l197">197</a><td> port: port,<tr><td><a id="l198"></a><a href="#l198">198</a><td> pathname: self.path_<tr><td><a id="l199"></a><a href="#l199">199</a><td> });<tr><td><a id="l200"></a><a href="#l200">200</a><td><tr><td><a id="l201"></a><a href="#l201">201</a><td> return new promise.Promise(function(fulfill, reject) {<tr><td><a id="l202"></a><a href="#l202">202</a><td> var ready = httpUtil.waitForServer(serverUrl, timeout)<tr><td><a id="l203"></a><a href="#l203">203</a><td> .then(fulfill, reject);<tr><td><a id="l204"></a><a href="#l204">204</a><td> earlyTermination.thenCatch(function(e) {<tr><td><a id="l205"></a><a href="#l205">205</a><td> ready.cancel(e);<tr><td><a id="l206"></a><a href="#l206">206</a><td> reject(Error(e.message));<tr><td><a id="l207"></a><a href="#l207">207</a><td> });<tr><td><a id="l208"></a><a href="#l208">208</a><td> }).then(function() {<tr><td><a id="l209"></a><a href="#l209">209</a><td> return serverUrl;<tr><td><a id="l210"></a><a href="#l210">210</a><td> });<tr><td><a id="l211"></a><a href="#l211">211</a><td> });<tr><td><a id="l212"></a><a href="#l212">212</a><td> }));<tr><td><a id="l213"></a><a href="#l213">213</a><td><tr><td><a id="l214"></a><a href="#l214">214</a><td> return this.address_;<tr><td><a id="l215"></a><a href="#l215">215</a><td>};<tr><td><a id="l216"></a><a href="#l216">216</a><td><tr><td><a id="l217"></a><a href="#l217">217</a><td><tr><td><a id="l218"></a><a href="#l218">218</a><td>/**<tr><td><a id="l219"></a><a href="#l219">219</a><td> * Stops the service if it is not currently running. This function will kill<tr><td><a id="l220"></a><a href="#l220">220</a><td> * the server immediately. To synchronize with the active control flow, use<tr><td><a id="l221"></a><a href="#l221">221</a><td> * {@link #stop()}.<tr><td><a id="l222"></a><a href="#l222">222</a><td> * @return {!webdriver.promise.Promise} A promise that will be resolved when<tr><td><a id="l223"></a><a href="#l223">223</a><td> * the server has been stopped.<tr><td><a id="l224"></a><a href="#l224">224</a><td> */<tr><td><a id="l225"></a><a href="#l225">225</a><td>DriverService.prototype.kill = function() {<tr><td><a id="l226"></a><a href="#l226">226</a><td> if (!this.address_ || !this.command_) {<tr><td><a id="l227"></a><a href="#l227">227</a><td> return promise.fulfilled(); // Not currently running.<tr><td><a id="l228"></a><a href="#l228">228</a><td> }<tr><td><a id="l229"></a><a href="#l229">229</a><td> return this.command_.then(function(command) {<tr><td><a id="l230"></a><a href="#l230">230</a><td> command.kill(&#39;SIGTERM&#39;);<tr><td><a id="l231"></a><a href="#l231">231</a><td> });<tr><td><a id="l232"></a><a href="#l232">232</a><td>};<tr><td><a id="l233"></a><a href="#l233">233</a><td><tr><td><a id="l234"></a><a href="#l234">234</a><td><tr><td><a id="l235"></a><a href="#l235">235</a><td>/**<tr><td><a id="l236"></a><a href="#l236">236</a><td> * Schedules a task in the current control flow to stop the server if it is<tr><td><a id="l237"></a><a href="#l237">237</a><td> * currently running.<tr><td><a id="l238"></a><a href="#l238">238</a><td> * @return {!webdriver.promise.Promise} A promise that will be resolved when<tr><td><a id="l239"></a><a href="#l239">239</a><td> * the server has been stopped.<tr><td><a id="l240"></a><a href="#l240">240</a><td> */<tr><td><a id="l241"></a><a href="#l241">241</a><td>DriverService.prototype.stop = function() {<tr><td><a id="l242"></a><a href="#l242">242</a><td> return promise.controlFlow().execute(this.kill.bind(this));<tr><td><a id="l243"></a><a href="#l243">243</a><td>};<tr><td><a id="l244"></a><a href="#l244">244</a><td><tr><td><a id="l245"></a><a href="#l245">245</a><td><tr><td><a id="l246"></a><a href="#l246">246</a><td><tr><td><a id="l247"></a><a href="#l247">247</a><td>/**<tr><td><a id="l248"></a><a href="#l248">248</a><td> * Manages the life and death of the<tr><td><a id="l249"></a><a href="#l249">249</a><td> * &lt;a href=&quot;http://selenium-release.storage.googleapis.com/index.html&quot;&gt;<tr><td><a id="l250"></a><a href="#l250">250</a><td> * standalone Selenium server&lt;/a&gt;.<tr><td><a id="l251"></a><a href="#l251">251</a><td> *<tr><td><a id="l252"></a><a href="#l252">252</a><td> * @param {string} jar Path to the Selenium server jar.<tr><td><a id="l253"></a><a href="#l253">253</a><td> * @param {SeleniumServer.Options=} opt_options Configuration options for the<tr><td><a id="l254"></a><a href="#l254">254</a><td> * server.<tr><td><a id="l255"></a><a href="#l255">255</a><td> * @throws {Error} If the path to the Selenium jar is not specified or if an<tr><td><a id="l256"></a><a href="#l256">256</a><td> * invalid port is specified.<tr><td><a id="l257"></a><a href="#l257">257</a><td> * @constructor<tr><td><a id="l258"></a><a href="#l258">258</a><td> * @extends {DriverService}<tr><td><a id="l259"></a><a href="#l259">259</a><td> */<tr><td><a id="l260"></a><a href="#l260">260</a><td>function SeleniumServer(jar, opt_options) {<tr><td><a id="l261"></a><a href="#l261">261</a><td> if (!jar) {<tr><td><a id="l262"></a><a href="#l262">262</a><td> throw Error(&#39;Path to the Selenium jar not specified&#39;);<tr><td><a id="l263"></a><a href="#l263">263</a><td> }<tr><td><a id="l264"></a><a href="#l264">264</a><td><tr><td><a id="l265"></a><a href="#l265">265</a><td> var options = opt_options || {};<tr><td><a id="l266"></a><a href="#l266">266</a><td><tr><td><a id="l267"></a><a href="#l267">267</a><td> if (options.port &lt; 0) {<tr><td><a id="l268"></a><a href="#l268">268</a><td> throw Error(&#39;Port must be &gt;= 0: &#39; + options.port);<tr><td><a id="l269"></a><a href="#l269">269</a><td> }<tr><td><a id="l270"></a><a href="#l270">270</a><td><tr><td><a id="l271"></a><a href="#l271">271</a><td> var port = options.port || portprober.findFreePort();<tr><td><a id="l272"></a><a href="#l272">272</a><td> var args = promise.when(options.jvmArgs || [], function(jvmArgs) {<tr><td><a id="l273"></a><a href="#l273">273</a><td> return promise.when(options.args || [], function(args) {<tr><td><a id="l274"></a><a href="#l274">274</a><td> return promise.when(port, function(port) {<tr><td><a id="l275"></a><a href="#l275">275</a><td> return jvmArgs.concat([&#39;-jar&#39;, jar, &#39;-port&#39;, port]).concat(args);<tr><td><a id="l276"></a><a href="#l276">276</a><td> });<tr><td><a id="l277"></a><a href="#l277">277</a><td> });<tr><td><a id="l278"></a><a href="#l278">278</a><td> });<tr><td><a id="l279"></a><a href="#l279">279</a><td><tr><td><a id="l280"></a><a href="#l280">280</a><td> DriverService.call(this, &#39;java&#39;, {<tr><td><a id="l281"></a><a href="#l281">281</a><td> loopback: options.loopback,<tr><td><a id="l282"></a><a href="#l282">282</a><td> port: port,<tr><td><a id="l283"></a><a href="#l283">283</a><td> args: args,<tr><td><a id="l284"></a><a href="#l284">284</a><td> path: &#39;/wd/hub&#39;,<tr><td><a id="l285"></a><a href="#l285">285</a><td> env: options.env,<tr><td><a id="l286"></a><a href="#l286">286</a><td> stdio: options.stdio<tr><td><a id="l287"></a><a href="#l287">287</a><td> });<tr><td><a id="l288"></a><a href="#l288">288</a><td>}<tr><td><a id="l289"></a><a href="#l289">289</a><td>util.inherits(SeleniumServer, DriverService);<tr><td><a id="l290"></a><a href="#l290">290</a><td><tr><td><a id="l291"></a><a href="#l291">291</a><td><tr><td><a id="l292"></a><a href="#l292">292</a><td>/**<tr><td><a id="l293"></a><a href="#l293">293</a><td> * Options for the Selenium server:<tr><td><a id="l294"></a><a href="#l294">294</a><td> *<tr><td><a id="l295"></a><a href="#l295">295</a><td> * - `loopback` - Whether the server should only be accessed on this host&#39;s<tr><td><a id="l296"></a><a href="#l296">296</a><td> * loopback address.<tr><td><a id="l297"></a><a href="#l297">297</a><td> * - `port` - The port to start the server on (must be &gt; 0). If the port is<tr><td><a id="l298"></a><a href="#l298">298</a><td> * provided as a promise, the service will wait for the promise to resolve<tr><td><a id="l299"></a><a href="#l299">299</a><td> * before starting.<tr><td><a id="l300"></a><a href="#l300">300</a><td> * - `args` - The arguments to pass to the service. If a promise is provided,<tr><td><a id="l301"></a><a href="#l301">301</a><td> * the service will wait for it to resolve before starting.<tr><td><a id="l302"></a><a href="#l302">302</a><td> * - `jvmArgs` - The arguments to pass to the JVM. If a promise is provided,<tr><td><a id="l303"></a><a href="#l303">303</a><td> * the service will wait for it to resolve before starting.<tr><td><a id="l304"></a><a href="#l304">304</a><td> * - `env` - The environment variables that should be visible to the server<tr><td><a id="l305"></a><a href="#l305">305</a><td> * process. Defaults to inheriting the current process&#39;s environment.<tr><td><a id="l306"></a><a href="#l306">306</a><td> * - `stdio` - IO configuration for the spawned server process. For more<tr><td><a id="l307"></a><a href="#l307">307</a><td> * information, refer to the documentation of `child_process.spawn`.<tr><td><a id="l308"></a><a href="#l308">308</a><td> *<tr><td><a id="l309"></a><a href="#l309">309</a><td> * @typedef {{<tr><td><a id="l310"></a><a href="#l310">310</a><td> * loopback: (boolean|undefined),<tr><td><a id="l311"></a><a href="#l311">311</a><td> * port: (number|!webdriver.promise.Promise.&lt;number&gt;),<tr><td><a id="l312"></a><a href="#l312">312</a><td> * args: !(Array.&lt;string&gt;|webdriver.promise.Promise.&lt;!Array.&lt;string&gt;&gt;),<tr><td><a id="l313"></a><a href="#l313">313</a><td> * jvmArgs: (!Array.&lt;string&gt;|<tr><td><a id="l314"></a><a href="#l314">314</a><td> * !webdriver.promise.Promise.&lt;!Array.&lt;string&gt;&gt;|<tr><td><a id="l315"></a><a href="#l315">315</a><td> * undefined),<tr><td><a id="l316"></a><a href="#l316">316</a><td> * env: (!Object.&lt;string, string&gt;|undefined),<tr><td><a id="l317"></a><a href="#l317">317</a><td> * stdio: (string|!Array.&lt;string|number|!Stream|null|undefined&gt;|undefined)<tr><td><a id="l318"></a><a href="#l318">318</a><td> * }}<tr><td><a id="l319"></a><a href="#l319">319</a><td> */<tr><td><a id="l320"></a><a href="#l320">320</a><td>SeleniumServer.Options;<tr><td><a id="l321"></a><a href="#l321">321</a><td><tr><td><a id="l322"></a><a href="#l322">322</a><td><tr><td><a id="l323"></a><a href="#l323">323</a><td><tr><td><a id="l324"></a><a href="#l324">324</a><td>/**<tr><td><a id="l325"></a><a href="#l325">325</a><td> * A {@link webdriver.FileDetector} that may be used when running<tr><td><a id="l326"></a><a href="#l326">326</a><td> * against a remote<tr><td><a id="l327"></a><a href="#l327">327</a><td> * [Selenium server](http://selenium-release.storage.googleapis.com/index.html).<tr><td><a id="l328"></a><a href="#l328">328</a><td> *<tr><td><a id="l329"></a><a href="#l329">329</a><td> * When a file path on the local machine running this script is entered with<tr><td><a id="l330"></a><a href="#l330">330</a><td> * {@link webdriver.WebElement#sendKeys WebElement#sendKeys}, this file detector<tr><td><a id="l331"></a><a href="#l331">331</a><td> * will transfer the specified file to the Selenium server&#39;s host; the sendKeys<tr><td><a id="l332"></a><a href="#l332">332</a><td> * command will be updated to use the transfered file&#39;s path.<tr><td><a id="l333"></a><a href="#l333">333</a><td> *<tr><td><a id="l334"></a><a href="#l334">334</a><td> * __Note:__ This class depends on a non-standard command supported on the<tr><td><a id="l335"></a><a href="#l335">335</a><td> * Java Selenium server. The file detector will fail if used with a server that<tr><td><a id="l336"></a><a href="#l336">336</a><td> * only supports standard WebDriver commands (such as the ChromeDriver).<tr><td><a id="l337"></a><a href="#l337">337</a><td> *<tr><td><a id="l338"></a><a href="#l338">338</a><td> * @constructor<tr><td><a id="l339"></a><a href="#l339">339</a><td> * @extends {webdriver.FileDetector}<tr><td><a id="l340"></a><a href="#l340">340</a><td> * @final<tr><td><a id="l341"></a><a href="#l341">341</a><td> */<tr><td><a id="l342"></a><a href="#l342">342</a><td>var FileDetector = function() {};<tr><td><a id="l343"></a><a href="#l343">343</a><td>util.inherits(webdriver.FileDetector, FileDetector);<tr><td><a id="l344"></a><a href="#l344">344</a><td><tr><td><a id="l345"></a><a href="#l345">345</a><td><tr><td><a id="l346"></a><a href="#l346">346</a><td>/** @override */<tr><td><a id="l347"></a><a href="#l347">347</a><td>FileDetector.prototype.handleFile = function(driver, filePath) {<tr><td><a id="l348"></a><a href="#l348">348</a><td> return promise.checkedNodeCall(fs.stat, filePath).then(function(stats) {<tr><td><a id="l349"></a><a href="#l349">349</a><td> if (stats.isDirectory()) {<tr><td><a id="l350"></a><a href="#l350">350</a><td> throw TypeError(&#39;Uploading directories is not supported: &#39; + filePath);<tr><td><a id="l351"></a><a href="#l351">351</a><td> }<tr><td><a id="l352"></a><a href="#l352">352</a><td><tr><td><a id="l353"></a><a href="#l353">353</a><td> var zip = new AdmZip();<tr><td><a id="l354"></a><a href="#l354">354</a><td> zip.addLocalFile(filePath);<tr><td><a id="l355"></a><a href="#l355">355</a><td> zip.getEntries()[0].header.method = AdmConstants.STORED;<tr><td><a id="l356"></a><a href="#l356">356</a><td><tr><td><a id="l357"></a><a href="#l357">357</a><td> var command = new webdriver.Command(webdriver.CommandName.UPLOAD_FILE)<tr><td><a id="l358"></a><a href="#l358">358</a><td> .setParameter(&#39;file&#39;, zip.toBuffer().toString(&#39;base64&#39;));<tr><td><a id="l359"></a><a href="#l359">359</a><td> return driver.schedule(command,<tr><td><a id="l360"></a><a href="#l360">360</a><td> &#39;remote.FileDetector.handleFile(&#39; + filePath + &#39;)&#39;);<tr><td><a id="l361"></a><a href="#l361">361</a><td> }, function(err) {<tr><td><a id="l362"></a><a href="#l362">362</a><td> if (err.code === &#39;ENOENT&#39;) {<tr><td><a id="l363"></a><a href="#l363">363</a><td> return filePath; // Not a file; return original input.<tr><td><a id="l364"></a><a href="#l364">364</a><td> }<tr><td><a id="l365"></a><a href="#l365">365</a><td> throw err;<tr><td><a id="l366"></a><a href="#l366">366</a><td> });<tr><td><a id="l367"></a><a href="#l367">367</a><td>};<tr><td><a id="l368"></a><a href="#l368">368</a><td><tr><td><a id="l369"></a><a href="#l369">369</a><td>// PUBLIC API<tr><td><a id="l370"></a><a href="#l370">370</a><td><tr><td><a id="l371"></a><a href="#l371">371</a><td>exports.DriverService = DriverService;<tr><td><a id="l372"></a><a href="#l372">372</a><td>exports.FileDetector = FileDetector;<tr><td><a id="l373"></a><a href="#l373">373</a><td>exports.SeleniumServer = SeleniumServer;</table></div></article><nav><h3><a href="../../index.html" tabindex="2">Overview</a></h3><div><input type="checkbox" id="nav-modules" checked/><label for="nav-modules"><h3><span class="selectable" tabindex="2">Modules</span></h3></label><div id="nav-modules-view"></div></div><div><input type="checkbox" id="nav-types" checked/><label for="nav-types"><h3><span class="selectable" tabindex="2">Types</span></h3></label><div id="nav-types-view"></div></div><h3><a href="../../Changes.html" tabindex="2">Changes</a></h3></nav></main><footer><div><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></div></footer><script src="../../types.js"></script><script src="../../dossier.js"></script>
@@ -1 +0,0 @@
1
- <!DOCTYPE html><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"><meta http-equiv="Content-Language" content="en"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>safari.js</title><link href="../dossier.css" rel="stylesheet" type="text/css"><header><div><form><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></header><main><article class="srcfile"><h1>safari.js</h1><div><table><tr><td><a id="l1"></a><a href="#l1">1</a><td>// Licensed to the Software Freedom Conservancy (SFC) under one<tr><td><a id="l2"></a><a href="#l2">2</a><td>// or more contributor license agreements. See the NOTICE file<tr><td><a id="l3"></a><a href="#l3">3</a><td>// distributed with this work for additional information<tr><td><a id="l4"></a><a href="#l4">4</a><td>// regarding copyright ownership. The SFC licenses this file<tr><td><a id="l5"></a><a href="#l5">5</a><td>// to you under the Apache License, Version 2.0 (the<tr><td><a id="l6"></a><a href="#l6">6</a><td>// &quot;License&quot;); you may not use this file except in compliance<tr><td><a id="l7"></a><a href="#l7">7</a><td>// with the License. You may obtain a copy of the License at<tr><td><a id="l8"></a><a href="#l8">8</a><td>//<tr><td><a id="l9"></a><a href="#l9">9</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a id="l10"></a><a href="#l10">10</a><td>//<tr><td><a id="l11"></a><a href="#l11">11</a><td>// Unless required by applicable law or agreed to in writing,<tr><td><a id="l12"></a><a href="#l12">12</a><td>// software distributed under the License is distributed on an<tr><td><a id="l13"></a><a href="#l13">13</a><td>// &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<tr><td><a id="l14"></a><a href="#l14">14</a><td>// KIND, either express or implied. See the License for the<tr><td><a id="l15"></a><a href="#l15">15</a><td>// specific language governing permissions and limitations<tr><td><a id="l16"></a><a href="#l16">16</a><td>// under the License.<tr><td><a id="l17"></a><a href="#l17">17</a><td><tr><td><a id="l18"></a><a href="#l18">18</a><td>/**<tr><td><a id="l19"></a><a href="#l19">19</a><td> * @fileoverview Defines a WebDriver client for Safari. Before using this<tr><td><a id="l20"></a><a href="#l20">20</a><td> * module, you must install the<tr><td><a id="l21"></a><a href="#l21">21</a><td> * [latest version](http://selenium-release.storage.googleapis.com/index.html)<tr><td><a id="l22"></a><a href="#l22">22</a><td> * of the SafariDriver browser extension; using Safari for normal browsing is<tr><td><a id="l23"></a><a href="#l23">23</a><td> * not recommended once the extension has been installed. You can, and should,<tr><td><a id="l24"></a><a href="#l24">24</a><td> * disable the extension when the browser is not being used with WebDriver.<tr><td><a id="l25"></a><a href="#l25">25</a><td> */<tr><td><a id="l26"></a><a href="#l26">26</a><td><tr><td><a id="l27"></a><a href="#l27">27</a><td>&#39;use strict&#39;;<tr><td><a id="l28"></a><a href="#l28">28</a><td><tr><td><a id="l29"></a><a href="#l29">29</a><td>var events = require(&#39;events&#39;);<tr><td><a id="l30"></a><a href="#l30">30</a><td>var fs = require(&#39;fs&#39;);<tr><td><a id="l31"></a><a href="#l31">31</a><td>var http = require(&#39;http&#39;);<tr><td><a id="l32"></a><a href="#l32">32</a><td>var path = require(&#39;path&#39;);<tr><td><a id="l33"></a><a href="#l33">33</a><td>var url = require(&#39;url&#39;);<tr><td><a id="l34"></a><a href="#l34">34</a><td>var util = require(&#39;util&#39;);<tr><td><a id="l35"></a><a href="#l35">35</a><td>var ws = require(&#39;ws&#39;);<tr><td><a id="l36"></a><a href="#l36">36</a><td><tr><td><a id="l37"></a><a href="#l37">37</a><td>var webdriver = require(&#39;./&#39;);<tr><td><a id="l38"></a><a href="#l38">38</a><td>var promise = webdriver.promise;<tr><td><a id="l39"></a><a href="#l39">39</a><td>var _base = require(&#39;./_base&#39;);<tr><td><a id="l40"></a><a href="#l40">40</a><td>var io = require(&#39;./io&#39;);<tr><td><a id="l41"></a><a href="#l41">41</a><td>var exec = require(&#39;./io/exec&#39;);<tr><td><a id="l42"></a><a href="#l42">42</a><td>var portprober = require(&#39;./net/portprober&#39;);<tr><td><a id="l43"></a><a href="#l43">43</a><td><tr><td><a id="l44"></a><a href="#l44">44</a><td><tr><td><a id="l45"></a><a href="#l45">45</a><td>/** @const */<tr><td><a id="l46"></a><a href="#l46">46</a><td>var CLIENT_PATH = _base.isDevMode()<tr><td><a id="l47"></a><a href="#l47">47</a><td> ? path.join(__dirname,<tr><td><a id="l48"></a><a href="#l48">48</a><td> &#39;../../../build/javascript/safari-driver/client.js&#39;)<tr><td><a id="l49"></a><a href="#l49">49</a><td> : path.join(__dirname, &#39;lib/safari/client.js&#39;);<tr><td><a id="l50"></a><a href="#l50">50</a><td><tr><td><a id="l51"></a><a href="#l51">51</a><td><tr><td><a id="l52"></a><a href="#l52">52</a><td>/** @const */<tr><td><a id="l53"></a><a href="#l53">53</a><td>var LIBRARY_DIR = process.platform === &#39;darwin&#39;<tr><td><a id="l54"></a><a href="#l54">54</a><td> ? path.join(&#39;/Users&#39;, process.env[&#39;USER&#39;], &#39;Library/Safari&#39;)<tr><td><a id="l55"></a><a href="#l55">55</a><td> : path.join(process.env[&#39;APPDATA&#39;], &#39;Apple Computer&#39;, &#39;Safari&#39;);<tr><td><a id="l56"></a><a href="#l56">56</a><td><tr><td><a id="l57"></a><a href="#l57">57</a><td><tr><td><a id="l58"></a><a href="#l58">58</a><td>/** @const */<tr><td><a id="l59"></a><a href="#l59">59</a><td>var SESSION_DATA_FILES = (function() {<tr><td><a id="l60"></a><a href="#l60">60</a><td> if (process.platform === &#39;darwin&#39;) {<tr><td><a id="l61"></a><a href="#l61">61</a><td> var libraryDir = path.join(&#39;/Users&#39;, process.env[&#39;USER&#39;], &#39;Library&#39;);<tr><td><a id="l62"></a><a href="#l62">62</a><td> return [<tr><td><a id="l63"></a><a href="#l63">63</a><td> path.join(libraryDir, &#39;Caches/com.apple.Safari/Cache.db&#39;),<tr><td><a id="l64"></a><a href="#l64">64</a><td> path.join(libraryDir, &#39;Cookies/Cookies.binarycookies&#39;),<tr><td><a id="l65"></a><a href="#l65">65</a><td> path.join(libraryDir, &#39;Cookies/Cookies.plist&#39;),<tr><td><a id="l66"></a><a href="#l66">66</a><td> path.join(libraryDir, &#39;Safari/History.plist&#39;),<tr><td><a id="l67"></a><a href="#l67">67</a><td> path.join(libraryDir, &#39;Safari/LastSession.plist&#39;),<tr><td><a id="l68"></a><a href="#l68">68</a><td> path.join(libraryDir, &#39;Safari/LocalStorage&#39;),<tr><td><a id="l69"></a><a href="#l69">69</a><td> path.join(libraryDir, &#39;Safari/Databases&#39;)<tr><td><a id="l70"></a><a href="#l70">70</a><td> ];<tr><td><a id="l71"></a><a href="#l71">71</a><td> } else if (process.platform === &#39;win32&#39;) {<tr><td><a id="l72"></a><a href="#l72">72</a><td> var appDataDir = path.join(process.env[&#39;APPDATA&#39;],<tr><td><a id="l73"></a><a href="#l73">73</a><td> &#39;Apple Computer&#39;, &#39;Safari&#39;);<tr><td><a id="l74"></a><a href="#l74">74</a><td> var localDataDir = path.join(process.env[&#39;LOCALAPPDATA&#39;],<tr><td><a id="l75"></a><a href="#l75">75</a><td> &#39;Apple Computer&#39;, &#39;Safari&#39;);<tr><td><a id="l76"></a><a href="#l76">76</a><td> return [<tr><td><a id="l77"></a><a href="#l77">77</a><td> path.join(appDataDir, &#39;History.plist&#39;),<tr><td><a id="l78"></a><a href="#l78">78</a><td> path.join(appDataDir, &#39;LastSession.plist&#39;),<tr><td><a id="l79"></a><a href="#l79">79</a><td> path.join(appDataDir, &#39;Cookies/Cookies.plist&#39;),<tr><td><a id="l80"></a><a href="#l80">80</a><td> path.join(appDataDir, &#39;Cookies/Cookies.binarycookies&#39;),<tr><td><a id="l81"></a><a href="#l81">81</a><td> path.join(localDataDir, &#39;Cache.db&#39;),<tr><td><a id="l82"></a><a href="#l82">82</a><td> path.join(localDataDir, &#39;Databases&#39;),<tr><td><a id="l83"></a><a href="#l83">83</a><td> path.join(localDataDir, &#39;LocalStorage&#39;)<tr><td><a id="l84"></a><a href="#l84">84</a><td> ];<tr><td><a id="l85"></a><a href="#l85">85</a><td> } else {<tr><td><a id="l86"></a><a href="#l86">86</a><td> return [];<tr><td><a id="l87"></a><a href="#l87">87</a><td> }<tr><td><a id="l88"></a><a href="#l88">88</a><td>})();<tr><td><a id="l89"></a><a href="#l89">89</a><td><tr><td><a id="l90"></a><a href="#l90">90</a><td><tr><td><a id="l91"></a><a href="#l91">91</a><td>/** @typedef {{port: number, address: string, family: string}} */<tr><td><a id="l92"></a><a href="#l92">92</a><td>var Host;<tr><td><a id="l93"></a><a href="#l93">93</a><td><tr><td><a id="l94"></a><a href="#l94">94</a><td><tr><td><a id="l95"></a><a href="#l95">95</a><td>/**<tr><td><a id="l96"></a><a href="#l96">96</a><td> * A basic HTTP/WebSocket server used to communicate with the SafariDriver<tr><td><a id="l97"></a><a href="#l97">97</a><td> * browser extension.<tr><td><a id="l98"></a><a href="#l98">98</a><td> * @constructor<tr><td><a id="l99"></a><a href="#l99">99</a><td> * @extends {events.EventEmitter}<tr><td><a id="l100"></a><a href="#l100">100</a><td> */<tr><td><a id="l101"></a><a href="#l101">101</a><td>var Server = function() {<tr><td><a id="l102"></a><a href="#l102">102</a><td> events.EventEmitter.call(this);<tr><td><a id="l103"></a><a href="#l103">103</a><td><tr><td><a id="l104"></a><a href="#l104">104</a><td> var server = http.createServer(function(req, res) {<tr><td><a id="l105"></a><a href="#l105">105</a><td> if (req.url === &#39;/favicon.ico&#39;) {<tr><td><a id="l106"></a><a href="#l106">106</a><td> res.writeHead(204);<tr><td><a id="l107"></a><a href="#l107">107</a><td> res.end();<tr><td><a id="l108"></a><a href="#l108">108</a><td> return;<tr><td><a id="l109"></a><a href="#l109">109</a><td> }<tr><td><a id="l110"></a><a href="#l110">110</a><td><tr><td><a id="l111"></a><a href="#l111">111</a><td> var query = url.parse(req.url).query || &#39;&#39;;<tr><td><a id="l112"></a><a href="#l112">112</a><td> if (query.indexOf(&#39;url=&#39;) == -1) {<tr><td><a id="l113"></a><a href="#l113">113</a><td> var address = server.address()<tr><td><a id="l114"></a><a href="#l114">114</a><td> var host = address.address + &#39;:&#39; + address.port;<tr><td><a id="l115"></a><a href="#l115">115</a><td> res.writeHead(302, {&#39;Location&#39;: &#39;http://&#39; + host + &#39;?url=ws://&#39; + host});<tr><td><a id="l116"></a><a href="#l116">116</a><td> res.end();<tr><td><a id="l117"></a><a href="#l117">117</a><td> }<tr><td><a id="l118"></a><a href="#l118">118</a><td><tr><td><a id="l119"></a><a href="#l119">119</a><td> fs.readFile(CLIENT_PATH, &#39;utf8&#39;, function(err, data) {<tr><td><a id="l120"></a><a href="#l120">120</a><td> if (err) {<tr><td><a id="l121"></a><a href="#l121">121</a><td> res.writeHead(500, {&#39;Content-Type&#39;: &#39;text/plain&#39;});<tr><td><a id="l122"></a><a href="#l122">122</a><td> res.end(err.stack);<tr><td><a id="l123"></a><a href="#l123">123</a><td> return;<tr><td><a id="l124"></a><a href="#l124">124</a><td> }<tr><td><a id="l125"></a><a href="#l125">125</a><td> var content = &#39;&lt;!DOCTYPE html&gt;&lt;body&gt;&lt;script&gt;&#39; + data + &#39;&lt;/script&gt;&#39;;<tr><td><a id="l126"></a><a href="#l126">126</a><td> res.writeHead(200, {<tr><td><a id="l127"></a><a href="#l127">127</a><td> &#39;Content-Type&#39;: &#39;text/html; charset=utf-8&#39;,<tr><td><a id="l128"></a><a href="#l128">128</a><td> &#39;Content-Length&#39;: Buffer.byteLength(content, &#39;utf8&#39;),<tr><td><a id="l129"></a><a href="#l129">129</a><td> });<tr><td><a id="l130"></a><a href="#l130">130</a><td> res.end(content);<tr><td><a id="l131"></a><a href="#l131">131</a><td> });<tr><td><a id="l132"></a><a href="#l132">132</a><td> });<tr><td><a id="l133"></a><a href="#l133">133</a><td><tr><td><a id="l134"></a><a href="#l134">134</a><td> var wss = new ws.Server({server: server});<tr><td><a id="l135"></a><a href="#l135">135</a><td> wss.on(&#39;connection&#39;, this.emit.bind(this, &#39;connection&#39;));<tr><td><a id="l136"></a><a href="#l136">136</a><td><tr><td><a id="l137"></a><a href="#l137">137</a><td> /**<tr><td><a id="l138"></a><a href="#l138">138</a><td> * Starts the server on a random port.<tr><td><a id="l139"></a><a href="#l139">139</a><td> * @return {!webdriver.promise.Promise&lt;Host&gt;} A promise that will resolve<tr><td><a id="l140"></a><a href="#l140">140</a><td> * with the server host when it has fully started.<tr><td><a id="l141"></a><a href="#l141">141</a><td> */<tr><td><a id="l142"></a><a href="#l142">142</a><td> this.start = function() {<tr><td><a id="l143"></a><a href="#l143">143</a><td> if (server.address()) {<tr><td><a id="l144"></a><a href="#l144">144</a><td> return promise.fulfilled(server.address());<tr><td><a id="l145"></a><a href="#l145">145</a><td> }<tr><td><a id="l146"></a><a href="#l146">146</a><td> return portprober.findFreePort(&#39;localhost&#39;).then(function(port) {<tr><td><a id="l147"></a><a href="#l147">147</a><td> return promise.checkedNodeCall(<tr><td><a id="l148"></a><a href="#l148">148</a><td> server.listen.bind(server, port, &#39;localhost&#39;));<tr><td><a id="l149"></a><a href="#l149">149</a><td> }).then(function() {<tr><td><a id="l150"></a><a href="#l150">150</a><td> return server.address();<tr><td><a id="l151"></a><a href="#l151">151</a><td> });<tr><td><a id="l152"></a><a href="#l152">152</a><td> };<tr><td><a id="l153"></a><a href="#l153">153</a><td><tr><td><a id="l154"></a><a href="#l154">154</a><td> /**<tr><td><a id="l155"></a><a href="#l155">155</a><td> * Stops the server.<tr><td><a id="l156"></a><a href="#l156">156</a><td> * @return {!webdriver.promise.Promise} A promise that will resolve when the<tr><td><a id="l157"></a><a href="#l157">157</a><td> * server has closed all connections.<tr><td><a id="l158"></a><a href="#l158">158</a><td> */<tr><td><a id="l159"></a><a href="#l159">159</a><td> this.stop = function() {<tr><td><a id="l160"></a><a href="#l160">160</a><td> return new promise.Promise(function(fulfill) {<tr><td><a id="l161"></a><a href="#l161">161</a><td> server.close(fulfill);<tr><td><a id="l162"></a><a href="#l162">162</a><td> });<tr><td><a id="l163"></a><a href="#l163">163</a><td> };<tr><td><a id="l164"></a><a href="#l164">164</a><td><tr><td><a id="l165"></a><a href="#l165">165</a><td> /**<tr><td><a id="l166"></a><a href="#l166">166</a><td> * @return {Host} This server&#39;s host info.<tr><td><a id="l167"></a><a href="#l167">167</a><td> * @throws {Error} If the server is not running.<tr><td><a id="l168"></a><a href="#l168">168</a><td> */<tr><td><a id="l169"></a><a href="#l169">169</a><td> this.address = function() {<tr><td><a id="l170"></a><a href="#l170">170</a><td> var addr = server.address();<tr><td><a id="l171"></a><a href="#l171">171</a><td> if (!addr) {<tr><td><a id="l172"></a><a href="#l172">172</a><td> throw Error(&#39;There server is not running!&#39;);<tr><td><a id="l173"></a><a href="#l173">173</a><td> }<tr><td><a id="l174"></a><a href="#l174">174</a><td> return addr;<tr><td><a id="l175"></a><a href="#l175">175</a><td> };<tr><td><a id="l176"></a><a href="#l176">176</a><td>};<tr><td><a id="l177"></a><a href="#l177">177</a><td>util.inherits(Server, events.EventEmitter);<tr><td><a id="l178"></a><a href="#l178">178</a><td><tr><td><a id="l179"></a><a href="#l179">179</a><td><tr><td><a id="l180"></a><a href="#l180">180</a><td>/**<tr><td><a id="l181"></a><a href="#l181">181</a><td> * @return {!promise.Promise&lt;string&gt;} A promise that will resolve with the path<tr><td><a id="l182"></a><a href="#l182">182</a><td> * to Safari on the current system.<tr><td><a id="l183"></a><a href="#l183">183</a><td> */<tr><td><a id="l184"></a><a href="#l184">184</a><td>function findSafariExecutable() {<tr><td><a id="l185"></a><a href="#l185">185</a><td> switch (process.platform) {<tr><td><a id="l186"></a><a href="#l186">186</a><td> case &#39;darwin&#39;:<tr><td><a id="l187"></a><a href="#l187">187</a><td> return promise.fulfilled(<tr><td><a id="l188"></a><a href="#l188">188</a><td> &#39;/Applications/Safari.app/Contents/MacOS/Safari&#39;);<tr><td><a id="l189"></a><a href="#l189">189</a><td><tr><td><a id="l190"></a><a href="#l190">190</a><td> case &#39;win32&#39;:<tr><td><a id="l191"></a><a href="#l191">191</a><td> var files = [<tr><td><a id="l192"></a><a href="#l192">192</a><td> process.env[&#39;PROGRAMFILES&#39;] || &#39;\\Program Files&#39;,<tr><td><a id="l193"></a><a href="#l193">193</a><td> process.env[&#39;PROGRAMFILES(X86)&#39;] || &#39;\\Program Files (x86)&#39;<tr><td><a id="l194"></a><a href="#l194">194</a><td> ].map(function(prefix) {<tr><td><a id="l195"></a><a href="#l195">195</a><td> return path.join(prefix, &#39;Safari\\Safari.exe&#39;);<tr><td><a id="l196"></a><a href="#l196">196</a><td> });<tr><td><a id="l197"></a><a href="#l197">197</a><td> return io.exists(files[0]).then(function(exists) {<tr><td><a id="l198"></a><a href="#l198">198</a><td> return exists ? files[0] : io.exists(files[1]).then(function(exists) {<tr><td><a id="l199"></a><a href="#l199">199</a><td> if (exists) {<tr><td><a id="l200"></a><a href="#l200">200</a><td> return files[1];<tr><td><a id="l201"></a><a href="#l201">201</a><td> }<tr><td><a id="l202"></a><a href="#l202">202</a><td> throw Error(&#39;Unable to find Safari on the current system&#39;);<tr><td><a id="l203"></a><a href="#l203">203</a><td> });<tr><td><a id="l204"></a><a href="#l204">204</a><td> });<tr><td><a id="l205"></a><a href="#l205">205</a><td><tr><td><a id="l206"></a><a href="#l206">206</a><td> default:<tr><td><a id="l207"></a><a href="#l207">207</a><td> return promise.rejected(<tr><td><a id="l208"></a><a href="#l208">208</a><td> Error(&#39;Safari is not supported on the current platform: &#39; +<tr><td><a id="l209"></a><a href="#l209">209</a><td> process.platform));<tr><td><a id="l210"></a><a href="#l210">210</a><td> }<tr><td><a id="l211"></a><a href="#l211">211</a><td>}<tr><td><a id="l212"></a><a href="#l212">212</a><td><tr><td><a id="l213"></a><a href="#l213">213</a><td><tr><td><a id="l214"></a><a href="#l214">214</a><td>/**<tr><td><a id="l215"></a><a href="#l215">215</a><td> * @param {string} url The URL to connect to.<tr><td><a id="l216"></a><a href="#l216">216</a><td> * @return {!promise.Promise&lt;string&gt;} A promise for the path to a file that<tr><td><a id="l217"></a><a href="#l217">217</a><td> * Safari can open on start-up to trigger a new connection to the WebSocket<tr><td><a id="l218"></a><a href="#l218">218</a><td> * server.<tr><td><a id="l219"></a><a href="#l219">219</a><td> */<tr><td><a id="l220"></a><a href="#l220">220</a><td>function createConnectFile(url) {<tr><td><a id="l221"></a><a href="#l221">221</a><td> return io.tmpFile({postfix: &#39;.html&#39;}).then(function(f) {<tr><td><a id="l222"></a><a href="#l222">222</a><td> var writeFile = promise.checkedNodeCall(fs.writeFile,<tr><td><a id="l223"></a><a href="#l223">223</a><td> f,<tr><td><a id="l224"></a><a href="#l224">224</a><td> &#39;&lt;!DOCTYPE html&gt;&lt;script&gt;window.location = &quot;&#39; + url + &#39;&quot;;&lt;/script&gt;&#39;,<tr><td><a id="l225"></a><a href="#l225">225</a><td> {encoding: &#39;utf8&#39;});<tr><td><a id="l226"></a><a href="#l226">226</a><td> return writeFile.then(function() {<tr><td><a id="l227"></a><a href="#l227">227</a><td> return f;<tr><td><a id="l228"></a><a href="#l228">228</a><td> });<tr><td><a id="l229"></a><a href="#l229">229</a><td> });<tr><td><a id="l230"></a><a href="#l230">230</a><td>}<tr><td><a id="l231"></a><a href="#l231">231</a><td><tr><td><a id="l232"></a><a href="#l232">232</a><td><tr><td><a id="l233"></a><a href="#l233">233</a><td>/**<tr><td><a id="l234"></a><a href="#l234">234</a><td> * Deletes all session data files if so desired.<tr><td><a id="l235"></a><a href="#l235">235</a><td> * @param {!Object} desiredCapabilities .<tr><td><a id="l236"></a><a href="#l236">236</a><td> * @return {!Array&lt;promise.Promise&gt;} A list of promises for the deleted files.<tr><td><a id="l237"></a><a href="#l237">237</a><td> */<tr><td><a id="l238"></a><a href="#l238">238</a><td>function cleanSession(desiredCapabilities) {<tr><td><a id="l239"></a><a href="#l239">239</a><td> if (!desiredCapabilities) {<tr><td><a id="l240"></a><a href="#l240">240</a><td> return [];<tr><td><a id="l241"></a><a href="#l241">241</a><td> }<tr><td><a id="l242"></a><a href="#l242">242</a><td> var options = desiredCapabilities[OPTIONS_CAPABILITY_KEY];<tr><td><a id="l243"></a><a href="#l243">243</a><td> if (!options) {<tr><td><a id="l244"></a><a href="#l244">244</a><td> return [];<tr><td><a id="l245"></a><a href="#l245">245</a><td> }<tr><td><a id="l246"></a><a href="#l246">246</a><td> if (!options[&#39;cleanSession&#39;]) {<tr><td><a id="l247"></a><a href="#l247">247</a><td> return [];<tr><td><a id="l248"></a><a href="#l248">248</a><td> }<tr><td><a id="l249"></a><a href="#l249">249</a><td> return SESSION_DATA_FILES.map(function(file) {<tr><td><a id="l250"></a><a href="#l250">250</a><td> return io.unlink(file);<tr><td><a id="l251"></a><a href="#l251">251</a><td> });<tr><td><a id="l252"></a><a href="#l252">252</a><td>}<tr><td><a id="l253"></a><a href="#l253">253</a><td><tr><td><a id="l254"></a><a href="#l254">254</a><td><tr><td><a id="l255"></a><a href="#l255">255</a><td>/**<tr><td><a id="l256"></a><a href="#l256">256</a><td> * @constructor<tr><td><a id="l257"></a><a href="#l257">257</a><td> * @implements {webdriver.CommandExecutor}<tr><td><a id="l258"></a><a href="#l258">258</a><td> */<tr><td><a id="l259"></a><a href="#l259">259</a><td>var CommandExecutor = function() {<tr><td><a id="l260"></a><a href="#l260">260</a><td> /** @private {Server} */<tr><td><a id="l261"></a><a href="#l261">261</a><td> this.server_ = null;<tr><td><a id="l262"></a><a href="#l262">262</a><td><tr><td><a id="l263"></a><a href="#l263">263</a><td> /** @private {ws.WebSocket} */<tr><td><a id="l264"></a><a href="#l264">264</a><td> this.socket_ = null;<tr><td><a id="l265"></a><a href="#l265">265</a><td><tr><td><a id="l266"></a><a href="#l266">266</a><td> /** @private {promise.Promise.&lt;!exec.Command&gt;} */<tr><td><a id="l267"></a><a href="#l267">267</a><td> this.safari_ = null;<tr><td><a id="l268"></a><a href="#l268">268</a><td>};<tr><td><a id="l269"></a><a href="#l269">269</a><td><tr><td><a id="l270"></a><a href="#l270">270</a><td><tr><td><a id="l271"></a><a href="#l271">271</a><td>/** @override */<tr><td><a id="l272"></a><a href="#l272">272</a><td>CommandExecutor.prototype.execute = function(command, callback) {<tr><td><a id="l273"></a><a href="#l273">273</a><td> var safariCommand = JSON.stringify({<tr><td><a id="l274"></a><a href="#l274">274</a><td> &#39;origin&#39;: &#39;webdriver&#39;,<tr><td><a id="l275"></a><a href="#l275">275</a><td> &#39;type&#39;: &#39;command&#39;,<tr><td><a id="l276"></a><a href="#l276">276</a><td> &#39;command&#39;: {<tr><td><a id="l277"></a><a href="#l277">277</a><td> &#39;id&#39;: _base.require(&#39;goog.string&#39;).getRandomString(),<tr><td><a id="l278"></a><a href="#l278">278</a><td> &#39;name&#39;: command.getName(),<tr><td><a id="l279"></a><a href="#l279">279</a><td> &#39;parameters&#39;: command.getParameters()<tr><td><a id="l280"></a><a href="#l280">280</a><td> }<tr><td><a id="l281"></a><a href="#l281">281</a><td> });<tr><td><a id="l282"></a><a href="#l282">282</a><td> var self = this;<tr><td><a id="l283"></a><a href="#l283">283</a><td><tr><td><a id="l284"></a><a href="#l284">284</a><td> switch (command.getName()) {<tr><td><a id="l285"></a><a href="#l285">285</a><td> case webdriver.CommandName.NEW_SESSION:<tr><td><a id="l286"></a><a href="#l286">286</a><td> this.startSafari_(command).then(sendCommand, callback);<tr><td><a id="l287"></a><a href="#l287">287</a><td> break;<tr><td><a id="l288"></a><a href="#l288">288</a><td><tr><td><a id="l289"></a><a href="#l289">289</a><td> case webdriver.CommandName.QUIT:<tr><td><a id="l290"></a><a href="#l290">290</a><td> this.destroySession_().then(function() {<tr><td><a id="l291"></a><a href="#l291">291</a><td> callback(null, _base.require(&#39;bot.response&#39;).createResponse(null));<tr><td><a id="l292"></a><a href="#l292">292</a><td> }, callback);<tr><td><a id="l293"></a><a href="#l293">293</a><td> break;<tr><td><a id="l294"></a><a href="#l294">294</a><td><tr><td><a id="l295"></a><a href="#l295">295</a><td> default:<tr><td><a id="l296"></a><a href="#l296">296</a><td> sendCommand();<tr><td><a id="l297"></a><a href="#l297">297</a><td> break;<tr><td><a id="l298"></a><a href="#l298">298</a><td> }<tr><td><a id="l299"></a><a href="#l299">299</a><td><tr><td><a id="l300"></a><a href="#l300">300</a><td> function sendCommand() {<tr><td><a id="l301"></a><a href="#l301">301</a><td> new promise.Promise(function(fulfill, reject) {<tr><td><a id="l302"></a><a href="#l302">302</a><td> // TODO: support reconnecting with the extension.<tr><td><a id="l303"></a><a href="#l303">303</a><td> if (!self.socket_) {<tr><td><a id="l304"></a><a href="#l304">304</a><td> self.destroySession_().thenFinally(function() {<tr><td><a id="l305"></a><a href="#l305">305</a><td> reject(Error(&#39;The connection to the SafariDriver was closed&#39;));<tr><td><a id="l306"></a><a href="#l306">306</a><td> });<tr><td><a id="l307"></a><a href="#l307">307</a><td> return;<tr><td><a id="l308"></a><a href="#l308">308</a><td> }<tr><td><a id="l309"></a><a href="#l309">309</a><td><tr><td><a id="l310"></a><a href="#l310">310</a><td> self.socket_.send(safariCommand, function(err) {<tr><td><a id="l311"></a><a href="#l311">311</a><td> if (err) {<tr><td><a id="l312"></a><a href="#l312">312</a><td> reject(err);<tr><td><a id="l313"></a><a href="#l313">313</a><td> return;<tr><td><a id="l314"></a><a href="#l314">314</a><td> }<tr><td><a id="l315"></a><a href="#l315">315</a><td> });<tr><td><a id="l316"></a><a href="#l316">316</a><td><tr><td><a id="l317"></a><a href="#l317">317</a><td> self.socket_.once(&#39;message&#39;, function(data) {<tr><td><a id="l318"></a><a href="#l318">318</a><td> try {<tr><td><a id="l319"></a><a href="#l319">319</a><td> data = JSON.parse(data);<tr><td><a id="l320"></a><a href="#l320">320</a><td> } catch (ex) {<tr><td><a id="l321"></a><a href="#l321">321</a><td> reject(Error(&#39;Failed to parse driver message: &#39; + data));<tr><td><a id="l322"></a><a href="#l322">322</a><td> return;<tr><td><a id="l323"></a><a href="#l323">323</a><td> }<tr><td><a id="l324"></a><a href="#l324">324</a><td> fulfill(data[&#39;response&#39;]);<tr><td><a id="l325"></a><a href="#l325">325</a><td> });<tr><td><a id="l326"></a><a href="#l326">326</a><td><tr><td><a id="l327"></a><a href="#l327">327</a><td> }).then(function(value) {<tr><td><a id="l328"></a><a href="#l328">328</a><td> callback(null, value);<tr><td><a id="l329"></a><a href="#l329">329</a><td> }, callback);<tr><td><a id="l330"></a><a href="#l330">330</a><td> }<tr><td><a id="l331"></a><a href="#l331">331</a><td>};<tr><td><a id="l332"></a><a href="#l332">332</a><td><tr><td><a id="l333"></a><a href="#l333">333</a><td><tr><td><a id="l334"></a><a href="#l334">334</a><td>/**<tr><td><a id="l335"></a><a href="#l335">335</a><td> * @param {!webdriver.Command} command .<tr><td><a id="l336"></a><a href="#l336">336</a><td> * @private<tr><td><a id="l337"></a><a href="#l337">337</a><td> */<tr><td><a id="l338"></a><a href="#l338">338</a><td>CommandExecutor.prototype.startSafari_ = function(command) {<tr><td><a id="l339"></a><a href="#l339">339</a><td> this.server_ = new Server();<tr><td><a id="l340"></a><a href="#l340">340</a><td><tr><td><a id="l341"></a><a href="#l341">341</a><td> this.safari_ = this.server_.start().then(function(address) {<tr><td><a id="l342"></a><a href="#l342">342</a><td> var tasks = cleanSession(command.getParameters()[&#39;desiredCapabilities&#39;]);<tr><td><a id="l343"></a><a href="#l343">343</a><td> tasks.push(<tr><td><a id="l344"></a><a href="#l344">344</a><td> findSafariExecutable(),<tr><td><a id="l345"></a><a href="#l345">345</a><td> createConnectFile(<tr><td><a id="l346"></a><a href="#l346">346</a><td> &#39;http://&#39; + address.address + &#39;:&#39; + address.port));<tr><td><a id="l347"></a><a href="#l347">347</a><td> return promise.all(tasks).then(function(tasks) {<tr><td><a id="l348"></a><a href="#l348">348</a><td> var exe = tasks[tasks.length - 2];<tr><td><a id="l349"></a><a href="#l349">349</a><td> var html = tasks[tasks.length - 1];<tr><td><a id="l350"></a><a href="#l350">350</a><td> return exec(exe, {args: [html]});<tr><td><a id="l351"></a><a href="#l351">351</a><td> });<tr><td><a id="l352"></a><a href="#l352">352</a><td> });<tr><td><a id="l353"></a><a href="#l353">353</a><td><tr><td><a id="l354"></a><a href="#l354">354</a><td> var connected = promise.defer();<tr><td><a id="l355"></a><a href="#l355">355</a><td> var self = this;<tr><td><a id="l356"></a><a href="#l356">356</a><td> var start = Date.now();<tr><td><a id="l357"></a><a href="#l357">357</a><td> var timer = setTimeout(function() {<tr><td><a id="l358"></a><a href="#l358">358</a><td> connected.reject(Error(<tr><td><a id="l359"></a><a href="#l359">359</a><td> &#39;Failed to connect to the SafariDriver after &#39; + (Date.now() - start) +<tr><td><a id="l360"></a><a href="#l360">360</a><td> &#39; ms; Have you installed the latest extension from &#39; +<tr><td><a id="l361"></a><a href="#l361">361</a><td> &#39;http://selenium-release.storage.googleapis.com/index.html?&#39;));<tr><td><a id="l362"></a><a href="#l362">362</a><td> }, 10 * 1000);<tr><td><a id="l363"></a><a href="#l363">363</a><td> this.server_.once(&#39;connection&#39;, function(socket) {<tr><td><a id="l364"></a><a href="#l364">364</a><td> clearTimeout(timer);<tr><td><a id="l365"></a><a href="#l365">365</a><td> self.socket_ = socket;<tr><td><a id="l366"></a><a href="#l366">366</a><td> socket.once(&#39;close&#39;, function() {<tr><td><a id="l367"></a><a href="#l367">367</a><td> self.socket_ = null;<tr><td><a id="l368"></a><a href="#l368">368</a><td> });<tr><td><a id="l369"></a><a href="#l369">369</a><td> connected.fulfill();<tr><td><a id="l370"></a><a href="#l370">370</a><td> });<tr><td><a id="l371"></a><a href="#l371">371</a><td> return connected.promise;<tr><td><a id="l372"></a><a href="#l372">372</a><td>};<tr><td><a id="l373"></a><a href="#l373">373</a><td><tr><td><a id="l374"></a><a href="#l374">374</a><td><tr><td><a id="l375"></a><a href="#l375">375</a><td>/**<tr><td><a id="l376"></a><a href="#l376">376</a><td> * Destroys the active session by stopping the WebSocket server and killing the<tr><td><a id="l377"></a><a href="#l377">377</a><td> * Safari subprocess.<tr><td><a id="l378"></a><a href="#l378">378</a><td> * @private<tr><td><a id="l379"></a><a href="#l379">379</a><td> */<tr><td><a id="l380"></a><a href="#l380">380</a><td>CommandExecutor.prototype.destroySession_ = function() {<tr><td><a id="l381"></a><a href="#l381">381</a><td> var tasks = [];<tr><td><a id="l382"></a><a href="#l382">382</a><td> if (this.server_) {<tr><td><a id="l383"></a><a href="#l383">383</a><td> tasks.push(this.server_.stop());<tr><td><a id="l384"></a><a href="#l384">384</a><td> }<tr><td><a id="l385"></a><a href="#l385">385</a><td> if (this.safari_) {<tr><td><a id="l386"></a><a href="#l386">386</a><td> tasks.push(this.safari_.then(function(safari) {<tr><td><a id="l387"></a><a href="#l387">387</a><td> safari.kill();<tr><td><a id="l388"></a><a href="#l388">388</a><td> return safari.result();<tr><td><a id="l389"></a><a href="#l389">389</a><td> }));<tr><td><a id="l390"></a><a href="#l390">390</a><td> }<tr><td><a id="l391"></a><a href="#l391">391</a><td> var self = this;<tr><td><a id="l392"></a><a href="#l392">392</a><td> return promise.all(tasks).thenFinally(function() {<tr><td><a id="l393"></a><a href="#l393">393</a><td> self.server_ = null;<tr><td><a id="l394"></a><a href="#l394">394</a><td> self.socket_ = null;<tr><td><a id="l395"></a><a href="#l395">395</a><td> self.safari_ = null;<tr><td><a id="l396"></a><a href="#l396">396</a><td> });<tr><td><a id="l397"></a><a href="#l397">397</a><td>};<tr><td><a id="l398"></a><a href="#l398">398</a><td><tr><td><a id="l399"></a><a href="#l399">399</a><td><tr><td><a id="l400"></a><a href="#l400">400</a><td>/** @const */<tr><td><a id="l401"></a><a href="#l401">401</a><td>var OPTIONS_CAPABILITY_KEY = &#39;safari.options&#39;;<tr><td><a id="l402"></a><a href="#l402">402</a><td><tr><td><a id="l403"></a><a href="#l403">403</a><td><tr><td><a id="l404"></a><a href="#l404">404</a><td><tr><td><a id="l405"></a><a href="#l405">405</a><td>/**<tr><td><a id="l406"></a><a href="#l406">406</a><td> * Configuration options specific to the {@link Driver SafariDriver}.<tr><td><a id="l407"></a><a href="#l407">407</a><td> * @constructor<tr><td><a id="l408"></a><a href="#l408">408</a><td> * @extends {webdriver.Serializable}<tr><td><a id="l409"></a><a href="#l409">409</a><td> */<tr><td><a id="l410"></a><a href="#l410">410</a><td>var Options = function() {<tr><td><a id="l411"></a><a href="#l411">411</a><td> webdriver.Serializable.call(this);<tr><td><a id="l412"></a><a href="#l412">412</a><td><tr><td><a id="l413"></a><a href="#l413">413</a><td> /** @private {Object&lt;string, *&gt;} */<tr><td><a id="l414"></a><a href="#l414">414</a><td> this.options_ = null;<tr><td><a id="l415"></a><a href="#l415">415</a><td><tr><td><a id="l416"></a><a href="#l416">416</a><td> /** @private {webdriver.logging.Preferences} */<tr><td><a id="l417"></a><a href="#l417">417</a><td> this.logPrefs_ = null;<tr><td><a id="l418"></a><a href="#l418">418</a><td>};<tr><td><a id="l419"></a><a href="#l419">419</a><td>util.inherits(Options, webdriver.Serializable);<tr><td><a id="l420"></a><a href="#l420">420</a><td><tr><td><a id="l421"></a><a href="#l421">421</a><td><tr><td><a id="l422"></a><a href="#l422">422</a><td>/**<tr><td><a id="l423"></a><a href="#l423">423</a><td> * Extracts the SafariDriver specific options from the given capabilities<tr><td><a id="l424"></a><a href="#l424">424</a><td> * object.<tr><td><a id="l425"></a><a href="#l425">425</a><td> * @param {!webdriver.Capabilities} capabilities The capabilities object.<tr><td><a id="l426"></a><a href="#l426">426</a><td> * @return {!Options} The ChromeDriver options.<tr><td><a id="l427"></a><a href="#l427">427</a><td> */<tr><td><a id="l428"></a><a href="#l428">428</a><td>Options.fromCapabilities = function(capabilities) {<tr><td><a id="l429"></a><a href="#l429">429</a><td> var options = new Options();<tr><td><a id="l430"></a><a href="#l430">430</a><td><tr><td><a id="l431"></a><a href="#l431">431</a><td> var o = capabilities.get(OPTIONS_CAPABILITY_KEY);<tr><td><a id="l432"></a><a href="#l432">432</a><td> if (o instanceof Options) {<tr><td><a id="l433"></a><a href="#l433">433</a><td> options = o;<tr><td><a id="l434"></a><a href="#l434">434</a><td> } else if (o) {<tr><td><a id="l435"></a><a href="#l435">435</a><td> options.setCleanSession(o.cleanSession);<tr><td><a id="l436"></a><a href="#l436">436</a><td> }<tr><td><a id="l437"></a><a href="#l437">437</a><td><tr><td><a id="l438"></a><a href="#l438">438</a><td> if (capabilities.has(webdriver.Capability.LOGGING_PREFS)) {<tr><td><a id="l439"></a><a href="#l439">439</a><td> options.setLoggingPrefs(<tr><td><a id="l440"></a><a href="#l440">440</a><td> capabilities.get(webdriver.Capability.LOGGING_PREFS));<tr><td><a id="l441"></a><a href="#l441">441</a><td> }<tr><td><a id="l442"></a><a href="#l442">442</a><td><tr><td><a id="l443"></a><a href="#l443">443</a><td> return options;<tr><td><a id="l444"></a><a href="#l444">444</a><td>};<tr><td><a id="l445"></a><a href="#l445">445</a><td><tr><td><a id="l446"></a><a href="#l446">446</a><td><tr><td><a id="l447"></a><a href="#l447">447</a><td>/**<tr><td><a id="l448"></a><a href="#l448">448</a><td> * Sets whether to force Safari to start with a clean session. Enabling this<tr><td><a id="l449"></a><a href="#l449">449</a><td> * option will cause all global browser data to be deleted.<tr><td><a id="l450"></a><a href="#l450">450</a><td> * @param {boolean} clean Whether to make sure the session has no cookies,<tr><td><a id="l451"></a><a href="#l451">451</a><td> * cache entries, local storage, or databases.<tr><td><a id="l452"></a><a href="#l452">452</a><td> * @return {!Options} A self reference.<tr><td><a id="l453"></a><a href="#l453">453</a><td> */<tr><td><a id="l454"></a><a href="#l454">454</a><td>Options.prototype.setCleanSession = function(clean) {<tr><td><a id="l455"></a><a href="#l455">455</a><td> if (!this.options_) {<tr><td><a id="l456"></a><a href="#l456">456</a><td> this.options_ = {};<tr><td><a id="l457"></a><a href="#l457">457</a><td> }<tr><td><a id="l458"></a><a href="#l458">458</a><td> this.options_[&#39;cleanSession&#39;] = clean;<tr><td><a id="l459"></a><a href="#l459">459</a><td> return this;<tr><td><a id="l460"></a><a href="#l460">460</a><td>};<tr><td><a id="l461"></a><a href="#l461">461</a><td><tr><td><a id="l462"></a><a href="#l462">462</a><td><tr><td><a id="l463"></a><a href="#l463">463</a><td>/**<tr><td><a id="l464"></a><a href="#l464">464</a><td> * Sets the logging preferences for the new session.<tr><td><a id="l465"></a><a href="#l465">465</a><td> * @param {!webdriver.logging.Preferences} prefs The logging preferences.<tr><td><a id="l466"></a><a href="#l466">466</a><td> * @return {!Options} A self reference.<tr><td><a id="l467"></a><a href="#l467">467</a><td> */<tr><td><a id="l468"></a><a href="#l468">468</a><td>Options.prototype.setLoggingPrefs = function(prefs) {<tr><td><a id="l469"></a><a href="#l469">469</a><td> this.logPrefs_ = prefs;<tr><td><a id="l470"></a><a href="#l470">470</a><td> return this;<tr><td><a id="l471"></a><a href="#l471">471</a><td>};<tr><td><a id="l472"></a><a href="#l472">472</a><td><tr><td><a id="l473"></a><a href="#l473">473</a><td><tr><td><a id="l474"></a><a href="#l474">474</a><td>/**<tr><td><a id="l475"></a><a href="#l475">475</a><td> * Converts this options instance to a {@link webdriver.Capabilities} object.<tr><td><a id="l476"></a><a href="#l476">476</a><td> * @param {webdriver.Capabilities=} opt_capabilities The capabilities to merge<tr><td><a id="l477"></a><a href="#l477">477</a><td> * these options into, if any.<tr><td><a id="l478"></a><a href="#l478">478</a><td> * @return {!webdriver.Capabilities} The capabilities.<tr><td><a id="l479"></a><a href="#l479">479</a><td> */<tr><td><a id="l480"></a><a href="#l480">480</a><td>Options.prototype.toCapabilities = function(opt_capabilities) {<tr><td><a id="l481"></a><a href="#l481">481</a><td> var capabilities = opt_capabilities || webdriver.Capabilities.safari();<tr><td><a id="l482"></a><a href="#l482">482</a><td> if (this.logPrefs_) {<tr><td><a id="l483"></a><a href="#l483">483</a><td> capabilities.set(webdriver.Capability.LOGGING_PREFS, this.logPrefs_);<tr><td><a id="l484"></a><a href="#l484">484</a><td> }<tr><td><a id="l485"></a><a href="#l485">485</a><td> if (this.options_) {<tr><td><a id="l486"></a><a href="#l486">486</a><td> capabilities.set(OPTIONS_CAPABILITY_KEY, this);<tr><td><a id="l487"></a><a href="#l487">487</a><td> }<tr><td><a id="l488"></a><a href="#l488">488</a><td> return capabilities;<tr><td><a id="l489"></a><a href="#l489">489</a><td>};<tr><td><a id="l490"></a><a href="#l490">490</a><td><tr><td><a id="l491"></a><a href="#l491">491</a><td><tr><td><a id="l492"></a><a href="#l492">492</a><td>/**<tr><td><a id="l493"></a><a href="#l493">493</a><td> * Converts this instance to its JSON wire protocol representation. Note this<tr><td><a id="l494"></a><a href="#l494">494</a><td> * function is an implementation detail not intended for general use.<tr><td><a id="l495"></a><a href="#l495">495</a><td> * @return {!Object&lt;string, *&gt;} The JSON wire protocol representation of this<tr><td><a id="l496"></a><a href="#l496">496</a><td> * instance.<tr><td><a id="l497"></a><a href="#l497">497</a><td> * @override<tr><td><a id="l498"></a><a href="#l498">498</a><td> */<tr><td><a id="l499"></a><a href="#l499">499</a><td>Options.prototype.serialize = function() {<tr><td><a id="l500"></a><a href="#l500">500</a><td> return this.options_ || {};<tr><td><a id="l501"></a><a href="#l501">501</a><td>};<tr><td><a id="l502"></a><a href="#l502">502</a><td><tr><td><a id="l503"></a><a href="#l503">503</a><td><tr><td><a id="l504"></a><a href="#l504">504</a><td><tr><td><a id="l505"></a><a href="#l505">505</a><td>/**<tr><td><a id="l506"></a><a href="#l506">506</a><td> * A WebDriver client for Safari. This class should never be instantiated<tr><td><a id="l507"></a><a href="#l507">507</a><td> * directly; instead, use the {@link selenium-webdriver.Builder}:<tr><td><a id="l508"></a><a href="#l508">508</a><td> *<tr><td><a id="l509"></a><a href="#l509">509</a><td> * var driver = new Builder()<tr><td><a id="l510"></a><a href="#l510">510</a><td> * .forBrowser(&#39;safari&#39;)<tr><td><a id="l511"></a><a href="#l511">511</a><td> * .build();<tr><td><a id="l512"></a><a href="#l512">512</a><td> *<tr><td><a id="l513"></a><a href="#l513">513</a><td> * @param {(Options|webdriver.Capabilities)=} opt_config The configuration<tr><td><a id="l514"></a><a href="#l514">514</a><td> * options for the new session.<tr><td><a id="l515"></a><a href="#l515">515</a><td> * @param {webdriver.promise.ControlFlow=} opt_flow The control flow to create<tr><td><a id="l516"></a><a href="#l516">516</a><td> * the driver under.<tr><td><a id="l517"></a><a href="#l517">517</a><td> * @constructor<tr><td><a id="l518"></a><a href="#l518">518</a><td> * @extends {webdriver.WebDriver}<tr><td><a id="l519"></a><a href="#l519">519</a><td> */<tr><td><a id="l520"></a><a href="#l520">520</a><td>var Driver = function(opt_config, opt_flow) {<tr><td><a id="l521"></a><a href="#l521">521</a><td> var executor = new CommandExecutor();<tr><td><a id="l522"></a><a href="#l522">522</a><td> var capabilities =<tr><td><a id="l523"></a><a href="#l523">523</a><td> opt_config instanceof Options ? opt_config.toCapabilities() :<tr><td><a id="l524"></a><a href="#l524">524</a><td> (opt_config || webdriver.Capabilities.safari());<tr><td><a id="l525"></a><a href="#l525">525</a><td><tr><td><a id="l526"></a><a href="#l526">526</a><td> var driver = webdriver.WebDriver.createSession(<tr><td><a id="l527"></a><a href="#l527">527</a><td> executor, capabilities, opt_flow);<tr><td><a id="l528"></a><a href="#l528">528</a><td> webdriver.WebDriver.call(<tr><td><a id="l529"></a><a href="#l529">529</a><td> this, driver.getSession(), executor, driver.controlFlow());<tr><td><a id="l530"></a><a href="#l530">530</a><td>};<tr><td><a id="l531"></a><a href="#l531">531</a><td>util.inherits(Driver, webdriver.WebDriver);<tr><td><a id="l532"></a><a href="#l532">532</a><td><tr><td><a id="l533"></a><a href="#l533">533</a><td><tr><td><a id="l534"></a><a href="#l534">534</a><td>// Public API<tr><td><a id="l535"></a><a href="#l535">535</a><td><tr><td><a id="l536"></a><a href="#l536">536</a><td><tr><td><a id="l537"></a><a href="#l537">537</a><td>exports.Driver = Driver;<tr><td><a id="l538"></a><a href="#l538">538</a><td>exports.Options = Options;</table></div></article><nav><h3><a href="../index.html" tabindex="2">Overview</a></h3><div><input type="checkbox" id="nav-modules" checked/><label for="nav-modules"><h3><span class="selectable" tabindex="2">Modules</span></h3></label><div id="nav-modules-view"></div></div><div><input type="checkbox" id="nav-types" checked/><label for="nav-types"><h3><span class="selectable" tabindex="2">Types</span></h3></label><div id="nav-types-view"></div></div><h3><a href="../Changes.html" tabindex="2">Changes</a></h3></nav></main><footer><div><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></div></footer><script src="../types.js"></script><script src="../dossier.js"></script>
@@ -1 +0,0 @@
1
- <!DOCTYPE html><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"><meta http-equiv="Content-Language" content="en"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>assert.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><header><div><form><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></header><main><article class="srcfile"><h1>testing/assert.js</h1><div><table><tr><td><a id="l1"></a><a href="#l1">1</a><td>// Licensed to the Software Freedom Conservancy (SFC) under one<tr><td><a id="l2"></a><a href="#l2">2</a><td>// or more contributor license agreements. See the NOTICE file<tr><td><a id="l3"></a><a href="#l3">3</a><td>// distributed with this work for additional information<tr><td><a id="l4"></a><a href="#l4">4</a><td>// regarding copyright ownership. The SFC licenses this file<tr><td><a id="l5"></a><a href="#l5">5</a><td>// to you under the Apache License, Version 2.0 (the<tr><td><a id="l6"></a><a href="#l6">6</a><td>// &quot;License&quot;); you may not use this file except in compliance<tr><td><a id="l7"></a><a href="#l7">7</a><td>// with the License. You may obtain a copy of the License at<tr><td><a id="l8"></a><a href="#l8">8</a><td>//<tr><td><a id="l9"></a><a href="#l9">9</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a id="l10"></a><a href="#l10">10</a><td>//<tr><td><a id="l11"></a><a href="#l11">11</a><td>// Unless required by applicable law or agreed to in writing,<tr><td><a id="l12"></a><a href="#l12">12</a><td>// software distributed under the License is distributed on an<tr><td><a id="l13"></a><a href="#l13">13</a><td>// &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<tr><td><a id="l14"></a><a href="#l14">14</a><td>// KIND, either express or implied. See the License for the<tr><td><a id="l15"></a><a href="#l15">15</a><td>// specific language governing permissions and limitations<tr><td><a id="l16"></a><a href="#l16">16</a><td>// under the License.<tr><td><a id="l17"></a><a href="#l17">17</a><td><tr><td><a id="l18"></a><a href="#l18">18</a><td>/**<tr><td><a id="l19"></a><a href="#l19">19</a><td> * @fileoverview Defines a library that simplifies writing assertions against<tr><td><a id="l20"></a><a href="#l20">20</a><td> * promised values.<tr><td><a id="l21"></a><a href="#l21">21</a><td> *<tr><td><a id="l22"></a><a href="#l22">22</a><td> * &gt; &lt;hr&gt;<tr><td><a id="l23"></a><a href="#l23">23</a><td> * &gt; __NOTE:__ This module is considered experimental and is subject to<tr><td><a id="l24"></a><a href="#l24">24</a><td> * &gt; change, or removal, at any time!<tr><td><a id="l25"></a><a href="#l25">25</a><td> * &gt; &lt;hr&gt;<tr><td><a id="l26"></a><a href="#l26">26</a><td> *<tr><td><a id="l27"></a><a href="#l27">27</a><td> * Sample usage:<tr><td><a id="l28"></a><a href="#l28">28</a><td> *<tr><td><a id="l29"></a><a href="#l29">29</a><td> * var driver = new webdriver.Builder().build();<tr><td><a id="l30"></a><a href="#l30">30</a><td> * driver.get(&#39;http://www.google.com&#39;);<tr><td><a id="l31"></a><a href="#l31">31</a><td> *<tr><td><a id="l32"></a><a href="#l32">32</a><td> * assert(driver.getTitle()).equalTo(&#39;Google&#39;);<tr><td><a id="l33"></a><a href="#l33">33</a><td> */<tr><td><a id="l34"></a><a href="#l34">34</a><td><tr><td><a id="l35"></a><a href="#l35">35</a><td>var base = require(&#39;../_base&#39;),<tr><td><a id="l36"></a><a href="#l36">36</a><td> assert = base.require(&#39;webdriver.testing.assert&#39;);<tr><td><a id="l37"></a><a href="#l37">37</a><td><tr><td><a id="l38"></a><a href="#l38">38</a><td><tr><td><a id="l39"></a><a href="#l39">39</a><td>// PUBLIC API<tr><td><a id="l40"></a><a href="#l40">40</a><td><tr><td><a id="l41"></a><a href="#l41">41</a><td><tr><td><a id="l42"></a><a href="#l42">42</a><td>/**<tr><td><a id="l43"></a><a href="#l43">43</a><td> * Creates a new assertion.<tr><td><a id="l44"></a><a href="#l44">44</a><td> * @param {*} value The value to perform an assertion on.<tr><td><a id="l45"></a><a href="#l45">45</a><td> * @return {!webdriver.testing.Assertion} The new assertion.<tr><td><a id="l46"></a><a href="#l46">46</a><td> */<tr><td><a id="l47"></a><a href="#l47">47</a><td>module.exports = function(value) {<tr><td><a id="l48"></a><a href="#l48">48</a><td> return assert(value);<tr><td><a id="l49"></a><a href="#l49">49</a><td>};<tr><td><a id="l50"></a><a href="#l50">50</a><td><tr><td><a id="l51"></a><a href="#l51">51</a><td><tr><td><a id="l52"></a><a href="#l52">52</a><td>/**<tr><td><a id="l53"></a><a href="#l53">53</a><td> * Registers a new assertion to expose from the<tr><td><a id="l54"></a><a href="#l54">54</a><td> * {@link webdriver.testing.Assertion} prototype.<tr><td><a id="l55"></a><a href="#l55">55</a><td> * @param {string} name The assertion name.<tr><td><a id="l56"></a><a href="#l56">56</a><td> * @param {(function(new: goog.labs.testing.Matcher, *)|<tr><td><a id="l57"></a><a href="#l57">57</a><td> * {matches: function(*): boolean,<tr><td><a id="l58"></a><a href="#l58">58</a><td> * describe: function(): string})} matcherTemplate Either the<tr><td><a id="l59"></a><a href="#l59">59</a><td> * matcher constructor to use, or an object literal defining a matcher.<tr><td><a id="l60"></a><a href="#l60">60</a><td> */<tr><td><a id="l61"></a><a href="#l61">61</a><td>module.exports.register = assert.register;</table></div></article><nav><h3><a href="../../index.html" tabindex="2">Overview</a></h3><div><input type="checkbox" id="nav-modules" checked/><label for="nav-modules"><h3><span class="selectable" tabindex="2">Modules</span></h3></label><div id="nav-modules-view"></div></div><div><input type="checkbox" id="nav-types" checked/><label for="nav-types"><h3><span class="selectable" tabindex="2">Types</span></h3></label><div id="nav-types-view"></div></div><h3><a href="../../Changes.html" tabindex="2">Changes</a></h3></nav></main><footer><div><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></div></footer><script src="../../types.js"></script><script src="../../dossier.js"></script>
@@ -1 +0,0 @@
1
- <!DOCTYPE html><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1, user-scalable=no"><meta http-equiv="Content-Language" content="en"><meta http-equiv="X-UA-Compatible" content="IE=edge"><title>index.js</title><link href="../../dossier.css" rel="stylesheet" type="text/css"><header><div><form><div><input type="search" placeholder="Search" tabindex="1"></div></form></div></header><main><article class="srcfile"><h1>testing/index.js</h1><div><table><tr><td><a id="l1"></a><a href="#l1">1</a><td>// Licensed to the Software Freedom Conservancy (SFC) under one<tr><td><a id="l2"></a><a href="#l2">2</a><td>// or more contributor license agreements. See the NOTICE file<tr><td><a id="l3"></a><a href="#l3">3</a><td>// distributed with this work for additional information<tr><td><a id="l4"></a><a href="#l4">4</a><td>// regarding copyright ownership. The SFC licenses this file<tr><td><a id="l5"></a><a href="#l5">5</a><td>// to you under the Apache License, Version 2.0 (the<tr><td><a id="l6"></a><a href="#l6">6</a><td>// &quot;License&quot;); you may not use this file except in compliance<tr><td><a id="l7"></a><a href="#l7">7</a><td>// with the License. You may obtain a copy of the License at<tr><td><a id="l8"></a><a href="#l8">8</a><td>//<tr><td><a id="l9"></a><a href="#l9">9</a><td>// http://www.apache.org/licenses/LICENSE-2.0<tr><td><a id="l10"></a><a href="#l10">10</a><td>//<tr><td><a id="l11"></a><a href="#l11">11</a><td>// Unless required by applicable law or agreed to in writing,<tr><td><a id="l12"></a><a href="#l12">12</a><td>// software distributed under the License is distributed on an<tr><td><a id="l13"></a><a href="#l13">13</a><td>// &quot;AS IS&quot; BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY<tr><td><a id="l14"></a><a href="#l14">14</a><td>// KIND, either express or implied. See the License for the<tr><td><a id="l15"></a><a href="#l15">15</a><td>// specific language governing permissions and limitations<tr><td><a id="l16"></a><a href="#l16">16</a><td>// under the License.<tr><td><a id="l17"></a><a href="#l17">17</a><td><tr><td><a id="l18"></a><a href="#l18">18</a><td>/**<tr><td><a id="l19"></a><a href="#l19">19</a><td> * @fileoverview Provides wrappers around the following global functions from<tr><td><a id="l20"></a><a href="#l20">20</a><td> * [Mocha&#39;s BDD interface](https://github.com/mochajs/mocha):<tr><td><a id="l21"></a><a href="#l21">21</a><td> *<tr><td><a id="l22"></a><a href="#l22">22</a><td> * - after<tr><td><a id="l23"></a><a href="#l23">23</a><td> * - afterEach<tr><td><a id="l24"></a><a href="#l24">24</a><td> * - before<tr><td><a id="l25"></a><a href="#l25">25</a><td> * - beforeEach<tr><td><a id="l26"></a><a href="#l26">26</a><td> * - it<tr><td><a id="l27"></a><a href="#l27">27</a><td> * - it.only<tr><td><a id="l28"></a><a href="#l28">28</a><td> * - it.skip<tr><td><a id="l29"></a><a href="#l29">29</a><td> * - xit<tr><td><a id="l30"></a><a href="#l30">30</a><td> *<tr><td><a id="l31"></a><a href="#l31">31</a><td> * The provided wrappers leverage the {@link webdriver.promise.ControlFlow}<tr><td><a id="l32"></a><a href="#l32">32</a><td> * to simplify writing asynchronous tests:<tr><td><a id="l33"></a><a href="#l33">33</a><td> *<tr><td><a id="l34"></a><a href="#l34">34</a><td> * var By = require(&#39;selenium-webdriver&#39;).By,<tr><td><a id="l35"></a><a href="#l35">35</a><td> * until = require(&#39;selenium-webdriver&#39;).until,<tr><td><a id="l36"></a><a href="#l36">36</a><td> * firefox = require(&#39;selenium-webdriver/firefox&#39;),<tr><td><a id="l37"></a><a href="#l37">37</a><td> * test = require(&#39;selenium-webdriver/testing&#39;);<tr><td><a id="l38"></a><a href="#l38">38</a><td> *<tr><td><a id="l39"></a><a href="#l39">39</a><td> * test.describe(&#39;Google Search&#39;, function() {<tr><td><a id="l40"></a><a href="#l40">40</a><td> * var driver;<tr><td><a id="l41"></a><a href="#l41">41</a><td> *<tr><td><a id="l42"></a><a href="#l42">42</a><td> * test.before(function() {<tr><td><a id="l43"></a><a href="#l43">43</a><td> * driver = new firefox.Driver();<tr><td><a id="l44"></a><a href="#l44">44</a><td> * });<tr><td><a id="l45"></a><a href="#l45">45</a><td> *<tr><td><a id="l46"></a><a href="#l46">46</a><td> * test.after(function() {<tr><td><a id="l47"></a><a href="#l47">47</a><td> * driver.quit();<tr><td><a id="l48"></a><a href="#l48">48</a><td> * });<tr><td><a id="l49"></a><a href="#l49">49</a><td> *<tr><td><a id="l50"></a><a href="#l50">50</a><td> * test.it(&#39;should append query to title&#39;, function() {<tr><td><a id="l51"></a><a href="#l51">51</a><td> * driver.get(&#39;http://www.google.com/ncr&#39;);<tr><td><a id="l52"></a><a href="#l52">52</a><td> * driver.findElement(By.name(&#39;q&#39;)).sendKeys(&#39;webdriver&#39;);<tr><td><a id="l53"></a><a href="#l53">53</a><td> * driver.findElement(By.name(&#39;btnG&#39;)).click();<tr><td><a id="l54"></a><a href="#l54">54</a><td> * driver.wait(until.titleIs(&#39;webdriver - Google Search&#39;), 1000);<tr><td><a id="l55"></a><a href="#l55">55</a><td> * });<tr><td><a id="l56"></a><a href="#l56">56</a><td> * });<tr><td><a id="l57"></a><a href="#l57">57</a><td> *<tr><td><a id="l58"></a><a href="#l58">58</a><td> * You may conditionally suppress a test function using the exported<tr><td><a id="l59"></a><a href="#l59">59</a><td> * &quot;ignore&quot; function. If the provided predicate returns true, the attached<tr><td><a id="l60"></a><a href="#l60">60</a><td> * test case will be skipped:<tr><td><a id="l61"></a><a href="#l61">61</a><td> *<tr><td><a id="l62"></a><a href="#l62">62</a><td> * test.ignore(maybe()).it(&#39;is flaky&#39;, function() {<tr><td><a id="l63"></a><a href="#l63">63</a><td> * if (Math.random() &lt; 0.5) throw Error();<tr><td><a id="l64"></a><a href="#l64">64</a><td> * });<tr><td><a id="l65"></a><a href="#l65">65</a><td> *<tr><td><a id="l66"></a><a href="#l66">66</a><td> * function maybe() { return Math.random() &lt; 0.5; }<tr><td><a id="l67"></a><a href="#l67">67</a><td> */<tr><td><a id="l68"></a><a href="#l68">68</a><td><tr><td><a id="l69"></a><a href="#l69">69</a><td>var promise = require(&#39;..&#39;).promise;<tr><td><a id="l70"></a><a href="#l70">70</a><td>var flow = promise.controlFlow();<tr><td><a id="l71"></a><a href="#l71">71</a><td><tr><td><a id="l72"></a><a href="#l72">72</a><td><tr><td><a id="l73"></a><a href="#l73">73</a><td>/**<tr><td><a id="l74"></a><a href="#l74">74</a><td> * Wraps a function so that all passed arguments are ignored.<tr><td><a id="l75"></a><a href="#l75">75</a><td> * @param {!Function} fn The function to wrap.<tr><td><a id="l76"></a><a href="#l76">76</a><td> * @return {!Function} The wrapped function.<tr><td><a id="l77"></a><a href="#l77">77</a><td> */<tr><td><a id="l78"></a><a href="#l78">78</a><td>function seal(fn) {<tr><td><a id="l79"></a><a href="#l79">79</a><td> return function() {<tr><td><a id="l80"></a><a href="#l80">80</a><td> fn();<tr><td><a id="l81"></a><a href="#l81">81</a><td> };<tr><td><a id="l82"></a><a href="#l82">82</a><td>}<tr><td><a id="l83"></a><a href="#l83">83</a><td><tr><td><a id="l84"></a><a href="#l84">84</a><td><tr><td><a id="l85"></a><a href="#l85">85</a><td>/**<tr><td><a id="l86"></a><a href="#l86">86</a><td> * Wraps a function on Mocha&#39;s BDD interface so it runs inside a<tr><td><a id="l87"></a><a href="#l87">87</a><td> * webdriver.promise.ControlFlow and waits for the flow to complete before<tr><td><a id="l88"></a><a href="#l88">88</a><td> * continuing.<tr><td><a id="l89"></a><a href="#l89">89</a><td> * @param {!Function} globalFn The function to wrap.<tr><td><a id="l90"></a><a href="#l90">90</a><td> * @return {!Function} The new function.<tr><td><a id="l91"></a><a href="#l91">91</a><td> */<tr><td><a id="l92"></a><a href="#l92">92</a><td>function wrapped(globalFn) {<tr><td><a id="l93"></a><a href="#l93">93</a><td> return function() {<tr><td><a id="l94"></a><a href="#l94">94</a><td> if (arguments.length === 1) {<tr><td><a id="l95"></a><a href="#l95">95</a><td> return globalFn(makeAsyncTestFn(arguments[0]));<tr><td><a id="l96"></a><a href="#l96">96</a><td> }<tr><td><a id="l97"></a><a href="#l97">97</a><td> else if (arguments.length === 2) {<tr><td><a id="l98"></a><a href="#l98">98</a><td> return globalFn(arguments[0], makeAsyncTestFn(arguments[1]));<tr><td><a id="l99"></a><a href="#l99">99</a><td> }<tr><td><a id="l100"></a><a href="#l100">100</a><td> else {<tr><td><a id="l101"></a><a href="#l101">101</a><td> throw Error(&#39;Invalid # arguments: &#39; + arguments.length);<tr><td><a id="l102"></a><a href="#l102">102</a><td> }<tr><td><a id="l103"></a><a href="#l103">103</a><td> };<tr><td><a id="l104"></a><a href="#l104">104</a><td>}<tr><td><a id="l105"></a><a href="#l105">105</a><td><tr><td><a id="l106"></a><a href="#l106">106</a><td>/**<tr><td><a id="l107"></a><a href="#l107">107</a><td> * Make a wrapper to invoke caller&#39;s test function, fn. Run the test function<tr><td><a id="l108"></a><a href="#l108">108</a><td> * within a ControlFlow.<tr><td><a id="l109"></a><a href="#l109">109</a><td> *<tr><td><a id="l110"></a><a href="#l110">110</a><td> * Should preserve the semantics of Mocha&#39;s Runnable.prototype.run (See<tr><td><a id="l111"></a><a href="#l111">111</a><td> * https://github.com/mochajs/mocha/blob/master/lib/runnable.js#L192)<tr><td><a id="l112"></a><a href="#l112">112</a><td> *<tr><td><a id="l113"></a><a href="#l113">113</a><td> * @param {Function} fn<tr><td><a id="l114"></a><a href="#l114">114</a><td> * @return {Function}<tr><td><a id="l115"></a><a href="#l115">115</a><td> */<tr><td><a id="l116"></a><a href="#l116">116</a><td>function makeAsyncTestFn(fn) {<tr><td><a id="l117"></a><a href="#l117">117</a><td> var async = fn.length &gt; 0; // if test function expects a callback, its &quot;async&quot;<tr><td><a id="l118"></a><a href="#l118">118</a><td><tr><td><a id="l119"></a><a href="#l119">119</a><td> var ret = function(done) {<tr><td><a id="l120"></a><a href="#l120">120</a><td> var runnable = this.runnable();<tr><td><a id="l121"></a><a href="#l121">121</a><td> var mochaCallback = runnable.callback;<tr><td><a id="l122"></a><a href="#l122">122</a><td> runnable.callback = function() {<tr><td><a id="l123"></a><a href="#l123">123</a><td> flow.reset();<tr><td><a id="l124"></a><a href="#l124">124</a><td> return mochaCallback.apply(this, arguments);<tr><td><a id="l125"></a><a href="#l125">125</a><td> };<tr><td><a id="l126"></a><a href="#l126">126</a><td><tr><td><a id="l127"></a><a href="#l127">127</a><td> var testFn = fn.bind(this);<tr><td><a id="l128"></a><a href="#l128">128</a><td> flow.execute(function controlFlowExecute() {<tr><td><a id="l129"></a><a href="#l129">129</a><td> return new promise.Promise(function(fulfill, reject) {<tr><td><a id="l130"></a><a href="#l130">130</a><td> if (async) {<tr><td><a id="l131"></a><a href="#l131">131</a><td> // If testFn is async (it expects a done callback), resolve the promise of this<tr><td><a id="l132"></a><a href="#l132">132</a><td> // test whenever that callback says to. Any promises returned from testFn are<tr><td><a id="l133"></a><a href="#l133">133</a><td> // ignored.<tr><td><a id="l134"></a><a href="#l134">134</a><td> testFn(function testFnDoneCallback(err) {<tr><td><a id="l135"></a><a href="#l135">135</a><td> if (err) {<tr><td><a id="l136"></a><a href="#l136">136</a><td> reject(err);<tr><td><a id="l137"></a><a href="#l137">137</a><td> } else {<tr><td><a id="l138"></a><a href="#l138">138</a><td> fulfill();<tr><td><a id="l139"></a><a href="#l139">139</a><td> }<tr><td><a id="l140"></a><a href="#l140">140</a><td> });<tr><td><a id="l141"></a><a href="#l141">141</a><td> } else {<tr><td><a id="l142"></a><a href="#l142">142</a><td> // Without a callback, testFn can return a promise, or it will<tr><td><a id="l143"></a><a href="#l143">143</a><td> // be assumed to have completed synchronously<tr><td><a id="l144"></a><a href="#l144">144</a><td> fulfill(testFn());<tr><td><a id="l145"></a><a href="#l145">145</a><td> }<tr><td><a id="l146"></a><a href="#l146">146</a><td> }, flow);<tr><td><a id="l147"></a><a href="#l147">147</a><td> }, runnable.fullTitle()).then(seal(done), done);<tr><td><a id="l148"></a><a href="#l148">148</a><td> };<tr><td><a id="l149"></a><a href="#l149">149</a><td><tr><td><a id="l150"></a><a href="#l150">150</a><td> ret.toString = function() {<tr><td><a id="l151"></a><a href="#l151">151</a><td> return fn.toString();<tr><td><a id="l152"></a><a href="#l152">152</a><td> };<tr><td><a id="l153"></a><a href="#l153">153</a><td><tr><td><a id="l154"></a><a href="#l154">154</a><td> return ret;<tr><td><a id="l155"></a><a href="#l155">155</a><td>}<tr><td><a id="l156"></a><a href="#l156">156</a><td><tr><td><a id="l157"></a><a href="#l157">157</a><td><tr><td><a id="l158"></a><a href="#l158">158</a><td>/**<tr><td><a id="l159"></a><a href="#l159">159</a><td> * Ignores the test chained to this function if the provided predicate returns<tr><td><a id="l160"></a><a href="#l160">160</a><td> * true.<tr><td><a id="l161"></a><a href="#l161">161</a><td> * @param {function(): boolean} predicateFn A predicate to call to determine<tr><td><a id="l162"></a><a href="#l162">162</a><td> * if the test should be suppressed. This function MUST be synchronous.<tr><td><a id="l163"></a><a href="#l163">163</a><td> * @return {!Object} An object with wrapped versions of {@link #it()} and<tr><td><a id="l164"></a><a href="#l164">164</a><td> * {@link #describe()} that ignore tests as indicated by the predicate.<tr><td><a id="l165"></a><a href="#l165">165</a><td> */<tr><td><a id="l166"></a><a href="#l166">166</a><td>function ignore(predicateFn) {<tr><td><a id="l167"></a><a href="#l167">167</a><td> var describe = wrap(exports.xdescribe, exports.describe);<tr><td><a id="l168"></a><a href="#l168">168</a><td> describe.only = wrap(exports.xdescribe, exports.describe.only);<tr><td><a id="l169"></a><a href="#l169">169</a><td><tr><td><a id="l170"></a><a href="#l170">170</a><td> var it = wrap(exports.xit, exports.it);<tr><td><a id="l171"></a><a href="#l171">171</a><td> it.only = wrap(exports.xit, exports.it.only);<tr><td><a id="l172"></a><a href="#l172">172</a><td><tr><td><a id="l173"></a><a href="#l173">173</a><td> return {<tr><td><a id="l174"></a><a href="#l174">174</a><td> describe: describe,<tr><td><a id="l175"></a><a href="#l175">175</a><td> it: it<tr><td><a id="l176"></a><a href="#l176">176</a><td> };<tr><td><a id="l177"></a><a href="#l177">177</a><td><tr><td><a id="l178"></a><a href="#l178">178</a><td> function wrap(onSkip, onRun) {<tr><td><a id="l179"></a><a href="#l179">179</a><td> return function(title, fn) {<tr><td><a id="l180"></a><a href="#l180">180</a><td> if (predicateFn()) {<tr><td><a id="l181"></a><a href="#l181">181</a><td> onSkip(title, fn);<tr><td><a id="l182"></a><a href="#l182">182</a><td> } else {<tr><td><a id="l183"></a><a href="#l183">183</a><td> onRun(title, fn);<tr><td><a id="l184"></a><a href="#l184">184</a><td> }<tr><td><a id="l185"></a><a href="#l185">185</a><td> };<tr><td><a id="l186"></a><a href="#l186">186</a><td> }<tr><td><a id="l187"></a><a href="#l187">187</a><td>}<tr><td><a id="l188"></a><a href="#l188">188</a><td><tr><td><a id="l189"></a><a href="#l189">189</a><td><tr><td><a id="l190"></a><a href="#l190">190</a><td>// PUBLIC API<tr><td><a id="l191"></a><a href="#l191">191</a><td><tr><td><a id="l192"></a><a href="#l192">192</a><td>/**<tr><td><a id="l193"></a><a href="#l193">193</a><td> * Registers a new test suite.<tr><td><a id="l194"></a><a href="#l194">194</a><td> * @param {string} name The suite name.<tr><td><a id="l195"></a><a href="#l195">195</a><td> * @param {function()=} fn The suite function, or {@code undefined} to define<tr><td><a id="l196"></a><a href="#l196">196</a><td> * a pending test suite.<tr><td><a id="l197"></a><a href="#l197">197</a><td> */<tr><td><a id="l198"></a><a href="#l198">198</a><td>exports.describe = global.describe;<tr><td><a id="l199"></a><a href="#l199">199</a><td><tr><td><a id="l200"></a><a href="#l200">200</a><td>/**<tr><td><a id="l201"></a><a href="#l201">201</a><td> * Defines a suppressed test suite.<tr><td><a id="l202"></a><a href="#l202">202</a><td> * @param {string} name The suite name.<tr><td><a id="l203"></a><a href="#l203">203</a><td> * @param {function()=} fn The suite function, or {@code undefined} to define<tr><td><a id="l204"></a><a href="#l204">204</a><td> * a pending test suite.<tr><td><a id="l205"></a><a href="#l205">205</a><td> */<tr><td><a id="l206"></a><a href="#l206">206</a><td>exports.xdescribe = global.xdescribe;<tr><td><a id="l207"></a><a href="#l207">207</a><td>exports.describe.skip = global.describe.skip;<tr><td><a id="l208"></a><a href="#l208">208</a><td><tr><td><a id="l209"></a><a href="#l209">209</a><td>/**<tr><td><a id="l210"></a><a href="#l210">210</a><td> * Register a function to call after the current suite finishes.<tr><td><a id="l211"></a><a href="#l211">211</a><td> * @param {function()} fn .<tr><td><a id="l212"></a><a href="#l212">212</a><td> */<tr><td><a id="l213"></a><a href="#l213">213</a><td>exports.after = wrapped(global.after);<tr><td><a id="l214"></a><a href="#l214">214</a><td><tr><td><a id="l215"></a><a href="#l215">215</a><td>/**<tr><td><a id="l216"></a><a href="#l216">216</a><td> * Register a function to call after each test in a suite.<tr><td><a id="l217"></a><a href="#l217">217</a><td> * @param {function()} fn .<tr><td><a id="l218"></a><a href="#l218">218</a><td> */<tr><td><a id="l219"></a><a href="#l219">219</a><td>exports.afterEach = wrapped(global.afterEach);<tr><td><a id="l220"></a><a href="#l220">220</a><td><tr><td><a id="l221"></a><a href="#l221">221</a><td>/**<tr><td><a id="l222"></a><a href="#l222">222</a><td> * Register a function to call before the current suite starts.<tr><td><a id="l223"></a><a href="#l223">223</a><td> * @param {function()} fn .<tr><td><a id="l224"></a><a href="#l224">224</a><td> */<tr><td><a id="l225"></a><a href="#l225">225</a><td>exports.before = wrapped(global.before);<tr><td><a id="l226"></a><a href="#l226">226</a><td><tr><td><a id="l227"></a><a href="#l227">227</a><td>/**<tr><td><a id="l228"></a><a href="#l228">228</a><td> * Register a function to call before each test in a suite.<tr><td><a id="l229"></a><a href="#l229">229</a><td> * @param {function()} fn .<tr><td><a id="l230"></a><a href="#l230">230</a><td> */<tr><td><a id="l231"></a><a href="#l231">231</a><td>exports.beforeEach = wrapped(global.beforeEach);<tr><td><a id="l232"></a><a href="#l232">232</a><td><tr><td><a id="l233"></a><a href="#l233">233</a><td>/**<tr><td><a id="l234"></a><a href="#l234">234</a><td> * Add a test to the current suite.<tr><td><a id="l235"></a><a href="#l235">235</a><td> * @param {string} name The test name.<tr><td><a id="l236"></a><a href="#l236">236</a><td> * @param {function()=} fn The test function, or {@code undefined} to define<tr><td><a id="l237"></a><a href="#l237">237</a><td> * a pending test case.<tr><td><a id="l238"></a><a href="#l238">238</a><td> */<tr><td><a id="l239"></a><a href="#l239">239</a><td>exports.it = wrapped(global.it);<tr><td><a id="l240"></a><a href="#l240">240</a><td><tr><td><a id="l241"></a><a href="#l241">241</a><td>/**<tr><td><a id="l242"></a><a href="#l242">242</a><td> * An alias for {@link #it()} that flags the test as the only one that should<tr><td><a id="l243"></a><a href="#l243">243</a><td> * be run within the current suite.<tr><td><a id="l244"></a><a href="#l244">244</a><td> * @param {string} name The test name.<tr><td><a id="l245"></a><a href="#l245">245</a><td> * @param {function()=} fn The test function, or {@code undefined} to define<tr><td><a id="l246"></a><a href="#l246">246</a><td> * a pending test case.<tr><td><a id="l247"></a><a href="#l247">247</a><td> */<tr><td><a id="l248"></a><a href="#l248">248</a><td>exports.iit = exports.it.only = wrapped(global.it.only);<tr><td><a id="l249"></a><a href="#l249">249</a><td><tr><td><a id="l250"></a><a href="#l250">250</a><td>/**<tr><td><a id="l251"></a><a href="#l251">251</a><td> * Adds a test to the current suite while suppressing it so it is not run.<tr><td><a id="l252"></a><a href="#l252">252</a><td> * @param {string} name The test name.<tr><td><a id="l253"></a><a href="#l253">253</a><td> * @param {function()=} fn The test function, or {@code undefined} to define<tr><td><a id="l254"></a><a href="#l254">254</a><td> * a pending test case.<tr><td><a id="l255"></a><a href="#l255">255</a><td> */<tr><td><a id="l256"></a><a href="#l256">256</a><td>exports.xit = exports.it.skip = wrapped(global.xit);<tr><td><a id="l257"></a><a href="#l257">257</a><td><tr><td><a id="l258"></a><a href="#l258">258</a><td>exports.ignore = ignore;</table></div></article><nav><h3><a href="../../index.html" tabindex="2">Overview</a></h3><div><input type="checkbox" id="nav-modules" checked/><label for="nav-modules"><h3><span class="selectable" tabindex="2">Modules</span></h3></label><div id="nav-modules-view"></div></div><div><input type="checkbox" id="nav-types" checked/><label for="nav-types"><h3><span class="selectable" tabindex="2">Types</span></h3></label><div id="nav-types-view"></div></div><h3><a href="../../Changes.html" tabindex="2">Changes</a></h3></nav></main><footer><div><a href="https://github.com/jleyba/js-dossier">Generated by dossier</a></div></footer><script src="../../types.js"></script><script src="../../dossier.js"></script>
package/docs/types.js DELETED
@@ -1 +0,0 @@
1
- var TYPES = {"types":[{"name":"bot","href":"namespace_bot.html","namespace":true,"interface":false},{"name":"bot.Error","href":"class_bot_Error.html","namespace":false,"interface":false,"members":["code","isAutomationError","state","toString"]},{"name":"bot.Error.State","href":"enum_bot_Error_State.html","namespace":false,"interface":false},{"name":"bot.ErrorCode","href":"enum_bot_ErrorCode.html","namespace":false,"interface":false},{"name":"bot.json","href":"namespace_bot_json.html","namespace":true,"interface":false,"statics":["NATIVE_JSON","parse","stringify"]},{"name":"bot.response","href":"namespace_bot_response.html","namespace":true,"interface":false,"statics":["checkResponse","createErrorResponse","createResponse","isResponseObject"]},{"name":"bot.response.ResponseObject","href":"namespace_bot_response.html#response.ResponseObject"},{"name":"bot.userAgent","href":"namespace_bot_userAgent.html","namespace":true,"interface":false,"statics":["ANDROID_PRE_GINGERBREAD","ANDROID_PRE_ICECREAMSANDWICH","FIREFOX_EXTENSION","IE_DOC_10","IE_DOC_9","IE_DOC_PRE10","IE_DOC_PRE8","IE_DOC_PRE9","IOS","MOBILE","SAFARI_6","WINDOWS_PHONE","isEngineVersion","isProductVersion"]},{"name":"webdriver","href":"namespace_webdriver.html","namespace":true,"interface":false},{"name":"webdriver.ProxyConfig","href":"namespace_webdriver.html#webdriver.ProxyConfig"},{"name":"webdriver.ActionSequence","href":"class_webdriver_ActionSequence.html","namespace":false,"interface":false,"members":["click","doubleClick","dragAndDrop","keyDown","keyUp","mouseDown","mouseMove","mouseUp","perform","sendKeys"]},{"name":"webdriver.Alert","href":"class_webdriver_Alert.html","namespace":false,"interface":false,"members":["accept","dismiss","getText","sendKeys"]},{"name":"webdriver.AlertPromise","href":"class_webdriver_AlertPromise.html","namespace":false,"interface":false,"members":["accept","cancel","dismiss","getText","isPending","sendKeys","then","thenCatch","thenFinally"]},{"name":"webdriver.Browser","href":"enum_webdriver_Browser.html","namespace":false,"interface":false},{"name":"webdriver.Button","href":"enum_webdriver_Button.html","namespace":false,"interface":false},{"name":"webdriver.By","href":"namespace_webdriver_By.html","namespace":true,"interface":false,"statics":["className","css","id","js","linkText","name","partialLinkText","tagName","xpath"]},{"name":"webdriver.By.Hash","href":"namespace_webdriver_By.html#By.Hash"},{"name":"webdriver.Capabilities","href":"class_webdriver_Capabilities.html","namespace":false,"interface":false,"statics":["Capabilities.android","Capabilities.chrome","Capabilities.firefox","Capabilities.htmlunit","Capabilities.htmlunitwithjs","Capabilities.ie","Capabilities.ipad","Capabilities.iphone","Capabilities.opera","Capabilities.phantomjs","Capabilities.safari"],"members":["get","has","merge","serialize","set","setAlertBehavior","setEnableNativeEvents","setLoggingPrefs","setProxy","setScrollBehavior"]},{"name":"webdriver.Capability","href":"enum_webdriver_Capability.html","namespace":false,"interface":false},{"name":"webdriver.Command","href":"class_webdriver_Command.html","namespace":false,"interface":false,"members":["getName","getParameter","getParameters","setParameter","setParameters"]},{"name":"webdriver.CommandExecutor","href":"interface_webdriver_CommandExecutor.html","namespace":true,"interface":true,"members":["execute"]},{"name":"webdriver.CommandName","href":"enum_webdriver_CommandName.html","namespace":false,"interface":false},{"name":"webdriver.EventEmitter","href":"class_webdriver_EventEmitter.html","namespace":false,"interface":false,"members":["addListener","emit","listeners","on","once","removeAllListeners","removeListener"]},{"name":"webdriver.FileDetector","href":"class_webdriver_FileDetector.html","namespace":false,"interface":false,"members":["handleFile"]},{"name":"webdriver.Key","href":"enum_webdriver_Key.html","namespace":false,"interface":false,"statics":["Key.chord"]},{"name":"webdriver.Locator","href":"class_webdriver_Locator.html","namespace":false,"interface":false,"statics":["Locator.Strategy","Locator.checkLocator"],"members":["using","value","toString"]},{"name":"webdriver.Serializable","href":"class_webdriver_Serializable.html","namespace":false,"interface":false,"members":["serialize"]},{"name":"webdriver.Session","href":"class_webdriver_Session.html","namespace":false,"interface":false,"members":["getCapabilities","getCapability","getId","toJSON"]},{"name":"webdriver.TouchSequence","href":"class_webdriver_TouchSequence.html","namespace":false,"interface":false,"members":["doubleTap","flick","flickElement","longPress","move","perform","release","scroll","scrollFromElement","tap","tapAndHold"]},{"name":"webdriver.UnhandledAlertError","href":"class_webdriver_UnhandledAlertError.html","namespace":false,"interface":false,"members":["getAlertText"]},{"name":"webdriver.WebDriver","href":"class_webdriver_WebDriver.html","namespace":false,"interface":false,"statics":["WebDriver.attachToSession","WebDriver.createSession"],"members":["actions","call","close","controlFlow","executeAsyncScript","executeScript","findElement","findElements","get","getAllWindowHandles","getCapabilities","getCurrentUrl","getPageSource","getSession","getTitle","getWindowHandle","isElementPresent","manage","navigate","quit","schedule","setFileDetector","sleep","switchTo","takeScreenshot","touchActions","wait"]},{"name":"webdriver.WebDriver.Logs","href":"class_webdriver_WebDriver_Logs.html","namespace":false,"interface":false,"members":["get","getAvailableLogTypes"]},{"name":"webdriver.WebDriver.Navigation","href":"class_webdriver_WebDriver_Navigation.html","namespace":false,"interface":false,"members":["back","forward","refresh","to"]},{"name":"webdriver.WebDriver.Options","href":"class_webdriver_WebDriver_Options.html","namespace":false,"interface":false,"members":["addCookie","deleteAllCookies","deleteCookie","getCookie","getCookies","logs","timeouts","window"]},{"name":"webdriver.WebDriver.Options.Cookie","href":"class_webdriver_WebDriver_Options.html#Options.Cookie"},{"name":"webdriver.WebDriver.TargetLocator","href":"class_webdriver_WebDriver_TargetLocator.html","namespace":false,"interface":false,"members":["activeElement","alert","defaultContent","frame","window"]},{"name":"webdriver.WebDriver.Timeouts","href":"class_webdriver_WebDriver_Timeouts.html","namespace":false,"interface":false,"members":["implicitlyWait","pageLoadTimeout","setScriptTimeout"]},{"name":"webdriver.WebDriver.Window","href":"class_webdriver_WebDriver_Window.html","namespace":false,"interface":false,"members":["getPosition","getSize","maximize","setPosition","setSize"]},{"name":"webdriver.WebElement","href":"class_webdriver_WebElement.html","namespace":false,"interface":false,"statics":["WebElement.ELEMENT_KEY","WebElement.equals"],"members":["clear","click","findElement","findElements","getAttribute","getCssValue","getDriver","getId","getInnerHtml","getLocation","getOuterHtml","getRawId","getSize","getTagName","getText","isDisplayed","isElementPresent","isEnabled","isSelected","sendKeys","serialize","submit","takeScreenshot"]},{"name":"webdriver.WebElement.Id","href":"class_webdriver_WebElement.html#WebElement.Id"},{"name":"webdriver.WebElementPromise","href":"class_webdriver_WebElementPromise.html","namespace":false,"interface":false,"members":["cancel","getId","isPending","then","thenCatch","thenFinally"]},{"name":"webdriver.http","href":"namespace_webdriver_http.html","namespace":true,"interface":false},{"name":"webdriver.http.Client","href":"interface_webdriver_http_Client.html","namespace":true,"interface":true,"members":["send"]},{"name":"webdriver.http.Executor","href":"class_webdriver_http_Executor.html","namespace":false,"interface":false,"members":["defineCommand","execute"]},{"name":"webdriver.http.Request","href":"class_webdriver_http_Request.html","namespace":false,"interface":false,"members":["data","headers","method","path","toString"]},{"name":"webdriver.http.Response","href":"class_webdriver_http_Response.html","namespace":false,"interface":false,"statics":["Response.fromXmlHttpRequest"],"members":["body","headers","status","toString"]},{"name":"webdriver.logging","href":"namespace_webdriver_logging.html","namespace":true,"interface":false,"statics":["addConsoleHandler","getLevel","getLogger","installConsoleHandler","removeConsoleHandler"]},{"name":"webdriver.logging.Entry","href":"class_webdriver_logging_Entry.html","namespace":false,"interface":false,"statics":["Entry.fromClosureLogRecord"],"members":["level","message","timestamp","type","toJSON"]},{"name":"webdriver.logging.Level","href":"class_webdriver_logging_Level.html","namespace":false,"interface":false,"statics":["Level.ALL","Level.CONFIG","Level.DEBUG","Level.FINE","Level.FINER","Level.FINEST","Level.INFO","Level.OFF","Level.PREDEFINED_LEVELS","Level.SEVERE","Level.SHOUT","Level.WARNING","Level.getPredefinedLevel","Level.getPredefinedLevelByValue"],"members":["name","value","toString"]},{"name":"webdriver.logging.LogRecord","href":"class_webdriver_logging_LogRecord.html","namespace":false,"interface":false,"statics":["LogRecord.ENABLE_SEQUENCE_NUMBERS"],"members":["getException","getLevel","getLoggerName","getMessage","getMillis","getSequenceNumber","reset","setException","setLevel","setLoggerName","setMessage","setMillis"]},{"name":"webdriver.logging.Logger","href":"class_webdriver_logging_Logger.html","namespace":false,"interface":false,"statics":["Logger.ENABLE_HIERARCHY","Logger.ROOT_LOGGER_NAME","Logger.getLogger","Logger.logToProfilers"],"members":["addHandler","config","fine","finer","finest","getChildren","getEffectiveLevel","getLevel","getLogRecord","getName","getParent","info","isLoggable","log","logRecord","removeHandler","setLevel","severe","shout","warning"]},{"name":"webdriver.logging.Preferences","href":"class_webdriver_logging_Preferences.html","namespace":false,"interface":false,"members":["setLevel","toJSON"]},{"name":"webdriver.logging.Type","href":"enum_webdriver_logging_Type.html","namespace":false,"interface":false},{"name":"webdriver.promise","href":"namespace_webdriver_promise.html","namespace":true,"interface":false,"statics":["LONG_STACK_TRACES","all","asap","captureStackTrace","checkedNodeCall","consume","controlFlow","createFlow","defer","delayed","filter","fulfilled","fullyResolved","isGenerator","isPromise","map","rejected","setDefaultFlow","when"]},{"name":"webdriver.promise.CancellationError","href":"class_webdriver_promise_CancellationError.html","namespace":false,"interface":false,"statics":["CancellationError.wrap"]},{"name":"webdriver.promise.ControlFlow","href":"class_webdriver_promise_ControlFlow.html","namespace":false,"interface":false,"members":["async","execute","getSchedule","isIdle","reset","setPropagateUnhandledRejections","timeout","toString","wait"]},{"name":"webdriver.promise.ControlFlow.EventType","href":"enum_webdriver_promise_ControlFlow_EventType.html","namespace":false,"interface":false},{"name":"webdriver.promise.Deferred","href":"class_webdriver_promise_Deferred.html","namespace":false,"interface":false,"members":["promise","cancel","fulfill","isPending","reject","then","thenCatch","thenFinally"]},{"name":"webdriver.promise.MultipleUnhandledRejectionError","href":"class_webdriver_promise_MultipleUnhandledRejectionError.html","namespace":false,"interface":false,"members":["errors"]},{"name":"webdriver.promise.Promise","href":"class_webdriver_promise_Promise.html","namespace":false,"interface":false,"members":["cancel","isPending","then","thenCatch","thenFinally","toString"]},{"name":"webdriver.promise.Thenable","href":"interface_webdriver_promise_Thenable.html","namespace":true,"interface":true,"statics":["Thenable.addImplementation","Thenable.isImplementation"],"members":["cancel","isPending","then","thenCatch","thenFinally"]},{"name":"webdriver.stacktrace","href":"namespace_webdriver_stacktrace.html","namespace":true,"interface":false,"statics":["BROWSER_SUPPORTED","format","get","getStack"]},{"name":"webdriver.stacktrace.Frame","href":"class_webdriver_stacktrace_Frame.html","namespace":false,"interface":false,"members":["column","getColumn","getLine","getName","getUrl","isAnonymous","toString"]},{"name":"webdriver.stacktrace.Snapshot","href":"class_webdriver_stacktrace_Snapshot.html","namespace":false,"interface":false,"members":["getStacktrace"]},{"name":"webdriver.testing","href":"namespace_webdriver_testing.html","namespace":true,"interface":false},{"name":"webdriver.testing.Assertion","href":"class_webdriver_testing_Assertion.html","namespace":false,"interface":false,"members":["is","not","apply","closeTo","contains","endsWith","equalTo","greaterThan","greaterThanEqualTo","instanceOf","isFalse","isNull","isNullOrUndefined","isTrue","isUndefined","lessThan","lessThanEqualTo","matches","startsWith"]},{"name":"webdriver.testing.Assertion.DelegatingMatcher_","href":"class_webdriver_testing_Assertion_DelegatingMatcher_.html","namespace":false,"interface":false,"members":["describe","matches"]},{"name":"webdriver.testing.ContainsMatcher","href":"class_webdriver_testing_ContainsMatcher.html","namespace":false,"interface":false,"members":["describe","matches"]},{"name":"webdriver.testing.NegatedAssertion","href":"class_webdriver_testing_NegatedAssertion.html","namespace":false,"interface":false,"members":["value","apply"]},{"name":"webdriver.testing.assert","href":"namespace_webdriver_testing_assert.html","namespace":true,"interface":false,"statics":["register"]},{"name":"webdriver.testing.asserts","href":"namespace_webdriver_testing_asserts.html","namespace":true,"interface":false,"statics":["assertThat","equalTo"]},{"name":"webdriver.until","href":"namespace_webdriver_until.html","namespace":true,"interface":false,"statics":["ableToSwitchToFrame","alertIsPresent","elementIsDisabled","elementIsEnabled","elementIsNotSelected","elementIsNotVisible","elementIsSelected","elementIsVisible","elementLocated","elementTextContains","elementTextIs","elementTextMatches","elementsLocated","stalenessOf","titleContains","titleIs","titleMatches"]},{"name":"webdriver.until.Condition","href":"class_webdriver_until_Condition.html","namespace":false,"interface":false,"members":["description","fn"]}],"modules":[{"name":"selenium-webdriver","href":"module_selenium-webdriver.html","types":[{"name":"WebDriver","href":"module_selenium-webdriver_class_WebDriver.html","namespace":false,"interface":false},{"name":"Serializable","href":"module_selenium-webdriver_class_Serializable.html","namespace":false,"interface":false},{"name":"Capability","href":"module_selenium-webdriver_enum_Capability.html","namespace":false,"interface":false},{"name":"ActionSequence","href":"module_selenium-webdriver_class_ActionSequence.html","namespace":false,"interface":false},{"name":"Builder","href":"module_selenium-webdriver_class_Builder.html","namespace":false,"interface":false},{"name":"promise","href":"module_selenium-webdriver_namespace_promise.html","namespace":true,"interface":false},{"name":"WebElement","href":"module_selenium-webdriver_class_WebElement.html","namespace":false,"interface":false},{"name":"error","href":"module_selenium-webdriver_namespace_error.html","namespace":true,"interface":false},{"name":"WebElementPromise","href":"module_selenium-webdriver_class_WebElementPromise.html","namespace":false,"interface":false},{"name":"FileDetector","href":"module_selenium-webdriver_class_FileDetector.html","namespace":false,"interface":false},{"name":"stacktrace","href":"module_selenium-webdriver_namespace_stacktrace.html","namespace":true,"interface":false},{"name":"Button","href":"module_selenium-webdriver_enum_Button.html","namespace":false,"interface":false},{"name":"Command","href":"module_selenium-webdriver_class_Command.html","namespace":false,"interface":false},{"name":"EventEmitter","href":"module_selenium-webdriver_class_EventEmitter.html","namespace":false,"interface":false},{"name":"Capabilities","href":"module_selenium-webdriver_class_Capabilities.html","namespace":false,"interface":false},{"name":"By","href":"module_selenium-webdriver_namespace_By.html","namespace":true,"interface":false},{"name":"logging","href":"module_selenium-webdriver_namespace_logging.html","namespace":true,"interface":false},{"name":"until","href":"module_selenium-webdriver_namespace_until.html","namespace":true,"interface":false},{"name":"CommandName","href":"module_selenium-webdriver_enum_CommandName.html","namespace":false,"interface":false},{"name":"Key","href":"module_selenium-webdriver_enum_Key.html","namespace":false,"interface":false},{"name":"Browser","href":"module_selenium-webdriver_enum_Browser.html","namespace":false,"interface":false},{"name":"Session","href":"module_selenium-webdriver_class_Session.html","namespace":false,"interface":false}]},{"name":"selenium-webdriver/_base","href":"module_selenium-webdriver__base.html","statics":["closure","exportPublicApi","isDevMode","require"],"types":[{"name":"Context","href":"module_selenium-webdriver__base_class_Context.html","namespace":false,"interface":false,"members":["closure"]}]},{"name":"selenium-webdriver/builder","href":"module_selenium-webdriver_builder.html","types":[{"name":"Builder","href":"module_selenium-webdriver_builder_class_Builder.html","namespace":false,"interface":false,"members":["build","disableEnvironmentOverrides","forBrowser","getCapabilities","getServerUrl","getWebDriverProxy","setAlertBehavior","setChromeOptions","setControlFlow","setEnableNativeEvents","setFirefoxOptions","setIeOptions","setLoggingPrefs","setOperaOptions","setProxy","setSafariOptions","setScrollBehavior","usingServer","usingWebDriverProxy","withCapabilities"]}]},{"name":"selenium-webdriver/chrome","href":"module_selenium-webdriver_chrome.html","statics":["getDefaultService","setDefaultService"],"types":[{"name":"Options","href":"module_selenium-webdriver_chrome_class_Options.html","namespace":false,"interface":false,"statics":["Options.fromCapabilities"],"members":["addArguments","addExtensions","androidActivity","androidChrome","androidDeviceSerial","androidPackage","androidProcess","androidUseRunningApp","detachDriver","excludeSwitches","serialize","setChromeBinaryPath","setChromeLogFile","setChromeMinidumpPath","setLocalState","setLoggingPrefs","setMobileEmulation","setPerfLoggingPrefs","setProxy","setUserPreferences","toCapabilities"]},{"name":"Driver","href":"module_selenium-webdriver_chrome_class_Driver.html","namespace":false,"interface":false,"members":["launchApp","setFileDetector"]},{"name":"ServiceBuilder","href":"module_selenium-webdriver_chrome_class_ServiceBuilder.html","namespace":false,"interface":false,"members":["build","enableVerboseLogging","loggingTo","setAdbPort","setNumHttpThreads","setStdio","setUrlBasePath","usingPort","withEnvironment"]}]},{"name":"selenium-webdriver/error","href":"module_selenium-webdriver_error.html","types":[{"name":"Error","href":"module_selenium-webdriver_error_class_Error.html","namespace":false,"interface":false},{"name":"ErrorCode","href":"module_selenium-webdriver_error_enum_ErrorCode.html","namespace":false,"interface":false}]},{"name":"selenium-webdriver/executors","href":"module_selenium-webdriver_executors.html","statics":["createExecutor"],"types":[{"name":"DeferredExecutor","href":"module_selenium-webdriver_executors_class_DeferredExecutor.html","namespace":false,"interface":false,"members":["execute"]}]},{"name":"selenium-webdriver/firefox","href":"module_selenium-webdriver_firefox.html","types":[{"name":"Options","href":"module_selenium-webdriver_firefox_class_Options.html","namespace":false,"interface":false,"members":["setBinary","setLoggingPreferences","setProfile","setProxy","toCapabilities"]},{"name":"Driver","href":"module_selenium-webdriver_firefox_class_Driver.html","namespace":false,"interface":false,"members":["quit","setFileDetector"]},{"name":"Binary","href":"module_selenium-webdriver_firefox_class_Binary.html","namespace":false,"interface":false},{"name":"Profile","href":"module_selenium-webdriver_firefox_class_Profile.html","namespace":false,"interface":false}]},{"name":"selenium-webdriver/firefox/binary","href":"module_selenium-webdriver_firefox_binary.html","types":[{"name":"Binary","href":"module_selenium-webdriver_firefox_binary_class_Binary.html","namespace":false,"interface":false,"members":["addArguments","launch","serialize"]}]},{"name":"selenium-webdriver/firefox/extension","href":"module_selenium-webdriver_firefox_extension.html","statics":["install"]},{"name":"selenium-webdriver/firefox/profile","href":"module_selenium-webdriver_firefox_profile.html","statics":["decode","loadUserPrefs"],"types":[{"name":"Profile","href":"module_selenium-webdriver_firefox_profile_class_Profile.html","namespace":false,"interface":false,"members":["acceptUntrustedCerts","addExtension","assumeUntrustedCertIssuer","encode","getPort","getPreference","nativeEventsEnabled","serialize","setAcceptUntrustedCerts","setAssumeUntrustedCertIssuer","setNativeEventsEnabled","setPort","setPreference","writeToDisk"]}]},{"name":"selenium-webdriver/http","href":"module_selenium-webdriver_http.html","types":[{"name":"Response","href":"module_selenium-webdriver_http_class_Response.html","namespace":false,"interface":false},{"name":"Executor","href":"module_selenium-webdriver_http_class_Executor.html","namespace":false,"interface":false},{"name":"HttpClient","href":"module_selenium-webdriver_http_class_HttpClient.html","namespace":false,"interface":false,"members":["send"]},{"name":"Request","href":"module_selenium-webdriver_http_class_Request.html","namespace":false,"interface":false}]},{"name":"selenium-webdriver/http/util","href":"module_selenium-webdriver_http_util.html","statics":["getStatus","waitForServer","waitForUrl"]},{"name":"selenium-webdriver/ie","href":"module_selenium-webdriver_ie.html","types":[{"name":"Options","href":"module_selenium-webdriver_ie_class_Options.html","namespace":false,"interface":false,"statics":["Options.fromCapabilities"],"members":["addArguments","browserAttachTimeout","enableElementCacheCleanup","enablePersistentHover","ensureCleanSession","forceCreateProcessApi","ignoreZoomSetting","initialBrowserUrl","introduceFlakinessByIgnoringProtectedModeSettings","requireWindowFocus","setExtractPath","setHost","setLogFile","setLogLevel","setProxy","silent","toCapabilities","usePerProcessProxy"]},{"name":"Driver","href":"module_selenium-webdriver_ie_class_Driver.html","namespace":false,"interface":false,"members":["setFileDetector"]},{"name":"Level","href":"module_selenium-webdriver_ie_enum_Level.html","namespace":false,"interface":false}]},{"name":"selenium-webdriver/io","href":"module_selenium-webdriver_io.html","statics":["copy","copyDir","exists","findInPath","rmDir","tmpDir","tmpFile","unlink"]},{"name":"selenium-webdriver/io/exec","href":"module_selenium-webdriver_io_exec.html"},{"name":"selenium-webdriver/net","href":"module_selenium-webdriver_net.html","statics":["getAddress","getLoopbackAddress"]},{"name":"selenium-webdriver/net/portprober","href":"module_selenium-webdriver_net_portprober.html","statics":["findFreePort","isFree"]},{"name":"selenium-webdriver/opera","href":"module_selenium-webdriver_opera.html","statics":["getDefaultService","setDefaultService"],"types":[{"name":"Options","href":"module_selenium-webdriver_opera_class_Options.html","namespace":false,"interface":false,"statics":["Options.fromCapabilities"],"members":["addArguments","addExtensions","serialize","setLoggingPrefs","setOperaBinaryPath","setProxy","toCapabilities"]},{"name":"Driver","href":"module_selenium-webdriver_opera_class_Driver.html","namespace":false,"interface":false,"members":["setFileDetector"]},{"name":"ServiceBuilder","href":"module_selenium-webdriver_opera_class_ServiceBuilder.html","namespace":false,"interface":false,"members":["build","enableVerboseLogging","loggingTo","setStdio","silent","usingPort","withEnvironment"]}]},{"name":"selenium-webdriver/phantomjs","href":"module_selenium-webdriver_phantomjs.html","types":[{"name":"Driver","href":"module_selenium-webdriver_phantomjs_class_Driver.html","namespace":false,"interface":false,"members":["executePhantomJS","setFileDetector"]}]},{"name":"selenium-webdriver/proxy","href":"module_selenium-webdriver_proxy.html","statics":["direct","manual","pac","system"]},{"name":"selenium-webdriver/remote","href":"module_selenium-webdriver_remote.html","types":[{"name":"FileDetector","href":"module_selenium-webdriver_remote_class_FileDetector.html","namespace":false,"interface":false,"members":["handleFile"]},{"name":"DriverService","href":"module_selenium-webdriver_remote_class_DriverService.html","namespace":false,"interface":false,"statics":["DriverService.DEFAULT_START_TIMEOUT_MS"],"members":["address","isRunning","kill","start","stop"]},{"name":"SeleniumServer","href":"module_selenium-webdriver_remote_class_SeleniumServer.html","namespace":false,"interface":false},{"name":"SeleniumServer.Options","href":"module_selenium-webdriver_remote_class_SeleniumServer.html#SeleniumServer.Options"}]},{"name":"selenium-webdriver/safari","href":"module_selenium-webdriver_safari.html","types":[{"name":"Options","href":"module_selenium-webdriver_safari_class_Options.html","namespace":false,"interface":false,"statics":["Options.fromCapabilities"],"members":["serialize","setCleanSession","setLoggingPrefs","toCapabilities"]},{"name":"Driver","href":"module_selenium-webdriver_safari_class_Driver.html","namespace":false,"interface":false}]},{"name":"selenium-webdriver/testing","href":"module_selenium-webdriver_testing.html","statics":["after","afterEach","before","beforeEach","describe","ignore","iit","it","xdescribe","xit"]},{"name":"selenium-webdriver/testing/assert","href":"module_selenium-webdriver_testing_assert.html","statics":["register"]}]};