# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import traceback
import six
@six.python_2_unicode_compatible
class MarionetteException(Exception):
"""Raised when a generic non-recoverable exception has occured."""
status =
"webdriver error"
def __init__(self, message=
None, cause=
None, stacktrace=
None):
"""Construct new MarionetteException instance.
:param message: An optional exception message.
:param cause: An optional tuple of three values giving
information about the root exception cause. Expected
tuple values are (type, value, traceback).
:param stacktrace: Optional string containing a stacktrace
(typically
from a failed JavaScript execution) that will
be displayed
in the exception
's string representation.
"""
self.cause = cause
self.stacktrace = stacktrace
self._message = six.text_type(message)
def __str__(self):
# pylint: disable=W1645
msg = self.message
tb =
None
if self.cause:
if type(self.cause)
is tuple:
msg +=
", caused by {0!r}".format(self.cause[0])
tb = self.cause[2]
else:
msg +=
", caused by {}".format(self.cause)
if self.stacktrace:
st =
"".join([
"\t{}\n".format(x)
for x
in self.stacktrace.splitlines()])
msg +=
"\nstacktrace:\n{}".format(st)
if tb:
msg +=
": " +
"".join(traceback.format_tb(tb))
return six.text_type(msg)
@property
def message(self):
return self._message
class DetachedShadowRootException(MarionetteException):
status =
"detached shadow root"
class ElementNotSelectableException(MarionetteException):
status =
"element not selectable"
class ElementClickInterceptedException(MarionetteException):
status =
"element click intercepted"
class InsecureCertificateException(MarionetteException):
status =
"insecure certificate"
class InvalidArgumentException(MarionetteException):
status =
"invalid argument"
class InvalidSessionIdException(MarionetteException):
status =
"invalid session id"
class TimeoutException(MarionetteException):
status =
"timeout"
class JavascriptException(MarionetteException):
status =
"javascript error"
class NoSuchElementException(MarionetteException):
status =
"no such element"
class NoSuchShadowRootException(MarionetteException):
status =
"no such shadow root"
class NoSuchWindowException(MarionetteException):
status =
"no such window"
class StaleElementException(MarionetteException):
status =
"stale element reference"
class ScriptTimeoutException(MarionetteException):
status =
"script timeout"
class ElementNotVisibleException(MarionetteException):
"""Deprecated. Will be removed with the release of Firefox 54."""
status =
"element not visible"
def __init__(
self,
message=
"Element is not currently visible and may not be manipulated",
stacktrace=
None,
cause=
None,
):
super(ElementNotVisibleException, self).__init__(
message, cause=cause, stacktrace=stacktrace
)
class ElementNotAccessibleException(MarionetteException):
status =
"element not accessible"
class ElementNotInteractableException(MarionetteException):
status =
"element not interactable"
class NoSuchFrameException(MarionetteException):
status =
"no such frame"
class InvalidElementStateException(MarionetteException):
status =
"invalid element state"
class NoAlertPresentException(MarionetteException):
status =
"no such alert"
class InvalidCookieDomainException(MarionetteException):
status =
"invalid cookie domain"
class UnableToSetCookieException(MarionetteException):
status =
"unable to set cookie"
class InvalidElementCoordinates(MarionetteException):
status =
"invalid element coordinates"
class InvalidSelectorException(MarionetteException):
status =
"invalid selector"
class MoveTargetOutOfBoundsException(MarionetteException):
status =
"move target out of bounds"
class SessionNotCreatedException(MarionetteException):
status =
"session not created"
class UnexpectedAlertOpen(MarionetteException):
status =
"unexpected alert open"
class UnknownCommandException(MarionetteException):
status =
"unknown command"
class UnknownException(MarionetteException):
status =
"unknown error"
class UnsupportedOperationException(MarionetteException):
status =
"unsupported operation"
class UnresponsiveInstanceException(Exception):
pass
es_ = [
e
for e
in locals().values()
if type(e)
is type
and issubclass(e, MarionetteException)
]
by_string = {e.status: e
for e
in es_}
def lookup(identifier):
"""Finds error exception class by associated Selenium JSON wire
protocol number code,
or W3C WebDriver protocol string.
"""
return by_string.get(identifier, MarionetteException)