File: //lib/ruby/vendor_ruby/selenium/webdriver/common/error.rb
# frozen_string_literal: true
# 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.
module Selenium
module WebDriver
module Error # rubocop:disable Metrics/ModuleLength
#
# Returns exception from code (Integer - OSS, String - W3C).
# @param [Integer, String, nil] code
#
def self.for_code(code)
case code
when nil, 0
nil
when Integer
Object.const_get(ERRORS.fetch(code).to_s)
when String
klass_name = code.split(' ').map(&:capitalize).join.sub(/Error$/, '')
const_get("#{klass_name}Error", false)
end
rescue KeyError, NameError
WebDriverError
end
class WebDriverError < StandardError; end
class IndexOutOfBoundsError < WebDriverError; end # 1
class NoCollectionError < WebDriverError; end # 2
class NoStringError < WebDriverError; end # 3
class NoStringLengthError < WebDriverError; end # 4
class NoStringWrapperError < WebDriverError; end # 5
class NoSuchDriverError < WebDriverError; end # 6
#
# An element could not be located on the page using the given search parameters.
#
class NoSuchElementError < WebDriverError; end # 7
#
# A command to switch to a frame could not be satisfied because the frame could not be found.
#
class NoSuchFrameError < WebDriverError; end # 8
#
# A command could not be executed because the remote end is not aware of it.
#
class UnknownCommandError < WebDriverError; end # 9
#
# A command failed because the referenced element is no longer attached to the DOM.
#
class StaleElementReferenceError < WebDriverError; end # 10
#
# Raised to indicate that although an element is present on the DOM, it is not visible, and
# so is not able to be interacted with.
#
class ElementNotVisibleError < WebDriverError; end # 11
#
# The target element is in an invalid state, rendering it impossible to interact with, for
# example if you click a disabled element.
#
class InvalidElementStateError < WebDriverError; end # 12
#
# An unknown error occurred in the remote end while processing the command.
#
class UnknownError < WebDriverError; end # 13
class ExpectedError < WebDriverError; end # 14
#
# An attempt was made to select an element that cannot be selected.
#
class ElementNotSelectableError < WebDriverError; end # 15
class NoSuchDocumentError < WebDriverError; end # 16
#
# An error occurred while executing JavaScript supplied by the user.
#
class JavascriptError < WebDriverError; end # 17
class NoScriptResultError < WebDriverError; end # 18
#
# An error occurred while searching for an element by XPath.
#
class XPathLookupError < WebDriverError; end # 19
class NoSuchCollectionError < WebDriverError; end # 20
#
# An operation did not complete before its timeout expired.
#
class TimeOutError < WebDriverError; end # 21
class NullPointerError < WebDriverError; end # 22
class NoSuchWindowError < WebDriverError; end # 23
#
# An illegal attempt was made to set a cookie under a different domain than the current page.
#
class InvalidCookieDomainError < WebDriverError; end # 24
#
# A command to set a cookie's value could not be satisfied.
#
class UnableToSetCookieError < WebDriverError; end # 25
#
# Raised when an alert dialog is present that has not been dealt with.
#
class UnhandledAlertError < WebDriverError; end # 26
#
# An attempt was made to operate on a modal dialog when one was not open:
#
# * W3C dialect is NoSuchAlertError
# * OSS dialect is NoAlertPresentError
#
# We want to allow clients to rescue NoSuchAlertError as a superclass for
# dialect-agnostic implementation, so NoAlertPresentError should inherit from it.
#
class NoSuchAlertError < WebDriverError; end
class NoAlertPresentError < NoSuchAlertError; end # 27
#
# A script did not complete before its timeout expired.
#
class ScriptTimeOutError < WebDriverError; end # 28
#
# The coordinates provided to an interactions operation are invalid.
#
class InvalidElementCoordinatesError < WebDriverError; end # 29
#
# Indicates that IME support is not available. This exception is rasied for every IME-related
# method call if IME support is not available on the machine.
#
class IMENotAvailableError < WebDriverError; end # 30
#
# Indicates that activating an IME engine has failed.
#
class IMEEngineActivationFailedError < WebDriverError; end # 31
#
# Argument was an invalid selector.
#
class InvalidSelectorError < WebDriverError; end # 32
#
# A new session could not be created.
#
class SessionNotCreatedError < WebDriverError; end # 33
#
# The target for mouse interaction is not in the browser's viewport and cannot be brought
# into that viewport.
#
class MoveTargetOutOfBoundsError < WebDriverError; end # 34
#
# Indicates that the XPath selector is invalid
#
class InvalidXpathSelectorError < WebDriverError; end
class InvalidXpathSelectorReturnTyperError < WebDriverError; end
#
# A command could not be completed because the element is not pointer or keyboard
# interactable.
#
class ElementNotInteractableError < WebDriverError; end
#
# A command could not be completed because TLS certificate is expired
# or invalid.
#
class InsecureCertificateError < WebDriverError; end
#
# The arguments passed to a command are either invalid or malformed.
#
class InvalidArgumentError < WebDriverError; end
#
# No cookie matching the given path name was found amongst the associated cookies of the
# current browsing context's active document.
#
class NoSuchCookieError < WebDriverError; end
#
# A screen capture was made impossible.
#
class UnableToCaptureScreenError < WebDriverError; end
#
# Occurs if the given session id is not in the list of active sessions, meaning the session
# either does not exist or that it's not active.
#
class InvalidSessionIdError < WebDriverError; end
#
# A modal dialog was open, blocking this operation.
#
class UnexpectedAlertOpenError < WebDriverError; end
#
# The requested command matched a known URL but did not match an method for that URL.
#
class UnknownMethodError < WebDriverError; end
#
# The Element Click command could not be completed because the element receiving the events
# is obscuring the element that was requested clicked.
#
class ElementClickInterceptedError < WebDriverError; end
#
# Indicates that a command that should have executed properly cannot be supported for some
# reason.
#
class UnsupportedOperationError < WebDriverError; end
# Aliases for OSS dialect.
ScriptTimeoutError = Class.new(ScriptTimeOutError)
TimeoutError = Class.new(TimeOutError)
NoAlertOpenError = Class.new(NoAlertPresentError)
# Aliases for backwards compatibility.
ObsoleteElementError = Class.new(StaleElementReferenceError)
UnhandledError = Class.new(UnknownError)
UnexpectedJavascriptError = Class.new(JavascriptError)
ElementNotDisplayedError = Class.new(ElementNotVisibleError)
#
# @api private
#
ERRORS = {
1 => IndexOutOfBoundsError,
2 => NoCollectionError,
3 => NoStringError,
4 => NoStringLengthError,
5 => NoStringWrapperError,
6 => NoSuchDriverError,
7 => NoSuchElementError,
8 => NoSuchFrameError,
9 => UnknownCommandError,
10 => StaleElementReferenceError,
11 => ElementNotVisibleError,
12 => InvalidElementStateError,
13 => UnknownError,
14 => ExpectedError,
15 => ElementNotSelectableError,
16 => NoSuchDocumentError,
17 => JavascriptError,
18 => NoScriptResultError,
19 => XPathLookupError,
20 => NoSuchCollectionError,
21 => TimeOutError,
22 => NullPointerError,
23 => NoSuchWindowError,
24 => InvalidCookieDomainError,
25 => UnableToSetCookieError,
26 => UnhandledAlertError,
27 => NoAlertPresentError,
28 => ScriptTimeOutError,
29 => InvalidElementCoordinatesError,
30 => IMENotAvailableError,
31 => IMEEngineActivationFailedError,
32 => InvalidSelectorError,
33 => SessionNotCreatedError,
34 => MoveTargetOutOfBoundsError,
# The following are W3C-specific errors,
# they don't really need error codes, we just make them up!
51 => InvalidXpathSelectorError,
52 => InvalidXpathSelectorReturnTyperError,
60 => ElementNotInteractableError,
61 => InvalidArgumentError,
62 => NoSuchCookieError,
63 => UnableToCaptureScreenError
}.freeze
DEPRECATED_ERRORS = {
IndexOutOfBoundsError: nil,
NoCollectionError: nil,
NoStringError: nil,
NoStringLengthError: nil,
NoStringWrapperError: nil,
NoSuchDriverError: nil,
ElementNotVisibleError: ElementNotInteractableError,
InvalidElementStateError: ElementNotInteractableError,
ElementNotSelectableError: ElementNotInteractableError,
ExpectedError: nil,
NoSuchDocumentError: nil,
NoScriptResultError: nil,
XPathLookupError: InvalidSelectorError,
NoSuchCollectionError: nil,
UnhandledAlertError: UnexpectedAlertOpenError,
NoAlertPresentError: NoSuchAlertError,
NoAlertOpenError: NoSuchAlertError,
ScriptTimeOutError: ScriptTimeoutError,
InvalidElementCoordinatesError: nil,
IMENotAvailableError: nil,
IMEEngineActivationFailedError: nil,
InvalidXpathSelectorError: InvalidSelectorError,
InvalidXpathSelectorReturnTyperError: InvalidSelectorError,
TimeOutError: TimeoutError,
ObsoleteElementError: StaleElementReferenceError,
UnhandledError: UnknownError,
UnexpectedJavascriptError: JavascriptError,
ElementNotDisplayedError: ElementNotInteractableError
}.freeze
DEPRECATED_ERRORS.keys.each do |oss_error|
remove_const oss_error
end
def self.const_missing(const_name)
super unless DEPRECATED_ERRORS.key?(const_name)
if DEPRECATED_ERRORS[const_name]
WebDriver.logger.deprecate("Selenium::WebDriver::Error::#{const_name}",
"#{DEPRECATED_ERRORS[const_name]} (ensure the driver supports W3C WebDriver specification)")
DEPRECATED_ERRORS[const_name]
else
WebDriver.logger.deprecate("Selenium::WebDriver::Error::#{const_name}")
WebDriverError
end
end
end # Error
end # WebDriver
end # Selenium