UrgentcareCLI 0.1.0 → 0.1.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (308) hide show
  1. checksums.yaml +4 -4
  2. data/Gemfile +3 -0
  3. data/Gemfile.lock +60 -25
  4. data/Notes +1 -1
  5. data/README.md +5 -5
  6. data/Rakefile +2 -0
  7. data/UrgentCare.gemspec +3 -3
  8. data/background.jpg +0 -0
  9. data/lib/UrgentCare.rb +3 -0
  10. data/lib/UrgentCare/CLI.rb +6 -2
  11. data/lib/UrgentCare/version.rb +1 -1
  12. data/lib/Urgentcare/Scraper.rb +65 -23
  13. data/node_modules/.bin/rimraf +1 -0
  14. data/node_modules/.package-lock.json +250 -0
  15. data/node_modules/balanced-match/.github/FUNDING.yml +2 -0
  16. data/node_modules/balanced-match/LICENSE.md +21 -0
  17. data/node_modules/balanced-match/README.md +97 -0
  18. data/node_modules/balanced-match/index.js +62 -0
  19. data/node_modules/balanced-match/package.json +48 -0
  20. data/node_modules/brace-expansion/LICENSE +21 -0
  21. data/node_modules/brace-expansion/README.md +129 -0
  22. data/node_modules/brace-expansion/index.js +201 -0
  23. data/node_modules/brace-expansion/package.json +47 -0
  24. data/node_modules/concat-map/.travis.yml +4 -0
  25. data/node_modules/concat-map/LICENSE +18 -0
  26. data/node_modules/concat-map/README.markdown +62 -0
  27. data/node_modules/concat-map/example/map.js +6 -0
  28. data/node_modules/concat-map/index.js +13 -0
  29. data/node_modules/concat-map/package.json +43 -0
  30. data/node_modules/concat-map/test/map.js +39 -0
  31. data/node_modules/core-util-is/LICENSE +19 -0
  32. data/node_modules/core-util-is/README.md +3 -0
  33. data/node_modules/core-util-is/float.patch +604 -0
  34. data/node_modules/core-util-is/lib/util.js +107 -0
  35. data/node_modules/core-util-is/package.json +32 -0
  36. data/node_modules/core-util-is/test.js +68 -0
  37. data/node_modules/fs.realpath/LICENSE +43 -0
  38. data/node_modules/fs.realpath/README.md +33 -0
  39. data/node_modules/fs.realpath/index.js +66 -0
  40. data/node_modules/fs.realpath/old.js +303 -0
  41. data/node_modules/fs.realpath/package.json +26 -0
  42. data/node_modules/glob/LICENSE +21 -0
  43. data/node_modules/glob/README.md +375 -0
  44. data/node_modules/glob/changelog.md +67 -0
  45. data/node_modules/glob/common.js +234 -0
  46. data/node_modules/glob/glob.js +788 -0
  47. data/node_modules/glob/package.json +51 -0
  48. data/node_modules/glob/sync.js +484 -0
  49. data/node_modules/immediate/LICENSE.txt +20 -0
  50. data/node_modules/immediate/README.md +93 -0
  51. data/node_modules/immediate/dist/immediate.js +75 -0
  52. data/node_modules/immediate/dist/immediate.min.js +1 -0
  53. data/node_modules/immediate/lib/browser.js +69 -0
  54. data/node_modules/immediate/lib/index.js +73 -0
  55. data/node_modules/immediate/package.json +42 -0
  56. data/node_modules/inflight/LICENSE +15 -0
  57. data/node_modules/inflight/README.md +37 -0
  58. data/node_modules/inflight/inflight.js +54 -0
  59. data/node_modules/inflight/package.json +29 -0
  60. data/node_modules/inherits/LICENSE +16 -0
  61. data/node_modules/inherits/README.md +42 -0
  62. data/node_modules/inherits/inherits.js +9 -0
  63. data/node_modules/inherits/inherits_browser.js +27 -0
  64. data/node_modules/inherits/package.json +29 -0
  65. data/node_modules/isarray/.npmignore +1 -0
  66. data/node_modules/isarray/.travis.yml +4 -0
  67. data/node_modules/isarray/Makefile +6 -0
  68. data/node_modules/isarray/README.md +60 -0
  69. data/node_modules/isarray/component.json +19 -0
  70. data/node_modules/isarray/index.js +5 -0
  71. data/node_modules/isarray/package.json +45 -0
  72. data/node_modules/isarray/test.js +20 -0
  73. data/node_modules/jszip/.codeclimate.yml +16 -0
  74. data/node_modules/jszip/.editorconfig +8 -0
  75. data/node_modules/jszip/.jshintignore +1 -0
  76. data/node_modules/jszip/.jshintrc +21 -0
  77. data/node_modules/jszip/.travis.yml +17 -0
  78. data/node_modules/jszip/CHANGES.md +163 -0
  79. data/node_modules/jszip/LICENSE.markdown +651 -0
  80. data/node_modules/jszip/README.markdown +35 -0
  81. data/node_modules/jszip/dist/jszip.js +30 -0
  82. data/node_modules/jszip/dist/jszip.min.js +13 -0
  83. data/node_modules/jszip/index.d.ts +270 -0
  84. data/node_modules/jszip/lib/base64.js +106 -0
  85. data/node_modules/jszip/lib/compressedObject.js +74 -0
  86. data/node_modules/jszip/lib/compressions.js +14 -0
  87. data/node_modules/jszip/lib/crc32.js +77 -0
  88. data/node_modules/jszip/lib/defaults.js +11 -0
  89. data/node_modules/jszip/lib/external.js +19 -0
  90. data/node_modules/jszip/lib/flate.js +85 -0
  91. data/node_modules/jszip/lib/generate/ZipFileWorker.js +540 -0
  92. data/node_modules/jszip/lib/generate/index.js +57 -0
  93. data/node_modules/jszip/lib/index.js +52 -0
  94. data/node_modules/jszip/lib/license_header.js +11 -0
  95. data/node_modules/jszip/lib/load.js +81 -0
  96. data/node_modules/jszip/lib/nodejs/NodejsStreamInputAdapter.js +74 -0
  97. data/node_modules/jszip/lib/nodejs/NodejsStreamOutputAdapter.js +42 -0
  98. data/node_modules/jszip/lib/nodejsUtils.js +57 -0
  99. data/node_modules/jszip/lib/object.js +389 -0
  100. data/node_modules/jszip/lib/readable-stream-browser.js +9 -0
  101. data/node_modules/jszip/lib/reader/ArrayReader.js +57 -0
  102. data/node_modules/jszip/lib/reader/DataReader.js +116 -0
  103. data/node_modules/jszip/lib/reader/NodeBufferReader.js +19 -0
  104. data/node_modules/jszip/lib/reader/StringReader.js +38 -0
  105. data/node_modules/jszip/lib/reader/Uint8ArrayReader.js +22 -0
  106. data/node_modules/jszip/lib/reader/readerFor.js +28 -0
  107. data/node_modules/jszip/lib/signature.js +7 -0
  108. data/node_modules/jszip/lib/stream/ConvertWorker.js +26 -0
  109. data/node_modules/jszip/lib/stream/Crc32Probe.js +24 -0
  110. data/node_modules/jszip/lib/stream/DataLengthProbe.js +29 -0
  111. data/node_modules/jszip/lib/stream/DataWorker.js +116 -0
  112. data/node_modules/jszip/lib/stream/GenericWorker.js +263 -0
  113. data/node_modules/jszip/lib/stream/StreamHelper.js +212 -0
  114. data/node_modules/jszip/lib/support.js +38 -0
  115. data/node_modules/jszip/lib/utf8.js +275 -0
  116. data/node_modules/jszip/lib/utils.js +476 -0
  117. data/node_modules/jszip/lib/zipEntries.js +262 -0
  118. data/node_modules/jszip/lib/zipEntry.js +294 -0
  119. data/node_modules/jszip/lib/zipObject.js +133 -0
  120. data/node_modules/jszip/package.json +63 -0
  121. data/node_modules/jszip/vendor/FileSaver.js +247 -0
  122. data/node_modules/lie/README.md +62 -0
  123. data/node_modules/lie/dist/lie.js +350 -0
  124. data/node_modules/lie/dist/lie.min.js +1 -0
  125. data/node_modules/lie/dist/lie.polyfill.js +358 -0
  126. data/node_modules/lie/dist/lie.polyfill.min.js +1 -0
  127. data/node_modules/lie/lib/browser.js +273 -0
  128. data/node_modules/lie/lib/index.js +298 -0
  129. data/node_modules/lie/license.md +7 -0
  130. data/node_modules/lie/lie.d.ts +244 -0
  131. data/node_modules/lie/package.json +69 -0
  132. data/node_modules/lie/polyfill.js +4 -0
  133. data/node_modules/minimatch/LICENSE +15 -0
  134. data/node_modules/minimatch/README.md +209 -0
  135. data/node_modules/minimatch/minimatch.js +923 -0
  136. data/node_modules/minimatch/package.json +30 -0
  137. data/node_modules/once/LICENSE +15 -0
  138. data/node_modules/once/README.md +79 -0
  139. data/node_modules/once/once.js +42 -0
  140. data/node_modules/once/package.json +33 -0
  141. data/node_modules/pako/CHANGELOG.md +164 -0
  142. data/node_modules/pako/LICENSE +21 -0
  143. data/node_modules/pako/README.md +191 -0
  144. data/node_modules/pako/dist/pako.js +6818 -0
  145. data/node_modules/pako/dist/pako.min.js +1 -0
  146. data/node_modules/pako/dist/pako_deflate.js +3997 -0
  147. data/node_modules/pako/dist/pako_deflate.min.js +1 -0
  148. data/node_modules/pako/dist/pako_inflate.js +3300 -0
  149. data/node_modules/pako/dist/pako_inflate.min.js +1 -0
  150. data/node_modules/pako/index.js +14 -0
  151. data/node_modules/pako/lib/deflate.js +400 -0
  152. data/node_modules/pako/lib/inflate.js +423 -0
  153. data/node_modules/pako/lib/utils/common.js +105 -0
  154. data/node_modules/pako/lib/utils/strings.js +187 -0
  155. data/node_modules/pako/lib/zlib/README +59 -0
  156. data/node_modules/pako/lib/zlib/adler32.js +51 -0
  157. data/node_modules/pako/lib/zlib/constants.js +68 -0
  158. data/node_modules/pako/lib/zlib/crc32.js +59 -0
  159. data/node_modules/pako/lib/zlib/deflate.js +1874 -0
  160. data/node_modules/pako/lib/zlib/gzheader.js +58 -0
  161. data/node_modules/pako/lib/zlib/inffast.js +345 -0
  162. data/node_modules/pako/lib/zlib/inflate.js +1556 -0
  163. data/node_modules/pako/lib/zlib/inftrees.js +343 -0
  164. data/node_modules/pako/lib/zlib/messages.js +32 -0
  165. data/node_modules/pako/lib/zlib/trees.js +1222 -0
  166. data/node_modules/pako/lib/zlib/zstream.js +47 -0
  167. data/node_modules/pako/package.json +44 -0
  168. data/node_modules/path-is-absolute/index.js +20 -0
  169. data/node_modules/path-is-absolute/license +21 -0
  170. data/node_modules/path-is-absolute/package.json +43 -0
  171. data/node_modules/path-is-absolute/readme.md +59 -0
  172. data/node_modules/process-nextick-args/index.js +45 -0
  173. data/node_modules/process-nextick-args/license.md +19 -0
  174. data/node_modules/process-nextick-args/package.json +25 -0
  175. data/node_modules/process-nextick-args/readme.md +18 -0
  176. data/node_modules/readable-stream/.travis.yml +34 -0
  177. data/node_modules/readable-stream/CONTRIBUTING.md +38 -0
  178. data/node_modules/readable-stream/GOVERNANCE.md +136 -0
  179. data/node_modules/readable-stream/LICENSE +47 -0
  180. data/node_modules/readable-stream/README.md +58 -0
  181. data/node_modules/readable-stream/doc/wg-meetings/2015-01-30.md +60 -0
  182. data/node_modules/readable-stream/duplex-browser.js +1 -0
  183. data/node_modules/readable-stream/duplex.js +1 -0
  184. data/node_modules/readable-stream/lib/_stream_duplex.js +131 -0
  185. data/node_modules/readable-stream/lib/_stream_passthrough.js +47 -0
  186. data/node_modules/readable-stream/lib/_stream_readable.js +1019 -0
  187. data/node_modules/readable-stream/lib/_stream_transform.js +214 -0
  188. data/node_modules/readable-stream/lib/_stream_writable.js +687 -0
  189. data/node_modules/readable-stream/lib/internal/streams/BufferList.js +79 -0
  190. data/node_modules/readable-stream/lib/internal/streams/destroy.js +74 -0
  191. data/node_modules/readable-stream/lib/internal/streams/stream-browser.js +1 -0
  192. data/node_modules/readable-stream/lib/internal/streams/stream.js +1 -0
  193. data/node_modules/readable-stream/package.json +52 -0
  194. data/node_modules/readable-stream/passthrough.js +1 -0
  195. data/node_modules/readable-stream/readable-browser.js +7 -0
  196. data/node_modules/readable-stream/readable.js +19 -0
  197. data/node_modules/readable-stream/transform.js +1 -0
  198. data/node_modules/readable-stream/writable-browser.js +1 -0
  199. data/node_modules/readable-stream/writable.js +8 -0
  200. data/node_modules/rimraf/LICENSE +15 -0
  201. data/node_modules/rimraf/README.md +101 -0
  202. data/node_modules/rimraf/bin.js +50 -0
  203. data/node_modules/rimraf/package.json +29 -0
  204. data/node_modules/rimraf/rimraf.js +372 -0
  205. data/node_modules/safe-buffer/LICENSE +21 -0
  206. data/node_modules/safe-buffer/README.md +584 -0
  207. data/node_modules/safe-buffer/index.d.ts +187 -0
  208. data/node_modules/safe-buffer/index.js +62 -0
  209. data/node_modules/safe-buffer/package.json +37 -0
  210. data/node_modules/selenium-webdriver/CHANGES.md +1114 -0
  211. data/node_modules/selenium-webdriver/LICENSE +202 -0
  212. data/node_modules/selenium-webdriver/NOTICE +2 -0
  213. data/node_modules/selenium-webdriver/README.md +229 -0
  214. data/node_modules/selenium-webdriver/chrome.js +295 -0
  215. data/node_modules/selenium-webdriver/chromium.js +829 -0
  216. data/node_modules/selenium-webdriver/devtools/CDPConnection.js +35 -0
  217. data/node_modules/selenium-webdriver/edge.js +224 -0
  218. data/node_modules/selenium-webdriver/example/chrome_android.js +45 -0
  219. data/node_modules/selenium-webdriver/example/chrome_mobile_emulation.js +46 -0
  220. data/node_modules/selenium-webdriver/example/firefox_channels.js +84 -0
  221. data/node_modules/selenium-webdriver/example/google_search.js +50 -0
  222. data/node_modules/selenium-webdriver/example/google_search_test.js +70 -0
  223. data/node_modules/selenium-webdriver/example/headless.js +63 -0
  224. data/node_modules/selenium-webdriver/example/logging.js +64 -0
  225. data/node_modules/selenium-webdriver/firefox.js +789 -0
  226. data/node_modules/selenium-webdriver/http/index.js +324 -0
  227. data/node_modules/selenium-webdriver/http/util.js +172 -0
  228. data/node_modules/selenium-webdriver/ie.js +503 -0
  229. data/node_modules/selenium-webdriver/index.js +825 -0
  230. data/node_modules/selenium-webdriver/io/exec.js +162 -0
  231. data/node_modules/selenium-webdriver/io/index.js +348 -0
  232. data/node_modules/selenium-webdriver/io/zip.js +223 -0
  233. data/node_modules/selenium-webdriver/lib/atoms/find-elements.js +123 -0
  234. data/node_modules/selenium-webdriver/lib/atoms/get-attribute.js +101 -0
  235. data/node_modules/selenium-webdriver/lib/atoms/is-displayed.js +101 -0
  236. data/node_modules/selenium-webdriver/lib/atoms/mutation-listener.js +55 -0
  237. data/node_modules/selenium-webdriver/lib/by.js +415 -0
  238. data/node_modules/selenium-webdriver/lib/capabilities.js +553 -0
  239. data/node_modules/selenium-webdriver/lib/command.js +206 -0
  240. data/node_modules/selenium-webdriver/lib/error.js +605 -0
  241. data/node_modules/selenium-webdriver/lib/http.js +704 -0
  242. data/node_modules/selenium-webdriver/lib/input.js +946 -0
  243. data/node_modules/selenium-webdriver/lib/logging.js +661 -0
  244. data/node_modules/selenium-webdriver/lib/promise.js +285 -0
  245. data/node_modules/selenium-webdriver/lib/proxy.js +212 -0
  246. data/node_modules/selenium-webdriver/lib/session.js +77 -0
  247. data/node_modules/selenium-webdriver/lib/symbols.js +37 -0
  248. data/node_modules/selenium-webdriver/lib/until.js +429 -0
  249. data/node_modules/selenium-webdriver/lib/webdriver.js +2919 -0
  250. data/node_modules/selenium-webdriver/net/index.js +107 -0
  251. data/node_modules/selenium-webdriver/net/portprober.js +75 -0
  252. data/node_modules/selenium-webdriver/opera.js +406 -0
  253. data/node_modules/selenium-webdriver/package.json +54 -0
  254. data/node_modules/selenium-webdriver/proxy.js +32 -0
  255. data/node_modules/selenium-webdriver/remote/index.js +624 -0
  256. data/node_modules/selenium-webdriver/safari.js +168 -0
  257. data/node_modules/selenium-webdriver/testing/index.js +504 -0
  258. data/node_modules/set-immediate-shim/index.js +7 -0
  259. data/node_modules/set-immediate-shim/package.json +34 -0
  260. data/node_modules/set-immediate-shim/readme.md +31 -0
  261. data/node_modules/string_decoder/.travis.yml +50 -0
  262. data/node_modules/string_decoder/LICENSE +48 -0
  263. data/node_modules/string_decoder/README.md +47 -0
  264. data/node_modules/string_decoder/lib/string_decoder.js +296 -0
  265. data/node_modules/string_decoder/package.json +31 -0
  266. data/node_modules/tmp/CHANGELOG.md +288 -0
  267. data/node_modules/tmp/LICENSE +21 -0
  268. data/node_modules/tmp/README.md +365 -0
  269. data/node_modules/tmp/lib/tmp.js +780 -0
  270. data/node_modules/tmp/node_modules/.bin/rimraf +1 -0
  271. data/node_modules/tmp/node_modules/rimraf/CHANGELOG.md +65 -0
  272. data/node_modules/tmp/node_modules/rimraf/LICENSE +15 -0
  273. data/node_modules/tmp/node_modules/rimraf/README.md +101 -0
  274. data/node_modules/tmp/node_modules/rimraf/bin.js +68 -0
  275. data/node_modules/tmp/node_modules/rimraf/package.json +32 -0
  276. data/node_modules/tmp/node_modules/rimraf/rimraf.js +360 -0
  277. data/node_modules/tmp/package.json +58 -0
  278. data/node_modules/util-deprecate/History.md +16 -0
  279. data/node_modules/util-deprecate/LICENSE +24 -0
  280. data/node_modules/util-deprecate/README.md +53 -0
  281. data/node_modules/util-deprecate/browser.js +67 -0
  282. data/node_modules/util-deprecate/node.js +6 -0
  283. data/node_modules/util-deprecate/package.json +27 -0
  284. data/node_modules/wrappy/LICENSE +15 -0
  285. data/node_modules/wrappy/README.md +36 -0
  286. data/node_modules/wrappy/package.json +29 -0
  287. data/node_modules/wrappy/wrappy.js +33 -0
  288. data/node_modules/ws/LICENSE +21 -0
  289. data/node_modules/ws/README.md +496 -0
  290. data/node_modules/ws/browser.js +8 -0
  291. data/node_modules/ws/index.js +10 -0
  292. data/node_modules/ws/lib/buffer-util.js +129 -0
  293. data/node_modules/ws/lib/constants.js +10 -0
  294. data/node_modules/ws/lib/event-target.js +184 -0
  295. data/node_modules/ws/lib/extension.js +223 -0
  296. data/node_modules/ws/lib/limiter.js +55 -0
  297. data/node_modules/ws/lib/permessage-deflate.js +517 -0
  298. data/node_modules/ws/lib/receiver.js +507 -0
  299. data/node_modules/ws/lib/sender.js +405 -0
  300. data/node_modules/ws/lib/stream.js +165 -0
  301. data/node_modules/ws/lib/validation.js +104 -0
  302. data/node_modules/ws/lib/websocket-server.js +418 -0
  303. data/node_modules/ws/lib/websocket.js +942 -0
  304. data/node_modules/ws/package.json +56 -0
  305. data/package-lock.json +458 -0
  306. data/package.json +5 -0
  307. data/selenium.log +1 -0
  308. metadata +314 -19
@@ -0,0 +1,206 @@
1
+ // Licensed to the Software Freedom Conservancy (SFC) under one
2
+ // or more contributor license agreements. See the NOTICE file
3
+ // distributed with this work for additional information
4
+ // regarding copyright ownership. The SFC licenses this file
5
+ // to you under the Apache License, Version 2.0 (the
6
+ // "License"); you may not use this file except in compliance
7
+ // with the License. You may obtain a copy of the License at
8
+ //
9
+ // http://www.apache.org/licenses/LICENSE-2.0
10
+ //
11
+ // Unless required by applicable law or agreed to in writing,
12
+ // software distributed under the License is distributed on an
13
+ // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ // KIND, either express or implied. See the License for the
15
+ // specific language governing permissions and limitations
16
+ // under the License.
17
+
18
+ /**
19
+ * @fileoverview Contains several classes for handling commands.
20
+ */
21
+
22
+ 'use strict'
23
+
24
+ /**
25
+ * Describes a command to execute.
26
+ * @final
27
+ */
28
+ class Command {
29
+ /** @param {string} name The name of this command. */
30
+ constructor(name) {
31
+ /** @private {string} */
32
+ this.name_ = name
33
+
34
+ /** @private {!Object<*>} */
35
+ this.parameters_ = {}
36
+ }
37
+
38
+ /** @return {string} This command's name. */
39
+ getName() {
40
+ return this.name_
41
+ }
42
+
43
+ /**
44
+ * Sets a parameter to send with this command.
45
+ * @param {string} name The parameter name.
46
+ * @param {*} value The parameter value.
47
+ * @return {!Command} A self reference.
48
+ */
49
+ setParameter(name, value) {
50
+ this.parameters_[name] = value
51
+ return this
52
+ }
53
+
54
+ /**
55
+ * Sets the parameters for this command.
56
+ * @param {!Object<*>} parameters The command parameters.
57
+ * @return {!Command} A self reference.
58
+ */
59
+ setParameters(parameters) {
60
+ this.parameters_ = parameters
61
+ return this
62
+ }
63
+
64
+ /**
65
+ * Returns a named command parameter.
66
+ * @param {string} key The parameter key to look up.
67
+ * @return {*} The parameter value, or undefined if it has not been set.
68
+ */
69
+ getParameter(key) {
70
+ return this.parameters_[key]
71
+ }
72
+
73
+ /**
74
+ * @return {!Object<*>} The parameters to send with this command.
75
+ */
76
+ getParameters() {
77
+ return this.parameters_
78
+ }
79
+ }
80
+
81
+ /**
82
+ * Enumeration of predefined names command names that all command processors
83
+ * will support.
84
+ * @enum {string}
85
+ */
86
+ // TODO: Delete obsolete command names.
87
+ const Name = {
88
+ GET_SERVER_STATUS: 'getStatus',
89
+
90
+ NEW_SESSION: 'newSession',
91
+ GET_SESSIONS: 'getSessions',
92
+
93
+ CLOSE: 'close',
94
+ QUIT: 'quit',
95
+
96
+ GET_CURRENT_URL: 'getCurrentUrl',
97
+ GET: 'get',
98
+ GO_BACK: 'goBack',
99
+ GO_FORWARD: 'goForward',
100
+ REFRESH: 'refresh',
101
+
102
+ ADD_COOKIE: 'addCookie',
103
+ GET_COOKIE: 'getCookie',
104
+ GET_ALL_COOKIES: 'getCookies',
105
+ DELETE_COOKIE: 'deleteCookie',
106
+ DELETE_ALL_COOKIES: 'deleteAllCookies',
107
+
108
+ GET_ACTIVE_ELEMENT: 'getActiveElement',
109
+ FIND_ELEMENT: 'findElement',
110
+ FIND_ELEMENTS: 'findElements',
111
+ FIND_ELEMENTS_RELATIVE: 'findElementsRelative',
112
+ FIND_CHILD_ELEMENT: 'findChildElement',
113
+ FIND_CHILD_ELEMENTS: 'findChildElements',
114
+
115
+ CLEAR_ELEMENT: 'clearElement',
116
+ CLICK_ELEMENT: 'clickElement',
117
+ SEND_KEYS_TO_ELEMENT: 'sendKeysToElement',
118
+ SUBMIT_ELEMENT: 'submitElement',
119
+
120
+ GET_CURRENT_WINDOW_HANDLE: 'getCurrentWindowHandle',
121
+ GET_WINDOW_HANDLES: 'getWindowHandles',
122
+ GET_WINDOW_POSITION: 'getWindowPosition',
123
+ SET_WINDOW_POSITION: 'setWindowPosition',
124
+ GET_WINDOW_SIZE: 'getWindowSize',
125
+ SET_WINDOW_SIZE: 'setWindowSize',
126
+ GET_WINDOW_RECT: 'getWindowRect',
127
+ SET_WINDOW_RECT: 'setWindowRect',
128
+ MAXIMIZE_WINDOW: 'maximizeWindow',
129
+ MINIMIZE_WINDOW: 'minimizeWindow',
130
+ FULLSCREEN_WINDOW: 'fullscreenWindow',
131
+
132
+ SWITCH_TO_WINDOW: 'switchToWindow',
133
+ SWITCH_TO_NEW_WINDOW: 'newWindow',
134
+ SWITCH_TO_FRAME: 'switchToFrame',
135
+ SWITCH_TO_FRAME_PARENT: 'switchToFrameParent',
136
+ GET_PAGE_SOURCE: 'getPageSource',
137
+ GET_TITLE: 'getTitle',
138
+
139
+ EXECUTE_SCRIPT: 'executeScript',
140
+ EXECUTE_ASYNC_SCRIPT: 'executeAsyncScript',
141
+
142
+ GET_ELEMENT_TEXT: 'getElementText',
143
+ GET_COMPUTED_ROLE: 'getAriaRole',
144
+ GET_COMPUTED_LABEL: 'getAccessibleName',
145
+ GET_ELEMENT_TAG_NAME: 'getElementTagName',
146
+ IS_ELEMENT_SELECTED: 'isElementSelected',
147
+ IS_ELEMENT_ENABLED: 'isElementEnabled',
148
+ IS_ELEMENT_DISPLAYED: 'isElementDisplayed',
149
+ GET_ELEMENT_LOCATION: 'getElementLocation',
150
+ GET_ELEMENT_LOCATION_IN_VIEW: 'getElementLocationOnceScrolledIntoView',
151
+ GET_ELEMENT_RECT: 'getElementRect',
152
+ GET_ELEMENT_SIZE: 'getElementSize',
153
+ GET_ELEMENT_ATTRIBUTE: 'getElementAttribute',
154
+ GET_ELEMENT_VALUE_OF_CSS_PROPERTY: 'getElementValueOfCssProperty',
155
+ GET_ELEMENT_PROPERTY: 'getElementProperty',
156
+
157
+ SCREENSHOT: 'screenshot',
158
+ TAKE_ELEMENT_SCREENSHOT: 'takeElementScreenshot',
159
+ SET_SCRIPT_TIMEOUT: 'setScriptTimeout',
160
+
161
+ PRINT_PAGE: 'printPage',
162
+
163
+ GET_TIMEOUT: 'getTimeout',
164
+ SET_TIMEOUT: 'setTimeout',
165
+
166
+ ACCEPT_ALERT: 'acceptAlert',
167
+ DISMISS_ALERT: 'dismissAlert',
168
+ GET_ALERT_TEXT: 'getAlertText',
169
+ SET_ALERT_TEXT: 'setAlertValue',
170
+
171
+ GET_AVAILABLE_LOG_TYPES: 'getAvailableLogTypes',
172
+ GET_LOG: 'getLog',
173
+ GET_SESSION_LOGS: 'getSessionLogs',
174
+
175
+ // Non-standard commands used by the standalone Selenium server.
176
+ UPLOAD_FILE: 'uploadFile',
177
+
178
+ ACTIONS: 'actions',
179
+ CLEAR_ACTIONS: 'clearActions',
180
+ }
181
+
182
+ /**
183
+ * Handles the execution of WebDriver {@link Command commands}.
184
+ * @record
185
+ */
186
+ class Executor {
187
+ /**
188
+ * Executes the given {@code command}. If there is an error executing the
189
+ * command, the provided callback will be invoked with the offending error.
190
+ * Otherwise, the callback will be invoked with a null Error and non-null
191
+ * response object.
192
+ *
193
+ * @param {!Command} command The command to execute.
194
+ * @return {!Promise<?>} A promise that will be fulfilled with the command
195
+ * result.
196
+ */
197
+ execute(command) {} // eslint-disable-line
198
+ }
199
+
200
+ // PUBLIC API
201
+
202
+ module.exports = {
203
+ Command: Command,
204
+ Name: Name,
205
+ Executor: Executor,
206
+ }
@@ -0,0 +1,605 @@
1
+ // Licensed to the Software Freedom Conservancy (SFC) under one
2
+ // or more contributor license agreements. See the NOTICE file
3
+ // distributed with this work for additional information
4
+ // regarding copyright ownership. The SFC licenses this file
5
+ // to you under the Apache License, Version 2.0 (the
6
+ // "License"); you may not use this file except in compliance
7
+ // with the License. You may obtain a copy of the License at
8
+ //
9
+ // http://www.apache.org/licenses/LICENSE-2.0
10
+ //
11
+ // Unless required by applicable law or agreed to in writing,
12
+ // software distributed under the License is distributed on an
13
+ // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14
+ // KIND, either express or implied. See the License for the
15
+ // specific language governing permissions and limitations
16
+ // under the License.
17
+
18
+ 'use strict'
19
+
20
+ /**
21
+ * The base WebDriver error type. This error type is only used directly when a
22
+ * more appropriate category is not defined for the offending error.
23
+ */
24
+ class WebDriverError extends Error {
25
+ /** @param {string=} opt_error the error message, if any. */
26
+ constructor(opt_error) {
27
+ super(opt_error)
28
+
29
+ /** @override */
30
+ this.name = this.constructor.name
31
+
32
+ /**
33
+ * A stacktrace reported by the remote webdriver endpoint that initially
34
+ * reported this error. This property will be an empty string if the remote
35
+ * end did not provide a stacktrace.
36
+ * @type {string}
37
+ */
38
+ this.remoteStacktrace = ''
39
+ }
40
+ }
41
+
42
+ /**
43
+ * Indicates a {@linkplain ./webdriver.WebElement#click click command} could not
44
+ * completed because the click target is obscured by other elements on the
45
+ * page.
46
+ */
47
+ class ElementClickInterceptedError extends WebDriverError {
48
+ /** @param {string=} opt_error the error message, if any. */
49
+ constructor(opt_error) {
50
+ super(opt_error)
51
+ }
52
+ }
53
+
54
+ /**
55
+ * An attempt was made to select an element that cannot be selected.
56
+ */
57
+ class ElementNotSelectableError extends WebDriverError {
58
+ /** @param {string=} opt_error the error message, if any. */
59
+ constructor(opt_error) {
60
+ super(opt_error)
61
+ }
62
+ }
63
+
64
+ /**
65
+ * Indicates a command could not be completed because the target element is
66
+ * not pointer or keyboard interactable. This will often occur if an element
67
+ * is present in the DOM, but not rendered (i.e. its CSS style has
68
+ * "display: none").
69
+ */
70
+ class ElementNotInteractableError extends WebDriverError {
71
+ /** @param {string=} opt_error the error message, if any. */
72
+ constructor(opt_error) {
73
+ super(opt_error)
74
+ }
75
+ }
76
+
77
+ /**
78
+ * Indicates a navigation event caused the browser to generate a certificate
79
+ * warning. This is usually caused by an expired or invalid TLS certificate.
80
+ */
81
+ class InsecureCertificateError extends WebDriverError {
82
+ /** @param {string=} opt_error the error message, if any. */
83
+ constructor(opt_error) {
84
+ super(opt_error)
85
+ }
86
+ }
87
+
88
+ /**
89
+ * The arguments passed to a command are either invalid or malformed.
90
+ */
91
+ class InvalidArgumentError extends WebDriverError {
92
+ /** @param {string=} opt_error the error message, if any. */
93
+ constructor(opt_error) {
94
+ super(opt_error)
95
+ }
96
+ }
97
+
98
+ /**
99
+ * An illegal attempt was made to set a cookie under a different domain than
100
+ * the current page.
101
+ */
102
+ class InvalidCookieDomainError extends WebDriverError {
103
+ /** @param {string=} opt_error the error message, if any. */
104
+ constructor(opt_error) {
105
+ super(opt_error)
106
+ }
107
+ }
108
+
109
+ /**
110
+ * The coordinates provided to an interactions operation are invalid.
111
+ */
112
+ class InvalidCoordinatesError extends WebDriverError {
113
+ /** @param {string=} opt_error the error message, if any. */
114
+ constructor(opt_error) {
115
+ super(opt_error)
116
+ }
117
+ }
118
+
119
+ /**
120
+ * An element command could not be completed because the element is in an
121
+ * invalid state, e.g. attempting to click an element that is no longer attached
122
+ * to the document.
123
+ */
124
+ class InvalidElementStateError extends WebDriverError {
125
+ /** @param {string=} opt_error the error message, if any. */
126
+ constructor(opt_error) {
127
+ super(opt_error)
128
+ }
129
+ }
130
+
131
+ /**
132
+ * Argument was an invalid selector.
133
+ */
134
+ class InvalidSelectorError extends WebDriverError {
135
+ /** @param {string=} opt_error the error message, if any. */
136
+ constructor(opt_error) {
137
+ super(opt_error)
138
+ }
139
+ }
140
+
141
+ /**
142
+ * Occurs when a command is directed to a session that does not exist.
143
+ */
144
+ class NoSuchSessionError extends WebDriverError {
145
+ /** @param {string=} opt_error the error message, if any. */
146
+ constructor(opt_error) {
147
+ super(opt_error)
148
+ }
149
+ }
150
+
151
+ /**
152
+ * An error occurred while executing JavaScript supplied by the user.
153
+ */
154
+ class JavascriptError extends WebDriverError {
155
+ /** @param {string=} opt_error the error message, if any. */
156
+ constructor(opt_error) {
157
+ super(opt_error)
158
+ }
159
+ }
160
+
161
+ /**
162
+ * The target for mouse interaction is not in the browser’s viewport and cannot
163
+ * be brought into that viewport.
164
+ */
165
+ class MoveTargetOutOfBoundsError extends WebDriverError {
166
+ /** @param {string=} opt_error the error message, if any. */
167
+ constructor(opt_error) {
168
+ super(opt_error)
169
+ }
170
+ }
171
+
172
+ /**
173
+ * An attempt was made to operate on a modal dialog when one was not open.
174
+ */
175
+ class NoSuchAlertError extends WebDriverError {
176
+ /** @param {string=} opt_error the error message, if any. */
177
+ constructor(opt_error) {
178
+ super(opt_error)
179
+ }
180
+ }
181
+
182
+ /**
183
+ * Indicates a named cookie could not be found in the cookie jar for the
184
+ * currently selected document.
185
+ */
186
+ class NoSuchCookieError extends WebDriverError {
187
+ /** @param {string=} opt_error the error message, if any. */
188
+ constructor(opt_error) {
189
+ super(opt_error)
190
+ }
191
+ }
192
+
193
+ /**
194
+ * An element could not be located on the page using the given search
195
+ * parameters.
196
+ */
197
+ class NoSuchElementError extends WebDriverError {
198
+ /** @param {string=} opt_error the error message, if any. */
199
+ constructor(opt_error) {
200
+ super(opt_error)
201
+ }
202
+ }
203
+
204
+ /**
205
+ * A request to switch to a frame could not be satisfied because the frame
206
+ * could not be found.
207
+ */
208
+ class NoSuchFrameError extends WebDriverError {
209
+ /** @param {string=} opt_error the error message, if any. */
210
+ constructor(opt_error) {
211
+ super(opt_error)
212
+ }
213
+ }
214
+
215
+ /**
216
+ * A request to switch to a window could not be satisfied because the window
217
+ * could not be found.
218
+ */
219
+ class NoSuchWindowError extends WebDriverError {
220
+ /** @param {string=} opt_error the error message, if any. */
221
+ constructor(opt_error) {
222
+ super(opt_error)
223
+ }
224
+ }
225
+
226
+ /**
227
+ * A script did not complete before its timeout expired.
228
+ */
229
+ class ScriptTimeoutError extends WebDriverError {
230
+ /** @param {string=} opt_error the error message, if any. */
231
+ constructor(opt_error) {
232
+ super(opt_error)
233
+ }
234
+ }
235
+
236
+ /**
237
+ * A new session could not be created.
238
+ */
239
+ class SessionNotCreatedError extends WebDriverError {
240
+ /** @param {string=} opt_error the error message, if any. */
241
+ constructor(opt_error) {
242
+ super(opt_error)
243
+ }
244
+ }
245
+
246
+ /**
247
+ * An element command failed because the referenced element is no longer
248
+ * attached to the DOM.
249
+ */
250
+ class StaleElementReferenceError extends WebDriverError {
251
+ /** @param {string=} opt_error the error message, if any. */
252
+ constructor(opt_error) {
253
+ super(opt_error)
254
+ }
255
+ }
256
+
257
+ /**
258
+ * An operation did not complete before its timeout expired.
259
+ */
260
+ class TimeoutError extends WebDriverError {
261
+ /** @param {string=} opt_error the error message, if any. */
262
+ constructor(opt_error) {
263
+ super(opt_error)
264
+ }
265
+ }
266
+
267
+ /**
268
+ * A request to set a cookie’s value could not be satisfied.
269
+ */
270
+ class UnableToSetCookieError extends WebDriverError {
271
+ /** @param {string=} opt_error the error message, if any. */
272
+ constructor(opt_error) {
273
+ super(opt_error)
274
+ }
275
+ }
276
+
277
+ /**
278
+ * A screen capture operation was not possible.
279
+ */
280
+ class UnableToCaptureScreenError extends WebDriverError {
281
+ /** @param {string=} opt_error the error message, if any. */
282
+ constructor(opt_error) {
283
+ super(opt_error)
284
+ }
285
+ }
286
+
287
+ /**
288
+ * A modal dialog was open, blocking this operation.
289
+ */
290
+ class UnexpectedAlertOpenError extends WebDriverError {
291
+ /**
292
+ * @param {string=} opt_error the error message, if any.
293
+ * @param {string=} opt_text the text of the open dialog, if available.
294
+ */
295
+ constructor(opt_error, opt_text) {
296
+ super(opt_error)
297
+
298
+ /** @private {(string|undefined)} */
299
+ this.text_ = opt_text
300
+ }
301
+
302
+ /**
303
+ * @return {(string|undefined)} The text displayed with the unhandled alert,
304
+ * if available.
305
+ */
306
+ getAlertText() {
307
+ return this.text_
308
+ }
309
+ }
310
+
311
+ /**
312
+ * A command could not be executed because the remote end is not aware of it.
313
+ */
314
+ class UnknownCommandError extends WebDriverError {
315
+ /** @param {string=} opt_error the error message, if any. */
316
+ constructor(opt_error) {
317
+ super(opt_error)
318
+ }
319
+ }
320
+
321
+ /**
322
+ * The requested command matched a known URL but did not match an method for
323
+ * that URL.
324
+ */
325
+ class UnknownMethodError extends WebDriverError {
326
+ /** @param {string=} opt_error the error message, if any. */
327
+ constructor(opt_error) {
328
+ super(opt_error)
329
+ }
330
+ }
331
+
332
+ /**
333
+ * Reports an unsupported operation.
334
+ */
335
+ class UnsupportedOperationError extends WebDriverError {
336
+ /** @param {string=} opt_error the error message, if any. */
337
+ constructor(opt_error) {
338
+ super(opt_error)
339
+ }
340
+ }
341
+
342
+ // TODO(jleyba): Define UnknownError as an alias of WebDriverError?
343
+
344
+ /**
345
+ * Enum of legacy error codes.
346
+ * TODO: remove this when all code paths have been switched to the new error
347
+ * types.
348
+ * @deprecated
349
+ * @enum {number}
350
+ */
351
+ const ErrorCode = {
352
+ SUCCESS: 0,
353
+ NO_SUCH_SESSION: 6,
354
+ NO_SUCH_ELEMENT: 7,
355
+ NO_SUCH_FRAME: 8,
356
+ UNKNOWN_COMMAND: 9,
357
+ UNSUPPORTED_OPERATION: 9,
358
+ STALE_ELEMENT_REFERENCE: 10,
359
+ ELEMENT_NOT_VISIBLE: 11,
360
+ INVALID_ELEMENT_STATE: 12,
361
+ UNKNOWN_ERROR: 13,
362
+ ELEMENT_NOT_SELECTABLE: 15,
363
+ JAVASCRIPT_ERROR: 17,
364
+ XPATH_LOOKUP_ERROR: 19,
365
+ TIMEOUT: 21,
366
+ NO_SUCH_WINDOW: 23,
367
+ INVALID_COOKIE_DOMAIN: 24,
368
+ UNABLE_TO_SET_COOKIE: 25,
369
+ UNEXPECTED_ALERT_OPEN: 26,
370
+ NO_SUCH_ALERT: 27,
371
+ SCRIPT_TIMEOUT: 28,
372
+ INVALID_ELEMENT_COORDINATES: 29,
373
+ IME_NOT_AVAILABLE: 30,
374
+ IME_ENGINE_ACTIVATION_FAILED: 31,
375
+ INVALID_SELECTOR_ERROR: 32,
376
+ SESSION_NOT_CREATED: 33,
377
+ MOVE_TARGET_OUT_OF_BOUNDS: 34,
378
+ SQL_DATABASE_ERROR: 35,
379
+ INVALID_XPATH_SELECTOR: 51,
380
+ INVALID_XPATH_SELECTOR_RETURN_TYPE: 52,
381
+ ELEMENT_NOT_INTERACTABLE: 60,
382
+ INVALID_ARGUMENT: 61,
383
+ NO_SUCH_COOKIE: 62,
384
+ UNABLE_TO_CAPTURE_SCREEN: 63,
385
+ ELEMENT_CLICK_INTERCEPTED: 64,
386
+ METHOD_NOT_ALLOWED: 405,
387
+ }
388
+
389
+ const LEGACY_ERROR_CODE_TO_TYPE = new Map([
390
+ [ErrorCode.NO_SUCH_SESSION, NoSuchSessionError],
391
+ [ErrorCode.NO_SUCH_ELEMENT, NoSuchElementError],
392
+ [ErrorCode.NO_SUCH_FRAME, NoSuchFrameError],
393
+ [ErrorCode.UNSUPPORTED_OPERATION, UnsupportedOperationError],
394
+ [ErrorCode.STALE_ELEMENT_REFERENCE, StaleElementReferenceError],
395
+ [ErrorCode.INVALID_ELEMENT_STATE, InvalidElementStateError],
396
+ [ErrorCode.UNKNOWN_ERROR, WebDriverError],
397
+ [ErrorCode.ELEMENT_NOT_SELECTABLE, ElementNotSelectableError],
398
+ [ErrorCode.JAVASCRIPT_ERROR, JavascriptError],
399
+ [ErrorCode.XPATH_LOOKUP_ERROR, InvalidSelectorError],
400
+ [ErrorCode.TIMEOUT, TimeoutError],
401
+ [ErrorCode.NO_SUCH_WINDOW, NoSuchWindowError],
402
+ [ErrorCode.INVALID_COOKIE_DOMAIN, InvalidCookieDomainError],
403
+ [ErrorCode.UNABLE_TO_SET_COOKIE, UnableToSetCookieError],
404
+ [ErrorCode.UNEXPECTED_ALERT_OPEN, UnexpectedAlertOpenError],
405
+ [ErrorCode.NO_SUCH_ALERT, NoSuchAlertError],
406
+ [ErrorCode.SCRIPT_TIMEOUT, ScriptTimeoutError],
407
+ [ErrorCode.INVALID_ELEMENT_COORDINATES, InvalidCoordinatesError],
408
+ [ErrorCode.INVALID_SELECTOR_ERROR, InvalidSelectorError],
409
+ [ErrorCode.SESSION_NOT_CREATED, SessionNotCreatedError],
410
+ [ErrorCode.MOVE_TARGET_OUT_OF_BOUNDS, MoveTargetOutOfBoundsError],
411
+ [ErrorCode.INVALID_XPATH_SELECTOR, InvalidSelectorError],
412
+ [ErrorCode.INVALID_XPATH_SELECTOR_RETURN_TYPE, InvalidSelectorError],
413
+ [ErrorCode.ELEMENT_NOT_INTERACTABLE, ElementNotInteractableError],
414
+ [ErrorCode.INVALID_ARGUMENT, InvalidArgumentError],
415
+ [ErrorCode.NO_SUCH_COOKIE, NoSuchCookieError],
416
+ [ErrorCode.UNABLE_TO_CAPTURE_SCREEN, UnableToCaptureScreenError],
417
+ [ErrorCode.ELEMENT_CLICK_INTERCEPTED, ElementClickInterceptedError],
418
+ [ErrorCode.METHOD_NOT_ALLOWED, UnsupportedOperationError],
419
+ ])
420
+
421
+ const ERROR_CODE_TO_TYPE = new Map([
422
+ ['unknown error', WebDriverError],
423
+ ['element click intercepted', ElementClickInterceptedError],
424
+ ['element not interactable', ElementNotInteractableError],
425
+ ['element not selectable', ElementNotSelectableError],
426
+ ['insecure certificate', InsecureCertificateError],
427
+ ['invalid argument', InvalidArgumentError],
428
+ ['invalid cookie domain', InvalidCookieDomainError],
429
+ ['invalid coordinates', InvalidCoordinatesError],
430
+ ['invalid element state', InvalidElementStateError],
431
+ ['invalid selector', InvalidSelectorError],
432
+ ['invalid session id', NoSuchSessionError],
433
+ ['javascript error', JavascriptError],
434
+ ['move target out of bounds', MoveTargetOutOfBoundsError],
435
+ ['no such alert', NoSuchAlertError],
436
+ ['no such cookie', NoSuchCookieError],
437
+ ['no such element', NoSuchElementError],
438
+ ['no such frame', NoSuchFrameError],
439
+ ['no such window', NoSuchWindowError],
440
+ ['script timeout', ScriptTimeoutError],
441
+ ['session not created', SessionNotCreatedError],
442
+ ['stale element reference', StaleElementReferenceError],
443
+ ['timeout', TimeoutError],
444
+ ['unable to set cookie', UnableToSetCookieError],
445
+ ['unable to capture screen', UnableToCaptureScreenError],
446
+ ['unexpected alert open', UnexpectedAlertOpenError],
447
+ ['unknown command', UnknownCommandError],
448
+ ['unknown method', UnknownMethodError],
449
+ ['unsupported operation', UnsupportedOperationError],
450
+ ])
451
+
452
+ const TYPE_TO_ERROR_CODE = new Map()
453
+ ERROR_CODE_TO_TYPE.forEach((value, key) => {
454
+ TYPE_TO_ERROR_CODE.set(value, key)
455
+ })
456
+
457
+ /**
458
+ * @param {*} err The error to encode.
459
+ * @return {{error: string, message: string}} the encoded error.
460
+ */
461
+ function encodeError(err) {
462
+ let type = WebDriverError
463
+ if (
464
+ err instanceof WebDriverError &&
465
+ TYPE_TO_ERROR_CODE.has(err.constructor)
466
+ ) {
467
+ type = err.constructor
468
+ }
469
+
470
+ let message = err instanceof Error ? err.message : err + ''
471
+
472
+ let code = /** @type {string} */ (TYPE_TO_ERROR_CODE.get(type))
473
+ return { error: code, message: message }
474
+ }
475
+
476
+ /**
477
+ * Checks a response object from a server that adheres to the W3C WebDriver
478
+ * protocol.
479
+ * @param {*} data The response data to check.
480
+ * @return {*} The response data if it was not an encoded error.
481
+ * @throws {WebDriverError} the decoded error, if present in the data object.
482
+ * @deprecated Use {@link #throwDecodedError(data)} instead.
483
+ * @see https://w3c.github.io/webdriver/webdriver-spec.html#protocol
484
+ */
485
+ function checkResponse(data) {
486
+ if (data && typeof data.error === 'string') {
487
+ let ctor = ERROR_CODE_TO_TYPE.get(data.error) || WebDriverError
488
+ throw new ctor(data.message)
489
+ }
490
+ return data
491
+ }
492
+
493
+ /**
494
+ * Tests if the given value is a valid error response object according to the
495
+ * W3C WebDriver spec.
496
+ *
497
+ * @param {?} data The value to test.
498
+ * @return {boolean} Whether the given value data object is a valid error
499
+ * response.
500
+ * @see https://w3c.github.io/webdriver/webdriver-spec.html#protocol
501
+ */
502
+ function isErrorResponse(data) {
503
+ return data && typeof data === 'object' && typeof data.error === 'string'
504
+ }
505
+
506
+ /**
507
+ * Throws an error coded from the W3C protocol. A generic error will be thrown
508
+ * if the provided `data` is not a valid encoded error.
509
+ *
510
+ * @param {{error: string, message: string}} data The error data to decode.
511
+ * @throws {WebDriverError} the decoded error.
512
+ * @see https://w3c.github.io/webdriver/webdriver-spec.html#protocol
513
+ */
514
+ function throwDecodedError(data) {
515
+ if (isErrorResponse(data)) {
516
+ let ctor = ERROR_CODE_TO_TYPE.get(data.error) || WebDriverError
517
+ let err = new ctor(data.message)
518
+ // TODO(jleyba): remove whichever case is excluded from the final W3C spec.
519
+ if (typeof data.stacktrace === 'string') {
520
+ err.remoteStacktrace = data.stacktrace
521
+ } else if (typeof data.stackTrace === 'string') {
522
+ err.remoteStacktrace = data.stackTrace
523
+ }
524
+ throw err
525
+ }
526
+ throw new WebDriverError('Unknown error: ' + JSON.stringify(data))
527
+ }
528
+
529
+ /**
530
+ * Checks a legacy response from the Selenium 2.0 wire protocol for an error.
531
+ * @param {*} responseObj the response object to check.
532
+ * @return {*} responseObj the original response if it does not define an error.
533
+ * @throws {WebDriverError} if the response object defines an error.
534
+ */
535
+ function checkLegacyResponse(responseObj) {
536
+ // Handle the legacy Selenium error response format.
537
+ if (
538
+ responseObj &&
539
+ typeof responseObj === 'object' &&
540
+ typeof responseObj['status'] === 'number' &&
541
+ responseObj['status'] !== 0
542
+ ) {
543
+ let status = responseObj['status']
544
+ let ctor = LEGACY_ERROR_CODE_TO_TYPE.get(status) || WebDriverError
545
+
546
+ let value = responseObj['value']
547
+
548
+ if (!value || typeof value !== 'object') {
549
+ throw new ctor(value + '')
550
+ } else {
551
+ let message = value['message'] + ''
552
+ if (ctor !== UnexpectedAlertOpenError) {
553
+ throw new ctor(message)
554
+ }
555
+
556
+ let text = ''
557
+ if (value['alert'] && typeof value['alert']['text'] === 'string') {
558
+ text = value['alert']['text']
559
+ }
560
+ throw new UnexpectedAlertOpenError(message, text)
561
+ }
562
+ }
563
+ return responseObj
564
+ }
565
+
566
+ // PUBLIC API
567
+
568
+ module.exports = {
569
+ ErrorCode,
570
+
571
+ WebDriverError,
572
+ ElementClickInterceptedError,
573
+ ElementNotInteractableError,
574
+ ElementNotSelectableError,
575
+ InsecureCertificateError,
576
+ InvalidArgumentError,
577
+ InvalidCookieDomainError,
578
+ InvalidCoordinatesError,
579
+ InvalidElementStateError,
580
+ InvalidSelectorError,
581
+ JavascriptError,
582
+ MoveTargetOutOfBoundsError,
583
+ NoSuchAlertError,
584
+ NoSuchCookieError,
585
+ NoSuchElementError,
586
+ NoSuchFrameError,
587
+ NoSuchSessionError,
588
+ NoSuchWindowError,
589
+ ScriptTimeoutError,
590
+ SessionNotCreatedError,
591
+ StaleElementReferenceError,
592
+ TimeoutError,
593
+ UnableToSetCookieError,
594
+ UnableToCaptureScreenError,
595
+ UnexpectedAlertOpenError,
596
+ UnknownCommandError,
597
+ UnknownMethodError,
598
+ UnsupportedOperationError,
599
+
600
+ checkResponse,
601
+ checkLegacyResponse,
602
+ encodeError,
603
+ isErrorResponse,
604
+ throwDecodedError,
605
+ }