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