Unreviewed. Update W3C WebDriver imported tests.
[WebKit-https.git] / WebDriverTests / imported / w3c / tools / webdriver / webdriver / error.py
1 import collections
2 import json
3
4
5 class WebDriverException(Exception):
6     http_status = None
7     status_code = None
8
9     def __init__(self, message, stacktrace=None):
10         super(WebDriverException, self)
11         self.stacktrace = stacktrace
12
13     def __repr__(self):
14         return "<%s http_status=%d>" % (self.__class__.__name__, self.http_status)
15
16     def __str__(self):
17         return ("%s (%d)\n"
18             "\n"
19             "Remote-end stacktrace:\n"
20             "\n"
21             "%s" % (self.status_code, self.http_status, self.stacktrace))
22
23
24 class ElementNotSelectableException(WebDriverException):
25     http_status = 400
26     status_code = "element not selectable"
27
28
29 class ElementNotVisibleException(WebDriverException):
30     http_status = 400
31     status_code = "element not visible"
32
33
34 class InsecureCertificateException(WebDriverException):
35     http_status = 400
36     status_code = "insecure certificate"
37
38
39 class InvalidArgumentException(WebDriverException):
40     http_status = 400
41     status_code = "invalid argument"
42
43
44 class InvalidCookieDomainException(WebDriverException):
45     http_status = 400
46     status_code = "invalid cookie domain"
47
48
49 class InvalidElementCoordinatesException(WebDriverException):
50     http_status = 400
51     status_code = "invalid element coordinates"
52
53
54 class InvalidElementStateException(WebDriverException):
55     http_status = 400
56     status_code = "invalid element state"
57
58
59 class InvalidSelectorException(WebDriverException):
60     http_status = 400
61     status_code = "invalid selector"
62
63
64 class InvalidSessionIdException(WebDriverException):
65     http_status = 404
66     status_code = "invalid session id"
67
68
69 class JavascriptErrorException(WebDriverException):
70     http_status = 500
71     status_code = "javascript error"
72
73
74 class MoveTargetOutOfBoundsException(WebDriverException):
75     http_status = 500
76     status_code = "move target out of bounds"
77
78
79 class NoSuchAlertException(WebDriverException):
80     http_status = 404
81     status_code = "no such alert"
82
83
84 class NoSuchElementException(WebDriverException):
85     http_status = 404
86     status_code = "no such element"
87
88
89 class NoSuchFrameException(WebDriverException):
90     http_status = 404
91     status_code = "no such frame"
92
93
94 class NoSuchWindowException(WebDriverException):
95     http_status = 404
96     status_code = "no such window"
97
98
99 class ScriptTimeoutException(WebDriverException):
100     http_status = 408
101     status_code = "script timeout"
102
103
104 class SessionNotCreatedException(WebDriverException):
105     http_status = 500
106     status_code = "session not created"
107
108
109 class StaleElementReferenceException(WebDriverException):
110     http_status = 404
111     status_code = "stale element reference"
112
113
114 class TimeoutException(WebDriverException):
115     http_status = 408
116     status_code = "timeout"
117
118
119 class UnableToSetCookieException(WebDriverException):
120     http_status = 500
121     status_code = "unable to set cookie"
122
123
124 class UnexpectedAlertOpenException(WebDriverException):
125     http_status = 500
126     status_code = "unexpected alert open"
127
128
129 class UnknownErrorException(WebDriverException):
130     http_status = 500
131     status_code = "unknown error"
132
133
134 class UnknownCommandException(WebDriverException):
135     http_status = 404
136     status_code = "unknown command"
137
138
139 class UnknownMethodException(WebDriverException):
140     http_status = 405
141     status_code = "unknown method"
142
143
144 class UnsupportedOperationException(WebDriverException):
145     http_status = 500
146     status_code = "unsupported operation"
147
148
149 def from_response(response):
150     """
151     Unmarshals an error from a ``Response``'s `body`, failing
152     if not all three required `error`, `message`, and `stacktrace`
153     fields are given.  Defaults to ``WebDriverException`` if `error`
154     is unknown.
155     """
156     if response.status == 200:
157         raise UnknownErrorException(
158             "Response is not an error:\n"
159             "%s" % json.dumps(response.body))
160
161     if "value" in response.body:
162         value = response.body["value"]
163     else:
164         raise UnknownErrorException(
165             "Expected 'value' key in response body:\n"
166             "%s" % json.dumps(response.body))
167
168     # all fields must exist, but stacktrace can be an empty string
169     code = value["error"]
170     message = value["message"]
171     stack = value["stacktrace"] or None
172
173     cls = get(code)
174     return cls(message, stacktrace=stack)
175
176
177 def get(error_code):
178     """
179     Gets exception from `error_code`, falling back to
180     ``WebDriverException`` if it is not found.
181     """
182     return _errors.get(error_code, WebDriverException)
183
184
185 _errors = collections.defaultdict()
186 for item in locals().values():
187     if type(item) == type and issubclass(item, WebDriverException):
188         _errors[item.status_code] = item