"Fossies" - the Fresh Open Source Software Archive 
Member "selenium-selenium-4.8.1/py/test/selenium/webdriver/common/w3c_interaction_tests.py" (17 Feb 2023, 12982 Bytes) of package /linux/www/selenium-selenium-4.8.1.tar.gz:
As a special service "Fossies" has tried to format the requested source page into HTML format using (guessed) Python source code syntax highlighting (style:
standard) with prefixed line numbers.
Alternatively you can here
view or
download the uninterpreted source code file.
See also the last
Fossies "Diffs" side-by-side code changes report for "w3c_interaction_tests.py":
4.8.0_vs_4.8.1.
1 # Licensed to the Software Freedom Conservancy (SFC) under one
2 # or more contributor license agreements. See the NOTICE file
3 # distributed with this work for additional information
4 # regarding copyright ownership. The SFC licenses this file
5 # to you under the Apache License, Version 2.0 (the
6 # "License"); you may not use this file except in compliance
7 # with the License. You may obtain a copy of the License at
8 #
9 # http://www.apache.org/licenses/LICENSE-2.0
10 #
11 # Unless required by applicable law or agreed to in writing,
12 # software distributed under the License is distributed on an
13 # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
14 # KIND, either express or implied. See the License for the
15 # specific language governing permissions and limitations
16 # under the License.
17
18 import pytest
19
20 from selenium.webdriver.common.actions import interaction
21 from selenium.webdriver.common.actions.action_builder import ActionBuilder
22 from selenium.webdriver.common.actions.pointer_input import PointerInput
23 from selenium.webdriver.common.actions.wheel_input import WheelInput
24 from selenium.webdriver.common.by import By
25 from selenium.webdriver.common.keys import Keys
26 from selenium.webdriver.support.ui import WebDriverWait
27
28
29 def test_should_be_able_to_get_pointer_and_keyboard_inputs(driver, pages):
30 actions = ActionBuilder(driver)
31 pointers = actions.pointer_inputs
32 keyboards = actions.key_inputs
33
34 assert pointers is not None
35 assert keyboards is not None
36
37
38 @pytest.mark.xfail_safari
39 @pytest.mark.xfail_remote
40 def test_sending_keys_to_active_element_with_modifier(driver, pages):
41 pages.load("formPage.html")
42 e = driver.find_element(By.ID, "working")
43 e.click()
44
45 actions = ActionBuilder(driver)
46 key_action = actions.key_action
47 key_action.key_down(Keys.SHIFT).send_keys("abc").key_up(Keys.SHIFT)
48
49 actions.perform()
50
51 assert "ABC" == e.get_attribute("value")
52
53
54 @pytest.mark.xfail_firefox
55 @pytest.mark.xfail_remote
56 def test_can_create_pause_action_on_keyboard(driver, pages):
57 # If we don't get an error and takes less than 3 seconds to run, we are good
58 import datetime
59
60 start = datetime.datetime.now()
61 actions1 = ActionBuilder(driver)
62 key_actions = actions1.key_action
63 key_actions.pause(1)
64 actions1.perform()
65 finish = datetime.datetime.now()
66 assert (finish - start).seconds <= 3
67
68 # Add a filler step
69 actions2 = ActionBuilder(driver)
70 key_action = actions2.key_action
71 key_action.pause()
72 actions2.perform()
73
74
75 def test_can_create_pause_action_on_pointer(driver, pages):
76 # If we don't get an error and takes less than 3 seconds to run, we are good
77 import datetime
78
79 start = datetime.datetime.now()
80 actions1 = ActionBuilder(driver)
81 key_actions = actions1.pointer_action
82 key_actions.pause(1)
83 actions1.perform()
84 finish = datetime.datetime.now()
85 assert (finish - start).seconds <= 3
86
87 # Add a filler step
88 actions2 = ActionBuilder(driver)
89 key_action = actions2.pointer_action
90 key_action.pause()
91 actions2.perform()
92
93
94 def test_can_clear_actions(driver, pages):
95 actions = ActionBuilder(driver)
96 actions.clear_actions()
97
98
99 def test_move_and_click(driver, pages):
100 pages.load("javascriptPage.html")
101 toClick = driver.find_element(By.ID, "clickField")
102
103 actions = ActionBuilder(driver)
104 pointer = actions.pointer_action
105
106 pointer.move_to(toClick).click()
107
108 actions.perform()
109 assert "Clicked" == toClick.get_attribute("value")
110
111
112 def test_drag_and_drop(driver, pages):
113 """Copied from org.openqa.selenium.interactions.TestBasicMouseInterface."""
114 element_available_timeout = 15
115 wait = WebDriverWait(driver, element_available_timeout)
116 pages.load("droppableItems.html")
117 wait.until(lambda dr: _is_element_available(driver, "draggable"))
118
119 if not _is_element_available(driver, "draggable"):
120 raise AssertionError("Could not find draggable element after 15 seconds.")
121
122 toDrag = driver.find_element(By.ID, "draggable")
123 dropInto = driver.find_element(By.ID, "droppable")
124 actions = ActionBuilder(driver)
125 pointer = actions.pointer_action
126 pointer.click_and_hold(toDrag).move_to(dropInto).release()
127
128 actions.perform()
129
130 dropInto = driver.find_element(By.ID, "droppable")
131 text = dropInto.find_element(By.TAG_NAME, "p").text
132 assert "Dropped!" == text
133
134
135 def test_context_click(driver, pages):
136 pages.load("javascriptPage.html")
137 toContextClick = driver.find_element(By.ID, "doubleClickField")
138
139 actions = ActionBuilder(driver)
140 pointer = actions.pointer_action
141 pointer.context_click(toContextClick)
142
143 actions.perform()
144 assert "ContextClicked" == toContextClick.get_attribute("value")
145
146
147 @pytest.mark.xfail_firefox
148 @pytest.mark.xfail_safari
149 @pytest.mark.xfail_remote(reason="Fails on Travis")
150 @pytest.mark.xfail_chrome(reason="Fails on Travis")
151 def test_double_click(driver, pages):
152 """Copied from org.openqa.selenium.interactions.TestBasicMouseInterface."""
153 pages.load("javascriptPage.html")
154 toDoubleClick = driver.find_element(By.ID, "doubleClickField")
155
156 actions = ActionBuilder(driver)
157 pointer = actions.pointer_action
158
159 pointer.double_click(toDoubleClick)
160
161 actions.perform()
162 assert "DoubleClicked" == toDoubleClick.get_attribute("value")
163
164
165 def test_dragging_element_with_mouse_moves_it_to_another_list(driver, pages):
166 _perform_drag_and_drop_with_mouse(driver, pages)
167 dragInto = driver.find_element(By.ID, "sortable1")
168 assert 6 == len(dragInto.find_elements(By.TAG_NAME, "li"))
169
170
171 def test_dragging_element_with_mouse_fires_events(driver, pages):
172 _perform_drag_and_drop_with_mouse(driver, pages)
173 dragReporter = driver.find_element(By.ID, "dragging_reports")
174 assert "Nothing happened. DragOut DropIn RightItem 3" == dragReporter.text
175
176
177 @pytest.mark.xfail_firefox
178 @pytest.mark.xfail_remote
179 def test_pen_pointer_properties(driver, pages):
180 pages.load("pointerActionsPage.html")
181 pointerArea = driver.find_element(By.CSS_SELECTOR, "#pointerArea")
182 pointer_input = PointerInput(interaction.POINTER_PEN, "pen")
183 actions = ActionBuilder(driver, mouse=pointer_input)
184 center = _get_inview_center(pointerArea.rect, _get_viewport_rect(driver))
185 actions.pointer_action.move_to(pointerArea).pointer_down(pressure=0.36, tilt_x=-72, tilt_y=9, twist=86).move_to(
186 pointerArea, x=5, y=10
187 ).pointer_up().move_to(pointerArea, x=5, y=10)
188 actions.perform()
189 events = _get_events(driver)
190 assert events[3]["type"] == "pointerdown"
191 assert events[3]["pageX"] == pytest.approx(center["x"], abs=1.0)
192 assert events[3]["pageY"] == pytest.approx(center["y"], abs=1.0)
193 assert events[3]["target"] == "pointerArea"
194 assert events[3]["pointerType"] == "pen"
195 # The default value of width and height for mouse and pen inputs is 1
196 assert round(events[3]["width"], 2) == 1
197 assert round(events[3]["height"], 2) == 1
198 assert round(events[3]["pressure"], 2) == 0.36
199 assert events[3]["tiltX"] == -72
200 assert events[3]["tiltY"] == 9
201 assert events[3]["twist"] == 86
202 assert events[6]["type"] == "pointermove"
203 assert events[6]["target"] == "pointerArea"
204 assert events[6]["pointerType"] == "pen"
205 assert round(events[6]["width"], 2) == 1
206 assert round(events[6]["height"], 2) == 1
207 # The default value of pressure for all inputs is 0.5, other properties are 0
208 assert round(events[6]["pressure"], 2) == 0.5
209 assert events[6]["tiltX"] == 0
210 assert events[6]["tiltY"] == 0
211 assert events[6]["twist"] == 0
212
213
214 @pytest.mark.xfail_firefox
215 @pytest.mark.xfail_remote
216 def test_touch_pointer_properties(driver, pages):
217 pages.load("pointerActionsPage.html")
218 pointerArea = driver.find_element(By.CSS_SELECTOR, "#pointerArea")
219 center = _get_inview_center(pointerArea.rect, _get_viewport_rect(driver))
220 touch_input = PointerInput(interaction.POINTER_TOUCH, "touch")
221 touch_chain = ActionBuilder(driver, mouse=touch_input)
222 touch_chain.pointer_action.move_to(pointerArea).pointer_down(
223 width=23, height=31, pressure=0.78, tilt_x=21, tilt_y=-8, twist=355
224 ).move_to(
225 pointerArea, x=10, y=10, width=39, height=35, pressure=0.91, tilt_x=-19, tilt_y=62, twist=345
226 ).pointer_up().move_to(
227 pointerArea, x=15, y=15
228 )
229 touch_chain.perform()
230 events = _get_events(driver)
231 assert len(events) == 7
232 event_types = [e["type"] for e in events]
233 assert [
234 "pointerover",
235 "pointerenter",
236 "pointerdown",
237 "pointermove",
238 "pointerup",
239 "pointerout",
240 "pointerleave",
241 ] == event_types
242 assert events[2]["type"] == "pointerdown"
243 assert events[2]["pageX"] == pytest.approx(center["x"], abs=1.0)
244 assert events[2]["pageY"] == pytest.approx(center["y"], abs=1.0)
245 assert events[2]["target"] == "pointerArea"
246 assert events[2]["pointerType"] == "touch"
247 assert round(events[2]["width"], 2) == 23
248 assert round(events[2]["height"], 2) == 31
249 assert round(events[2]["pressure"], 2) == 0.78
250 assert events[2]["tiltX"] == 21
251 assert events[2]["tiltY"] == -8
252 assert events[2]["twist"] == 355
253 assert events[3]["type"] == "pointermove"
254 assert events[3]["pageX"] == pytest.approx(center["x"] + 10, abs=1.0)
255 assert events[3]["pageY"] == pytest.approx(center["y"] + 10, abs=1.0)
256 assert events[3]["target"] == "pointerArea"
257 assert events[3]["pointerType"] == "touch"
258 assert round(events[3]["width"], 2) == 39
259 assert round(events[3]["height"], 2) == 35
260 assert round(events[3]["pressure"], 2) == 0.91
261 assert events[3]["tiltX"] == -19
262 assert events[3]["tiltY"] == 62
263 assert events[3]["twist"] == 345
264
265
266 @pytest.mark.xfail_firefox
267 @pytest.mark.xfail_remote
268 def test_can_scroll_mouse_wheel(driver, pages):
269 pages.load("scrollingPage.html")
270 driver.execute_script("document.scrollingElement.scrollTop = 0")
271 scrollable = driver.find_element(By.CSS_SELECTOR, "#scrollable")
272
273 wheel_input = WheelInput("wheel")
274 actions = ActionBuilder(driver, wheel=wheel_input)
275 actions.wheel_action.scroll(0, 0, 5, 10, 0, scrollable)
276
277 actions.perform()
278 events = _get_events(driver)
279 assert len(events) == 1
280 assert events[0]["type"] == "wheel"
281 assert events[0]["deltaX"] >= 5
282 assert events[0]["deltaY"] >= 10
283 assert events[0]["deltaZ"] == 0
284 assert events[0]["target"] == "scrollContent"
285
286
287 def _perform_drag_and_drop_with_mouse(driver, pages):
288 """Copied from org.openqa.selenium.interactions.TestBasicMouseInterface."""
289 pages.load("draggableLists.html")
290 dragReporter = driver.find_element(By.ID, "dragging_reports")
291 toDrag = driver.find_element(By.ID, "rightitem-3")
292 dragInto = driver.find_element(By.ID, "sortable1")
293
294 actions = ActionBuilder(driver)
295 pointer = actions.pointer_action
296 pointer.click_and_hold(toDrag).move_to(driver.find_element(By.ID, "leftitem-4")).move_to(dragInto).release()
297
298 assert "Nothing happened." == dragReporter.text
299
300 actions.perform()
301 assert "Nothing happened. DragOut" in dragReporter.text
302
303
304 def _is_element_available(driver, id):
305 """Copied from org.openqa.selenium.interactions.TestBasicMouseInterface."""
306 try:
307 driver.find_element(By.ID, id)
308 return True
309 except Exception:
310 return False
311
312
313 def _get_events(driver):
314 """Return list of key events recorded in the test_keys_page fixture."""
315 events = driver.execute_script("return allEvents.events;") or []
316 # `key` values in `allEvents` may be escaped (see `escapeSurrogateHalf` in
317 # test_keys_wdspec.html), so this converts them back into unicode literals.
318 for e in events:
319 # example: turn "U+d83d" (6 chars) into u"\ud83d" (1 char)
320 if "key" in e and e["key"].startswith("U+"):
321 key = e["key"]
322 hex_suffix = key[key.index("+") + 1 :]
323 e["key"] = chr(int(hex_suffix, 16))
324
325 # WebKit sets code as 'Unidentified' for unidentified key codes, but
326 # tests expect ''.
327 if "code" in e and e["code"] == "Unidentified":
328 e["code"] = ""
329 return events
330
331
332 def _get_inview_center(elem_rect, viewport_rect):
333 x = {
334 "left": max(0, min(elem_rect["x"], elem_rect["x"] + elem_rect["width"])),
335 "right": min(viewport_rect["width"], max(elem_rect["x"], elem_rect["x"] + elem_rect["width"])),
336 }
337
338 y = {
339 "top": max(0, min(elem_rect["y"], elem_rect["y"] + elem_rect["height"])),
340 "bottom": min(viewport_rect["height"], max(elem_rect["y"], elem_rect["y"] + elem_rect["height"])),
341 }
342
343 return {
344 "x": (x["left"] + x["right"]) / 2,
345 "y": (y["top"] + y["bottom"]) / 2,
346 }
347
348
349 def _get_viewport_rect(driver):
350 return driver.execute_script(
351 """
352 return {
353 height: window.innerHeight || document.documentElement.clientHeight,
354 width: window.innerWidth || document.documentElement.clientWidth,
355 };
356 """
357 )