Unreviewed. Update W3C WebDriver imported tests.
[WebKit-https.git] / WebDriverTests / imported / w3c / webdriver / tests / element_retrieval / get_active_element.py
1 from tests.support.asserts import assert_error, assert_dialog_handled, assert_same_element
2 from tests.support.fixtures import create_dialog
3 from tests.support.inline import inline
4
5 def read_global(session, name):
6     return session.execute_script("return %s;" % name)
7
8 def get_active_element(session):
9     return session.transport.send("GET", "session/%s/element/active" % session.session_id)
10
11
12 def assert_is_active_element(session, response):
13     """Ensure that the provided object is a successful WebDriver
14     response describing an element reference and that the referenced
15     element matches the element returned by the `activeElement`
16     attribute of the current browsing context's active document.
17
18     """
19     assert response.status == 200
20     assert "value" in response.body
21
22     from_js = session.execute_script("return document.activeElement")
23
24     if response.body["value"] is None:
25         assert from_js is None
26     else:
27         assert_same_element(session, response.body["value"], from_js)
28
29
30 # > 1. If the current browsing context is no longer open, return error with
31 # >    error code no such window.
32 def test_closed_context(session, create_window):
33     new_window = create_window()
34     session.window_handle = new_window
35     session.close()
36
37     response = get_active_element(session)
38     assert_error(response, "no such window")
39
40
41 # [...]
42 # 2. Handle any user prompts and return its value if it is an error.
43 # [...]
44 # In order to handle any user prompts a remote end must take the following
45 # steps:
46 # 2. Run the substeps of the first matching user prompt handler:
47 #
48 #    [...]
49 #    - dismiss state
50 #      1. Dismiss the current user prompt.
51 #    [...]
52 #
53 # 3. Return success.
54 def test_handle_prompt_dismiss(new_session, add_browser_capabilites):
55     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({"unhandledPromptBehavior": "dismiss"})}})
56     session.url = inline("<body><p>Hello, World!</p></body>")
57
58     create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
59
60     response = get_active_element(session)
61     assert_is_active_element(session, response)
62     assert_dialog_handled(session, "dismiss #1")
63     assert session.execute_script("return dismiss1") is None
64
65     create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
66
67     response = get_active_element(session)
68     assert_is_active_element(session, response)
69     assert_dialog_handled(session, "dismiss #2")
70     assert read_global(session, "dismiss2") is None
71
72     create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
73
74     response = get_active_element(session)
75     assert_is_active_element(session, response)
76     assert_dialog_handled(session, "dismiss #3")
77     assert read_global(session, "dismiss3") is None
78
79
80 # [...]
81 # 2. Handle any user prompts and return its value if it is an error.
82 # [...]
83 # In order to handle any user prompts a remote end must take the following
84 # steps:
85 # 2. Run the substeps of the first matching user prompt handler:
86 #
87 #    [...]
88 #    - accept state
89 #      1. Accept the current user prompt.
90 #    [...]
91 #
92 # 3. Return success.
93 def test_handle_prompt_accept(new_session, add_browser_capabilites):
94     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({"unhandledPromptBehavior": "accept"})}})
95     session.url = inline("<body><p>Hello, World!</p></body>")
96     create_dialog(session)("alert", text="accept #1", result_var="accept1")
97
98     response = get_active_element(session)
99     assert_is_active_element(session, response)
100     assert_dialog_handled(session, "accept #1")
101     assert read_global(session, "accept1") is None
102
103     create_dialog(session)("confirm", text="accept #2", result_var="accept2")
104
105     response = get_active_element(session)
106     assert_is_active_element(session, response)
107     assert_dialog_handled(session, "accept #2")
108     assert read_global(session, "accept2") is True
109
110     create_dialog(session)("prompt", text="accept #3", result_var="accept3")
111
112     response = get_active_element(session)
113     assert_is_active_element(session, response)
114     assert_dialog_handled(session, "accept #3")
115     assert read_global(session, "accept3") == "" or read_global(session, "accept3") == "undefined"
116
117
118 # [...]
119 # 2. Handle any user prompts and return its value if it is an error.
120 # [...]
121 # In order to handle any user prompts a remote end must take the following
122 # steps:
123 # 2. Run the substeps of the first matching user prompt handler:
124 #
125 #    [...]
126 #    - missing value default state
127 #    - not in the table of simple dialogs
128 #      1. Dismiss the current user prompt.
129 #      2. Return error with error code unexpected alert open.
130 def test_handle_prompt_missing_value(session, create_dialog):
131     session.url = inline("<body><p>Hello, World!</p></body>")
132
133     create_dialog("alert", text="dismiss #1", result_var="dismiss1")
134
135     response = get_active_element(session)
136     assert_error(response, "unexpected alert open")
137     assert_dialog_handled(session, "dismiss #1")
138     assert session.execute_script("return dismiss1") is None
139
140     create_dialog("confirm", text="dismiss #2", result_var="dismiss2")
141
142     response = get_active_element(session)
143     assert_error(response, "unexpected alert open")
144     assert_dialog_handled(session, "dismiss #2")
145     assert session.execute_script("return dismiss2") is False
146
147     create_dialog("prompt", text="dismiss #3", result_var="dismiss3")
148
149     response = get_active_element(session)
150     assert_error(response, "unexpected alert open")
151     assert_dialog_handled(session, "dismiss #3")
152     assert session.execute_script("return dismiss3") is None
153
154
155 # > [...]
156 # > 3. Let active element be the active element of the current browsing
157 # >    context's document element.
158 # > 4. Let active web element be the JSON Serialization of active element.
159 # > 5. Return success with data active web element.
160 def test_success_document(session):
161     session.url = inline("""
162         <body>
163             <h1>Heading</h1>
164             <input />
165             <input />
166             <input style="opacity: 0" />
167             <p>Another element</p>
168         </body>""")
169     response = get_active_element(session)
170     assert_is_active_element(session, response)
171
172
173 def test_sucess_input(session):
174     session.url = inline("""
175         <body>
176             <h1>Heading</h1>
177             <input autofocus />
178             <input style="opacity: 0" />
179             <p>Another element</p>
180         </body>""")
181     response = get_active_element(session)
182     assert_is_active_element(session, response)
183
184
185 def test_sucess_input_non_interactable(session):
186     session.url = inline("""
187         <body>
188             <h1>Heading</h1>
189             <input />
190             <input style="opacity: 0" autofocus />
191             <p>Another element</p>
192         </body>""")
193     response = get_active_element(session)
194     assert_is_active_element(session, response)
195
196
197 def test_success_explicit_focus(session):
198     session.url = inline("""
199         <body>
200             <h1>Heading</h1>
201             <input />
202             <iframe></iframe>
203         </body>""")
204
205     session.execute_script("document.body.getElementsByTagName('h1')[0].focus()")
206     response = get_active_element(session)
207     assert_is_active_element(session, response)
208
209     session.execute_script("document.body.getElementsByTagName('input')[0].focus()")
210     response = get_active_element(session)
211     assert_is_active_element(session, response)
212
213     session.execute_script("document.body.getElementsByTagName('iframe')[0].focus()")
214     response = get_active_element(session)
215     assert_is_active_element(session, response)
216
217     session.execute_script("document.body.getElementsByTagName('iframe')[0].focus();")
218     session.execute_script("""
219         var iframe = document.body.getElementsByTagName('iframe')[0];
220         if (iframe.remove) {
221           iframe.remove();
222         } else {
223           iframe.removeNode(true);
224         }""")
225     response = get_active_element(session)
226     assert_is_active_element(session, response)
227
228     session.execute_script("document.body.appendChild(document.createElement('textarea'))")
229     response = get_active_element(session)
230     assert_is_active_element(session, response)
231
232
233 def test_success_iframe_content(session):
234     session.url = inline("<body></body>")
235     session.execute_script("""
236         let iframe = document.createElement('iframe');
237         document.body.appendChild(iframe);
238         let input = iframe.contentDocument.createElement('input');
239         iframe.contentDocument.body.appendChild(input);
240         input.focus();
241         """)
242
243     response = get_active_element(session)
244     assert_is_active_element(session, response)
245
246
247 def test_sucess_without_body(session):
248     session.url = inline("<body></body>")
249     session.execute_script("""
250         if (document.body.remove) {
251           document.body.remove();
252         } else {
253           document.body.removeNode(true);
254         }""")
255
256     response = get_active_element(session)
257     assert_is_active_element(session, response)