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
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": 404,
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
37 # WebDriver specification ID: dfn-send-an-error
38 #
39 # > When required to send an error, with error code, a remote end must run the
40 # > following steps:
41 # >
42 # > 1. Let http status and name be the error response data for error code.
43 # > 2. Let message be an implementation-defined string containing a
44 # >    human-readable description of the reason for the error.
45 # > 3. Let stacktrace be an implementation-defined string containing a stack
46 # >    trace report of the active stack frames at the time when the error
47 # >    occurred.
48 # > 4. Let data be a new JSON Object initialised with the following properties:
49 # >
50 # >     error
51 # >         name
52 # >     message
53 # >         message
54 # >     stacktrace
55 # >         stacktrace
56 # >
57 # > 5. Send a response with status and data as arguments.
58 def assert_error(response, error_code):
59     """
60     Verify that the provided webdriver.Response instance described
61     a valid error response as defined by `dfn-send-an-error` and
62     the provided error code.
63
64     :param response: ``webdriver.Response`` instance.
65     :param error_code: String value of the expected error code
66     """
67     assert response.status == errors[error_code]
68     assert "value" in response.body
69     assert response.body["value"]["error"] == error_code
70     assert isinstance(response.body["value"]["message"], basestring)
71     assert isinstance(response.body["value"]["stacktrace"], basestring)
72
73
74 def assert_success(response, value=None):
75     """
76     Verify that the provided webdriver.Response instance described
77     a valid error response as defined by `dfn-send-an-error` and
78     the provided error code.
79
80     :param response: ``webdriver.Response`` instance.
81     :param value: Expected value of the response body, if any.
82     """
83     assert response.status == 200, str(response.error)
84
85     if value is not None:
86         assert response.body["value"] == value
87     return response.body.get("value")
88
89
90 def assert_dialog_handled(session, expected_text):
91     result = session.transport.send("GET",
92                                     "session/%s/alert/text" % session.session_id)
93
94     # If there were any existing dialogs prior to the creation of this
95     # fixture's dialog, then the "Get Alert Text" command will return
96     # successfully. In that case, the text must be different than that
97     # of this fixture's dialog.
98     try:
99         assert_error(result, "no such alert")
100     except:
101         assert (result.status == 200 and
102                 result.body["value"] != expected_text), (
103             "Dialog with text '%s' was not handled." % expected_text)
104
105
106 def assert_same_element(session, a, b):
107     """Verify that two element references describe the same element."""
108     if isinstance(a, dict):
109         assert Element.identifier in a, "Actual value does not describe an element"
110         a_id = a[Element.identifier]
111     elif isinstance(a, Element):
112         a_id = a.id
113     else:
114         raise AssertionError("Actual value is not a dictionary or web element")
115
116     if isinstance(b, dict):
117         assert Element.identifier in b, "Expected value does not describe an element"
118         b_id = b[Element.identifier]
119     elif isinstance(b, Element):
120         b_id = b.id
121     else:
122         raise AssertionError("Expected value is not a dictionary or web element")
123
124     if a_id == b_id:
125         return
126
127     message = ("Expected element references to describe the same element, " +
128                "but they did not.")
129
130     # Attempt to provide more information, accounting for possible errors such
131     # as stale element references or not visible elements.
132     try:
133         a_markup = session.execute_script("return arguments[0].outerHTML;", args=(a,))
134         b_markup = session.execute_script("return arguments[0].outerHTML;", args=(b,))
135         message += " Actual: `%s`. Expected: `%s`." % (a_markup, b_markup)
136     except WebDriverException:
137         pass
138
139     raise AssertionError(message)
140
141
142 def assert_element_has_focus(target_element):
143     session = target_element.session
144
145     active_element = session.execute_script("return document.activeElement")
146     active_tag = active_element.property("localName")
147     target_tag = target_element.property("localName")
148
149     assert active_element == target_element, (
150         "Focussed element is <%s>, not <%s>" % (active_tag, target_tag))
151
152
153 def assert_move_to_coordinates(point, target, events):
154     for e in events:
155         if e["type"] != "mousemove":
156             assert e["pageX"] == point["x"]
157             assert e["pageY"] == point["y"]
158             assert e["target"] == target