Unreviewed. Update W3C WebDriver imported tests.
[WebKit-https.git] / WebDriverTests / imported / w3c / webdriver / tests / state / get_element_attribute.py
1 # META: timeout=long
2
3 import pytest
4
5 from tests.support.asserts import assert_error, assert_success, assert_dialog_handled
6 from tests.support.fixtures import create_dialog
7 from tests.support.inline import inline
8
9
10 def get_attribute(session, element, attr):
11     return session.transport.send("GET", "session/{session_id}/element/{element_id}/attribute/{attr}"
12                                   .format(session_id=session.session_id,
13                                           element_id=element,
14                                           attr=attr))
15
16
17 # 13.2 Get Element Attribute
18
19 def test_no_browsing_context(session, create_window):
20     # 13.2 step 1
21     session.window_handle = create_window()
22     session.close()
23
24     result = get_attribute(session, "foo", "id")
25
26     assert_error(result, "no such window")
27
28
29 def test_handle_prompt_dismiss(new_session, add_browser_capabilites):
30     # 13.2 step 2
31     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({"unhandledPromptBehavior": "dismiss"})}})
32     session.url = inline("<input id=foo>")
33     element = session.find.css("#foo", all=False)
34
35     create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
36
37     result = get_attribute(session, element.id, "id")
38
39     assert_success(result, "foo")
40     assert_dialog_handled(session, "dismiss #1")
41
42     create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
43
44     result = get_attribute(session, element.id, "id")
45
46     assert_success(result, "foo")
47     assert_dialog_handled(session, "dismiss #2")
48
49     create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
50
51     result = get_attribute(session, element.id, "id")
52
53     assert_success(result, "foo")
54     assert_dialog_handled(session, "dismiss #3")
55
56
57 def test_handle_prompt_accept(new_session, add_browser_capabilites):
58     # 13.2 step 2
59     _, session = new_session({"capabilities": {"alwaysMatch": add_browser_capabilites({"unhandledPromptBehavior": "accept"})}})
60     session.url = inline("<input id=foo>")
61     element = session.find.css("#foo", all=False)
62
63     create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
64
65     result = get_attribute(session, element.id, "id")
66
67     assert_success(result, "foo")
68     assert_dialog_handled(session, "dismiss #1")
69
70     create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
71
72     result = get_attribute(session, element.id, "id")
73
74     assert_success(result, "foo")
75     assert_dialog_handled(session, "dismiss #2")
76
77     create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
78
79     result = get_attribute(session, element.id, "id")
80
81     assert_success(result, "foo")
82     assert_dialog_handled(session, "dismiss #3")
83
84
85 def test_handle_prompt_missing_value(session):
86     # 13.2 step 2
87     session.url = inline("<input id=foo>")
88     element = session.find.css("#foo", all=False)
89
90     create_dialog(session)("alert", text="dismiss #1", result_var="dismiss1")
91
92     result = get_attribute(session, element.id, "id")
93
94     assert_error(result, "unexpected alert open")
95     assert_dialog_handled(session, "dismiss #1")
96
97     create_dialog(session)("confirm", text="dismiss #2", result_var="dismiss2")
98
99     result = get_attribute(session, element.id, "id")
100
101     assert_error(result, "unexpected alert open")
102     assert_dialog_handled(session, "dismiss #2")
103
104     create_dialog(session)("prompt", text="dismiss #3", result_var="dismiss3")
105
106     result = get_attribute(session, element.id, "id")
107
108     assert_error(result, "unexpected alert open")
109     assert_dialog_handled(session, "dismiss #3")
110
111
112 def test_element_not_found(session):
113     # 13.2 Step 3
114     result = get_attribute(session, "foo", "id")
115
116     assert_error(result, "no such element")
117
118
119 def test_element_stale(session):
120     # 13.2 step 4
121     session.url = inline("<input id=foo>")
122     element = session.find.css("input", all=False)
123     session.refresh()
124     result = get_attribute(session, element.id, "id")
125
126     assert_error(result, "stale element reference")
127
128
129 def test_normal(session):
130     # 13.2 Step 5
131     session.url = inline("<input type=checkbox>")
132     element = session.find.css("input", all=False)
133     result = get_attribute(session, element.id, "input")
134     assert_success(result, None)
135     assert False == session.execute_script("return document.querySelector('input').checked")
136
137     # Check we are not returning the property which will have a different value
138     element.click()
139     assert True == session.execute_script("return document.querySelector('input').checked")
140     result = get_attribute(session, element.id, "input")
141     assert_success(result, None)
142
143
144 @pytest.mark.parametrize("tag,attrs", [
145     ("audio", ["autoplay", "controls", "loop", "muted"]),
146     ("button", ["autofocus", "disabled", "formnovalidate"]),
147     ("details", ["open"]),
148     ("dialog", ["open"]),
149     ("fieldset", ["disabled"]),
150     ("form", ["novalidate"]),
151     ("iframe", ["allowfullscreen"]),
152     ("img", ["ismap"]),
153     ("input", ["autofocus", "checked", "disabled", "formnovalidate", "multiple", "readonly", "required"]),
154     ("menuitem", ["checked", "default", "disabled"]),
155     ("object", ["typemustmatch"]),
156     ("ol", ["reversed"]),
157     ("optgroup", ["disabled"]),
158     ("option", ["disabled", "selected"]),
159     ("script", ["async", "defer"]),
160     ("select", ["autofocus", "disabled", "multiple", "required"]),
161     ("textarea", ["autofocus", "disabled", "readonly", "required"]),
162     ("track", ["default"]),
163     ("video", ["autoplay", "controls", "loop", "muted"])
164 ])
165 def test_boolean_attribute(session, tag, attrs):
166     # 13.2 Step 5
167     for attr in attrs:
168         session.url = inline("<{0} {1}>".format(tag, attr))
169
170         element = session.find.css(tag, all=False)
171         result = result = get_attribute(session, element.id, attr)
172         assert_success(result, "true")
173
174
175 def test_global_boolean_attributes(session):
176     # 13.2 Step 5
177     session.url = inline("<p hidden>foo")
178     element = session.find.css("p", all=False)
179     result = result = get_attribute(session, element.id, "hidden")
180
181     assert_success(result, "true")
182
183     session.url = inline("<p>foo")
184     element = session.find.css("p", all=False)
185     result = result = get_attribute(session, element.id, "hidden")
186     assert_success(result, None)
187
188     session.url = inline("<p itemscope>foo")
189     element = session.find.css("p", all=False)
190     result = result = get_attribute(session, element.id, "itemscope")
191
192     assert_success(result, "true")
193
194     session.url = inline("<p>foo")
195     element = session.find.css("p", all=False)
196     result = result = get_attribute(session, element.id, "itemscope")
197     assert_success(result, None)