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