aboutsummaryrefslogtreecommitdiff
path: root/node_modules/selenium-webdriver/lib/error.js
diff options
context:
space:
mode:
authorFlorian Dold <florian.dold@gmail.com>2016-11-03 01:33:53 +0100
committerFlorian Dold <florian.dold@gmail.com>2016-11-03 01:33:53 +0100
commitd1291f67551c58168af43698a359cb5ddfd266b0 (patch)
tree55a13ed29fe1915e3f42f1b1b7038dafa2e975a7 /node_modules/selenium-webdriver/lib/error.js
parentd0a0695fb5d34996850723f7d4b1b59c3df909c2 (diff)
node_modules
Diffstat (limited to 'node_modules/selenium-webdriver/lib/error.js')
-rw-r--r--node_modules/selenium-webdriver/lib/error.js555
1 files changed, 555 insertions, 0 deletions
diff --git a/node_modules/selenium-webdriver/lib/error.js b/node_modules/selenium-webdriver/lib/error.js
new file mode 100644
index 000000000..555e5cbc5
--- /dev/null
+++ b/node_modules/selenium-webdriver/lib/error.js
@@ -0,0 +1,555 @@
+// Licensed to the Software Freedom Conservancy (SFC) under one
+// or more contributor license agreements. See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership. The SFC licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License. You may obtain a copy of the License at
+//
+// http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied. See the License for the
+// specific language governing permissions and limitations
+// under the License.
+
+'use strict';
+
+/**
+ * The base WebDriver error type. This error type is only used directly when a
+ * more appropriate category is not defined for the offending error.
+ */
+class WebDriverError extends Error {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+
+ /** @override */
+ this.name = this.constructor.name;
+ }
+}
+
+
+/**
+ * An attempt was made to select an element that cannot be selected.
+ */
+class ElementNotSelectableError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * An element command could not be completed because the element is not visible
+ * on the page.
+ */
+class ElementNotVisibleError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * The arguments passed to a command are either invalid or malformed.
+ */
+class InvalidArgumentError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * An illegal attempt was made to set a cookie under a different domain than
+ * the current page.
+ */
+class InvalidCookieDomainError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * The coordinates provided to an interactions operation are invalid.
+ */
+class InvalidElementCoordinatesError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * An element command could not be completed because the element is in an
+ * invalid state, e.g. attempting to click an element that is no longer attached
+ * to the document.
+ */
+class InvalidElementStateError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * Argument was an invalid selector.
+ */
+class InvalidSelectorError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * Occurs when a command is directed to a session that does not exist.
+ */
+class NoSuchSessionError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * An error occurred while executing JavaScript supplied by the user.
+ */
+class JavascriptError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * The target for mouse interaction is not in the browser’s viewport and cannot
+ * be brought into that viewport.
+ */
+class MoveTargetOutOfBoundsError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * An attempt was made to operate on a modal dialog when one was not open.
+ */
+class NoSuchAlertError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * An element could not be located on the page using the given search
+ * parameters.
+ */
+class NoSuchElementError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * A request to switch to a frame could not be satisfied because the frame
+ * could not be found.
+ */
+class NoSuchFrameError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * A request to switch to a window could not be satisfied because the window
+ * could not be found.
+ */
+class NoSuchWindowError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * A script did not complete before its timeout expired.
+ */
+class ScriptTimeoutError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * A new session could not be created.
+ */
+class SessionNotCreatedError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+
+/**
+ * An element command failed because the referenced element is no longer
+ * attached to the DOM.
+ */
+class StaleElementReferenceError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * An operation did not complete before its timeout expired.
+ */
+class TimeoutError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * A request to set a cookie’s value could not be satisfied.
+ */
+class UnableToSetCookieError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * A screen capture operation was not possible.
+ */
+class UnableToCaptureScreenError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * A modal dialog was open, blocking this operation.
+ */
+class UnexpectedAlertOpenError extends WebDriverError {
+ /**
+ * @param {string=} opt_error the error message, if any.
+ * @param {string=} opt_text the text of the open dialog, if available.
+ */
+ constructor(opt_error, opt_text) {
+ super(opt_error);
+
+ /** @private {(string|undefined)} */
+ this.text_ = opt_text;
+ }
+
+ /**
+ * @return {(string|undefined)} The text displayed with the unhandled alert,
+ * if available.
+ */
+ getAlertText() {
+ return this.text_;
+ }
+}
+
+
+/**
+ * A command could not be executed because the remote end is not aware of it.
+ */
+class UnknownCommandError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * The requested command matched a known URL but did not match an method for
+ * that URL.
+ */
+class UnknownMethodError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+
+/**
+ * Reports an unsupport operation.
+ */
+class UnsupportedOperationError extends WebDriverError {
+ /** @param {string=} opt_error the error message, if any. */
+ constructor(opt_error) {
+ super(opt_error);
+ }
+}
+
+// TODO(jleyba): Define UnknownError as an alias of WebDriverError?
+
+
+/**
+ * Enum of legacy error codes.
+ * TODO: remove this when all code paths have been switched to the new error
+ * types.
+ * @deprecated
+ * @enum {number}
+ */
+const ErrorCode = {
+ SUCCESS: 0,
+ NO_SUCH_ELEMENT: 7,
+ NO_SUCH_FRAME: 8,
+ UNKNOWN_COMMAND: 9,
+ UNSUPPORTED_OPERATION: 9,
+ STALE_ELEMENT_REFERENCE: 10,
+ ELEMENT_NOT_VISIBLE: 11,
+ INVALID_ELEMENT_STATE: 12,
+ UNKNOWN_ERROR: 13,
+ ELEMENT_NOT_SELECTABLE: 15,
+ JAVASCRIPT_ERROR: 17,
+ XPATH_LOOKUP_ERROR: 19,
+ TIMEOUT: 21,
+ NO_SUCH_WINDOW: 23,
+ INVALID_COOKIE_DOMAIN: 24,
+ UNABLE_TO_SET_COOKIE: 25,
+ UNEXPECTED_ALERT_OPEN: 26,
+ NO_SUCH_ALERT: 27,
+ SCRIPT_TIMEOUT: 28,
+ INVALID_ELEMENT_COORDINATES: 29,
+ IME_NOT_AVAILABLE: 30,
+ IME_ENGINE_ACTIVATION_FAILED: 31,
+ INVALID_SELECTOR_ERROR: 32,
+ SESSION_NOT_CREATED: 33,
+ MOVE_TARGET_OUT_OF_BOUNDS: 34,
+ SQL_DATABASE_ERROR: 35,
+ INVALID_XPATH_SELECTOR: 51,
+ INVALID_XPATH_SELECTOR_RETURN_TYPE: 52,
+ METHOD_NOT_ALLOWED: 405
+};
+
+
+const LEGACY_ERROR_CODE_TO_TYPE = new Map([
+ [ErrorCode.NO_SUCH_ELEMENT, NoSuchElementError],
+ [ErrorCode.NO_SUCH_FRAME, NoSuchFrameError],
+ [ErrorCode.UNSUPPORTED_OPERATION, UnsupportedOperationError],
+ [ErrorCode.STALE_ELEMENT_REFERENCE, StaleElementReferenceError],
+ [ErrorCode.ELEMENT_NOT_VISIBLE, ElementNotVisibleError],
+ [ErrorCode.INVALID_ELEMENT_STATE, InvalidElementStateError],
+ [ErrorCode.UNKNOWN_ERROR, WebDriverError],
+ [ErrorCode.ELEMENT_NOT_SELECTABLE, ElementNotSelectableError],
+ [ErrorCode.JAVASCRIPT_ERROR, JavascriptError],
+ [ErrorCode.XPATH_LOOKUP_ERROR, InvalidSelectorError],
+ [ErrorCode.TIMEOUT, TimeoutError],
+ [ErrorCode.NO_SUCH_WINDOW, NoSuchWindowError],
+ [ErrorCode.INVALID_COOKIE_DOMAIN, InvalidCookieDomainError],
+ [ErrorCode.UNABLE_TO_SET_COOKIE, UnableToSetCookieError],
+ [ErrorCode.UNEXPECTED_ALERT_OPEN, UnexpectedAlertOpenError],
+ [ErrorCode.NO_SUCH_ALERT, NoSuchAlertError],
+ [ErrorCode.SCRIPT_TIMEOUT, ScriptTimeoutError],
+ [ErrorCode.INVALID_ELEMENT_COORDINATES, InvalidElementCoordinatesError],
+ [ErrorCode.INVALID_SELECTOR_ERROR, InvalidSelectorError],
+ [ErrorCode.SESSION_NOT_CREATED, SessionNotCreatedError],
+ [ErrorCode.MOVE_TARGET_OUT_OF_BOUNDS, MoveTargetOutOfBoundsError],
+ [ErrorCode.INVALID_XPATH_SELECTOR, InvalidSelectorError],
+ [ErrorCode.INVALID_XPATH_SELECTOR_RETURN_TYPE, InvalidSelectorError],
+ [ErrorCode.METHOD_NOT_ALLOWED, UnsupportedOperationError]]);
+
+
+const ERROR_CODE_TO_TYPE = new Map([
+ ['unknown error', WebDriverError],
+ ['element not selectable', ElementNotSelectableError],
+ ['element not visible', ElementNotVisibleError],
+ ['invalid argument', InvalidArgumentError],
+ ['invalid cookie domain', InvalidCookieDomainError],
+ ['invalid element coordinates', InvalidElementCoordinatesError],
+ ['invalid element state', InvalidElementStateError],
+ ['invalid selector', InvalidSelectorError],
+ ['invalid session id', NoSuchSessionError],
+ ['javascript error', JavascriptError],
+ ['move target out of bounds', MoveTargetOutOfBoundsError],
+ ['no such alert', NoSuchAlertError],
+ ['no such element', NoSuchElementError],
+ ['no such frame', NoSuchFrameError],
+ ['no such window', NoSuchWindowError],
+ ['script timeout', ScriptTimeoutError],
+ ['session not created', SessionNotCreatedError],
+ ['stale element reference', StaleElementReferenceError],
+ ['timeout', TimeoutError],
+ ['unable to set cookie', UnableToSetCookieError],
+ ['unable to capture screen', UnableToCaptureScreenError],
+ ['unexpected alert open', UnexpectedAlertOpenError],
+ ['unknown command', UnknownCommandError],
+ ['unknown method', UnknownMethodError],
+ ['unsupported operation', UnsupportedOperationError]]);
+
+
+const TYPE_TO_ERROR_CODE = new Map;
+ERROR_CODE_TO_TYPE.forEach((value, key) => {
+ TYPE_TO_ERROR_CODE.set(value, key);
+});
+
+
+
+/**
+ * @param {*} err The error to encode.
+ * @return {{error: string, message: string}} the encoded error.
+ */
+function encodeError(err) {
+ let type = WebDriverError;
+ if (err instanceof WebDriverError
+ && TYPE_TO_ERROR_CODE.has(err.constructor)) {
+ type = err.constructor;
+ }
+
+ let message = err instanceof Error
+ ? err.message
+ : err + '';
+
+ let code = /** @type {string} */(TYPE_TO_ERROR_CODE.get(type));
+ return {'error': code, 'message': message};
+}
+
+
+/**
+ * Checks a response object from a server that adheres to the W3C WebDriver
+ * protocol.
+ * @param {*} data The response data to check.
+ * @return {*} The response data if it was not an encoded error.
+ * @throws {WebDriverError} the decoded error, if present in the data object.
+ * @deprecated Use {@link #throwDecodedError(data)} instead.
+ * @see https://w3c.github.io/webdriver/webdriver-spec.html#protocol
+ */
+function checkResponse(data) {
+ if (data && typeof data.error === 'string') {
+ let ctor = ERROR_CODE_TO_TYPE.get(data.error) || WebDriverError;
+ throw new ctor(data.message);
+ }
+ return data;
+}
+
+
+/**
+ * Throws an error coded from the W3C protocol. A generic error will be thrown
+ * if the privded `data` is not a valid encoded error.
+ *
+ * @param {{error: string, message: string}} data The error data to decode.
+ * @throws {WebDriverError} the decoded error.
+ * @see https://w3c.github.io/webdriver/webdriver-spec.html#protocol
+ */
+function throwDecodedError(data) {
+ if (data && typeof data === 'object' && typeof data.error === 'string') {
+ let ctor = ERROR_CODE_TO_TYPE.get(data.error) || WebDriverError;
+ throw new ctor(data.message);
+ }
+ throw new WebDriverError('Unknown error: ' + JSON.stringify(data));
+}
+
+
+/**
+ * Checks a legacy response from the Selenium 2.0 wire protocol for an error.
+ * @param {*} responseObj the response object to check.
+ * @return {*} responseObj the original response if it does not define an error.
+ * @throws {WebDriverError} if the response object defines an error.
+ */
+function checkLegacyResponse(responseObj) {
+ // Handle the legacy Selenium error response format.
+ if (responseObj
+ && typeof responseObj === 'object'
+ && typeof responseObj['status'] === 'number'
+ && responseObj['status'] !== 0) {
+ let status = responseObj['status'];
+ let ctor = LEGACY_ERROR_CODE_TO_TYPE.get(status) || WebDriverError;
+
+ let value = responseObj['value'];
+
+ if (!value || typeof value !== 'object') {
+ throw new ctor(value + '');
+ } else {
+ let message = value['message'] + '';
+ if (ctor !== UnexpectedAlertOpenError) {
+ throw new ctor(message);
+ }
+
+ let text = '';
+ if (value['alert'] && typeof value['alert']['text'] === 'string') {
+ text = value['alert']['text'];
+ }
+ throw new UnexpectedAlertOpenError(message, text);
+ }
+ }
+ return responseObj;
+}
+
+
+// PUBLIC API
+
+
+module.exports = {
+ ErrorCode: ErrorCode,
+
+ WebDriverError: WebDriverError,
+ ElementNotSelectableError: ElementNotSelectableError,
+ ElementNotVisibleError: ElementNotVisibleError,
+ InvalidArgumentError: InvalidArgumentError,
+ InvalidCookieDomainError: InvalidCookieDomainError,
+ InvalidElementCoordinatesError: InvalidElementCoordinatesError,
+ InvalidElementStateError: InvalidElementStateError,
+ InvalidSelectorError: InvalidSelectorError,
+ JavascriptError: JavascriptError,
+ MoveTargetOutOfBoundsError: MoveTargetOutOfBoundsError,
+ NoSuchAlertError: NoSuchAlertError,
+ NoSuchElementError: NoSuchElementError,
+ NoSuchFrameError: NoSuchFrameError,
+ NoSuchSessionError: NoSuchSessionError,
+ NoSuchWindowError: NoSuchWindowError,
+ ScriptTimeoutError: ScriptTimeoutError,
+ SessionNotCreatedError: SessionNotCreatedError,
+ StaleElementReferenceError: StaleElementReferenceError,
+ TimeoutError: TimeoutError,
+ UnableToSetCookieError: UnableToSetCookieError,
+ UnableToCaptureScreenError: UnableToCaptureScreenError,
+ UnexpectedAlertOpenError: UnexpectedAlertOpenError,
+ UnknownCommandError: UnknownCommandError,
+ UnknownMethodError: UnknownMethodError,
+ UnsupportedOperationError: UnsupportedOperationError,
+
+ checkResponse: checkResponse,
+ checkLegacyResponse: checkLegacyResponse,
+ encodeError: encodeError,
+ throwDecodedError: throwDecodedError,
+};