7416136fadf0df647fe3ffe9bac57910998a310c
[WebKit-https.git] / WebDriverTests / imported / w3c / webdriver / tests / navigation / get_title.py
1 import pytest
2 import time
3
4 from tests.support.asserts import assert_error, assert_success, assert_dialog_handled
5 from tests.support.fixtures import create_dialog
6 from tests.support.inline import inline
7
8 def read_global(session, name):
9     return session.execute_script("return %s;" % name)
10
11 # 1. If the current top-level browsing context is no longer open, return error
12 #    with error code no such window.
13 def test_title_from_closed_context(session, create_window):
14     new_window = create_window()
15     session.window_handle = new_window
16     session.close()
17
18     result = session.transport.send("GET",
19                                     "session/%s/title" % session.session_id)
20
21     assert_error(result, "no such window")
22
23 # [...]
24 # 2. Handle any user prompts and return its value if it is an error.
25 # [...]
26 # In order to handle any user prompts a remote end must take the following
27 # steps:
28 # 2. Run the substeps of the first matching user prompt handler:
29 #
30 #    [...]
31 #    - dismiss state
32 #      1. Dismiss the current user prompt.
33 #    [...]
34 #
35 # 3. Return success.
36 def test_title_handle_prompt_dismiss(new_session, add_browser_capabilites):
37     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({"unhandledPromptBehavior": "dismiss"})}})
38     session.url = inline("<title>WD doc title</title>")
39
40     expected_title = read_global(session, "document.title")
41     create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
42
43     result = session.transport.send("GET",
44                                     "session/%s/title" % session.session_id)
45
46     assert_success(result, expected_title)
47     assert_dialog_handled(session, "dismiss #1")
48     assert read_global(session, "dismiss1") == None
49
50     expected_title = read_global(session, "document.title")
51     create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
52
53     result = session.transport.send("GET",
54                                     "session/%s/title" % session.session_id)
55
56     assert_success(result, expected_title)
57     assert_dialog_handled(session, "dismiss #2")
58     assert read_global(session, "dismiss2") == None
59
60     expected_title = read_global(session, "document.title")
61     create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
62
63     result = session.transport.send("GET",
64                                     "session/%s/title" % session.session_id)
65
66     assert_success(result, expected_title)
67     assert_dialog_handled(session, "dismiss #3")
68     assert read_global(session, "dismiss3") == None
69
70 # [...]
71 # 2. Handle any user prompts and return its value if it is an error.
72 # [...]
73 # In order to handle any user prompts a remote end must take the following
74 # steps:
75 # 2. Run the substeps of the first matching user prompt handler:
76 #
77 #    [...]
78 #    - accept state
79 #      1. Accept the current user prompt.
80 #    [...]
81 #
82 # 3. Return success.
83 def test_title_handle_prompt_accept(new_session, add_browser_capabilites):
84     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({"unhandledPromptBehavior": "accept"})}})
85     session.url = inline("<title>WD doc title</title>")
86     create_dialog(session)("alert", text="accept #1", result_var="accept1")
87
88     expected_title = read_global(session, "document.title")
89     result = session.transport.send("GET",
90                                     "session/%s/title" % session.session_id)
91
92     assert_success(result, expected_title)
93     assert_dialog_handled(session, "accept #1")
94     assert read_global(session, "accept1") == None
95
96     expected_title = read_global(session, "document.title")
97     create_dialog(session)("confirm", text="accept #2", result_var="accept2")
98
99     result = session.transport.send("GET",
100                                     "session/%s/title" % session.session_id)
101
102     assert_success(result, expected_title)
103     assert_dialog_handled(session, "accept #2")
104     assert read_global(session, "accept2"), True
105
106     expected_title = read_global(session, "document.title")
107     create_dialog(session)("prompt", text="accept #3", result_var="accept3")
108
109     result = session.transport.send("GET",
110                                     "session/%s/title" % session.session_id)
111
112     assert_success(result, expected_title)
113     assert_dialog_handled(session, "accept #3")
114     assert read_global(session, "accept3") == ""
115
116 # [...]
117 # 2. Handle any user prompts and return its value if it is an error.
118 # [...]
119 # In order to handle any user prompts a remote end must take the following
120 # steps:
121 # 2. Run the substeps of the first matching user prompt handler:
122 #
123 #    [...]
124 #    - missing value default state
125 #    - not in the table of simple dialogs
126 #      1. Dismiss the current user prompt.
127 #      2. Return error with error code unexpected alert open.
128 def test_title_handle_prompt_missing_value(session, create_dialog):
129     session.url = inline("<title>WD doc title</title>")
130     create_dialog("alert", text="dismiss #1", result_var="dismiss1")
131
132     result = session.transport.send("GET",
133                                     "session/%s/title" % session.session_id)
134
135     assert_error(result, "unexpected alert open")
136     assert_dialog_handled(session, "dismiss #1")
137     assert read_global(session, "dismiss1") == None
138
139     create_dialog("confirm", text="dismiss #2", result_var="dismiss2")
140
141     result = session.transport.send("GET",
142                                     "session/%s/title" % session.session_id)
143
144     assert_error(result, "unexpected alert open")
145     assert_dialog_handled(session, "dismiss #2")
146     assert read_global(session, "dismiss2") == False
147
148     create_dialog("prompt", text="dismiss #3", result_var="dismiss3")
149
150     result = session.transport.send("GET",
151                                     "session/%s/title" % session.session_id)
152
153     assert_error(result, "unexpected alert open")
154     assert_dialog_handled(session, "dismiss #3")
155     assert read_global(session, "dismiss3") == None
156
157 # The behavior of the `window.print` function is platform-dependent and may not
158 # trigger the creation of a dialog at all. Therefore, this test should only be
159 # run in contexts that support the dialog (a condition that may not be
160 # determined automatically).
161 #def test_title_with_non_simple_dialog(session):
162 #    document = "<title>With non-simple dialog</title><h2>Hello</h2>"
163 #    spawn = """
164 #        var done = arguments[0];
165 #        setTimeout(function() {
166 #            done();
167 #        }, 0);
168 #        setTimeout(function() {
169 #            window['print']();
170 #        }, 0);
171 #    """
172 #    session.url = inline(document)
173 #    session.execute_async_script(spawn)
174 #
175 #    result = session.transport.send("GET",
176 #                                    "session/%s/title" % session.session_id)
177 #    assert_error(result, "unexpected alert open")
178
179 # [...]
180 # 3. Let title be the initial value of the title IDL attribute of the current
181 #    top-level browsing context's active document.
182 # 4. Return success with data title.
183 # [...]
184 # The title attribute must, on getting, run the following algorithm:
185 # [...]
186 # 2. Otherwise, let value be the child text content of the title element [...]
187 # [...]
188 # 4. Return value.
189 def test_title_from_top_context(session):
190     session.url = inline("<title>Foobar</title><h2>Hello</h2>")
191
192     result = session.transport.send("GET",
193                                     "session/%s/title" % session.session_id)
194     assert_success(result, read_global(session, "document.title"))
195
196 # [...]
197 # 3. Let title be the initial value of the title IDL attribute of the current
198 #    top-level browsing context's active document.
199 # 4. Return success with data title.
200 # [...]
201 # The title attribute must, on getting, run the following algorithm:
202 # [...]
203 # 2. Otherwise, let value be the child text content of the title element [...]
204 #
205 #    The title element of a document is the first title element in the document
206 #    (in tree order), if there is one, or null otherwise.
207 #
208 # [...]
209 # 4. Return value.
210 def test_title_with_duplicate_element(session):
211     session.url = inline("<title>First</title><title>Second</title>")
212
213     result = session.transport.send("GET",
214                                     "session/%s/title" % session.session_id)
215
216     assert_success(result, read_global(session, "document.title"))
217
218 # [...]
219 # 3. Let title be the initial value of the title IDL attribute of the current
220 #    top-level browsing context's active document.
221 # 4. Return success with data title.
222 # [...]
223 # The title attribute must, on getting, run the following algorithm:
224 # [...]
225 # 2. Otherwise, let value be the child text content of the title element, or
226 #    the empty string if the title element is null.
227 # [...]
228 # 4. Return value.
229 def test_title_without_element(session):
230     session.url = inline("<h2>Hello</h2>")
231
232     result = session.transport.send("GET",
233                                     "session/%s/title" % session.session_id)
234
235     assert_success(result, read_global(session, "document.title"))
236
237 # [...]
238 # 3. Let title be the initial value of the title IDL attribute of the current
239 #    top-level browsing context's active document.
240 # 4. Return success with data title.
241 def test_title_after_modification(session):
242     session.url = inline("<title>Initial</title><h2>Hello</h2>")
243     session.execute_script("document.title = 'updated'")
244
245     result = session.transport.send("GET",
246                                     "session/%s/title" % session.session_id)
247
248     assert_success(result, read_global(session, "document.title"))
249
250 # [...]
251 # 3. Let title be the initial value of the title IDL attribute of the current
252 #    top-level browsing context's active document.
253 # 4. Return success with data title.
254 # [...]
255 # The title attribute must, on getting, run the following algorithm:
256 # [...]
257 # 2. Otherwise, let value be the child text content of the title element [...]
258 # 3. Strip and collapse ASCII whitespace in value.
259 # 4. Return value.
260 def test_title_strip_and_collapse(session):
261     document = "<title>   a b\tc\nd\t \n e\t\n </title><h2>Hello</h2>"
262     session.url = inline(document)
263
264     result = session.transport.send("GET",
265                                     "session/%s/title" % session.session_id)
266
267     assert_success(result, read_global(session, "document.title"))
268
269 # [...]
270 # 3. Let title be the initial value of the title IDL attribute of the current
271 #    top-level browsing context's active document.
272 # 4. Return success with data title.
273 def test_title_from_frame(session, create_frame):
274     session.url = inline("<title>Parent</title>parent")
275
276     session.switch_frame(create_frame())
277     session.switch_frame(create_frame())
278
279     result = session.transport.send("GET",
280                                     "session/%s/title" % session.session_id)
281
282     assert_success(result, read_global(session, "document.title"))