21cc07b9c81ca7a25063c2c596ece531e8d763f9
[WebKit-https.git] / WebDriverTests / imported / w3c / webdriver / tests / support / asserts.py
1 from webdriver.client import Element, element_key
2 from webdriver.error import WebDriverException
3
4 # WebDriver specification ID: dfn-error-response-data
5 errors = {
6     "element click intercepted": 400,
7     "element not selectable": 400,
8     "element not interactable": 400,
9     "insecure certificate": 400,
10     "invalid argument": 400,
11     "invalid cookie domain": 400,
12     "invalid coordinates": 400,
13     "invalid element state": 400,
14     "invalid selector": 400,
15     "invalid session id": 404,
16     "javascript error": 500,
17     "move target out of bounds": 500,
18     "no such alert": 404,
19     "no such cookie": 404,
20     "no such element": 404,
21     "no such frame": 404,
22     "no such window": 404,
23     "script timeout": 408,
24     "session not created": 500,
25     "stale element reference": 400,
26     "timeout": 408,
27     "unable to set cookie": 500,
28     "unable to capture screen": 500,
29     "unexpected alert open": 500,
30     "unknown command": 404,
31     "unknown error": 500,
32     "unknown method": 405,
33     "unsupported operation": 500,
34 }
35
36 # WebDriver specification ID: dfn-send-an-error
37 #
38 # > When required to send an error, with error code, a remote end must run the
39 # > following steps:
40 # >
41 # > 1. Let http status and name be the error response data for error code.
42 # > 2. Let message be an implementation-defined string containing a
43 # >    human-readable description of the reason for the error.
44 # > 3. Let stacktrace be an implementation-defined string containing a stack
45 # >    trace report of the active stack frames at the time when the error
46 # >    occurred.
47 # > 4. Let data be a new JSON Object initialised with the following properties:
48 # >
49 # >     error
50 # >         name
51 # >     message
52 # >         message
53 # >     stacktrace
54 # >         stacktrace
55 # >
56 # > 5. Send a response with status and data as arguments.
57 def assert_error(response, error_code):
58     """Verify that the provided wdclient.Response instance described a valid
59     error response as defined by `dfn-send-an-error` and the provided error
60     code.
61
62     :param response: wdclient.Response instance
63     :param error_code: string value of the expected "error code"
64     """
65     assert response.status == errors[error_code]
66     assert "value" in response.body
67     assert response.body["value"]["error"] == error_code
68     assert isinstance(response.body["value"]["message"], basestring)
69     assert isinstance(response.body["value"]["stacktrace"], basestring)
70
71 def assert_success(response, value=None):
72     """Verify that the provided wdclient.Response instance described a valid
73     error response as defined by `dfn-send-an-error` and the provided error
74     code.
75
76     :param response: wdclient.Response instance.
77     :param value: Expected value of the response body, if any.
78
79     """
80     assert response.status == 200
81     if value is not None:
82         assert response.body["value"] == value
83     return response.body.get("value")
84
85 def assert_dialog_handled(session, expected_text):
86     result = session.transport.send("GET",
87                                     "session/%s/alert/text" % session.session_id)
88
89     # If there were any existing dialogs prior to the creation of this
90     # fixture's dialog, then the "Get Alert Text" command will return
91     # successfully. In that case, the text must be different than that
92     # of this fixture's dialog.
93     try:
94         assert_error(result, "no such alert")
95     except:
96         assert (result.status == 200 and
97                 result.body["value"] != expected_text), (
98                "Dialog with text '%s' was not handled." % expected_text)
99
100 def assert_same_element(session, a, b):
101     """Verify that two element references describe the same element."""
102     assert isinstance(a, dict), "Actual value is not a dictionary"
103     assert isinstance(b, dict), "Expected value is not a dictionary"
104     assert element_key in a, "Actual value does not describe an element"
105     assert element_key in b, "Expected value does not describe an element"
106
107     if a[element_key] == b[element_key]:
108         return
109
110     message = ("Expected element references to describe the same element, " +
111         "but they did not.")
112
113     # Attempt to provide more information, accounting for possible errors such
114     # as stale element references or not visible elements.
115     try:
116         a_markup = session.execute_script("return arguments[0].outerHTML;", args=[a])
117         b_markup = session.execute_script("return arguments[0].outerHTML;", args=[b])
118         message += " Actual: `%s`. Expected: `%s`." % (a_markup, b_markup)
119     except WebDriverException:
120         pass
121
122     raise AssertionError(message)