Skip to content

Commit 965e528

Browse files
[py] Add extra attributes to pointer down and pointer move actions
1 parent 122c9f9 commit 965e528

4 files changed

Lines changed: 294 additions & 18 deletions

File tree

Lines changed: 122 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,122 @@
1+
<!--This page has been copied from https://github.com/web-platform-tests/wpt/blob/18ce0b235b34d94aa609088329f0e18499ed5847/webdriver/tests/perform_actions/support/test_actions_pointer_wdspec.html-->
2+
3+
<!doctype html>
4+
<meta charset=utf-8>
5+
<html>
6+
7+
<head>
8+
<title>Test Actions</title>
9+
<style>
10+
div {
11+
padding: 0px;
12+
margin: 0px;
13+
}
14+
15+
#trackPointer {
16+
position: fixed;
17+
}
18+
19+
#resultContainer {
20+
width: 600px;
21+
height: 60px;
22+
}
23+
24+
.area {
25+
width: 100px;
26+
height: 50px;
27+
background-color: #ccc;
28+
}
29+
</style>
30+
<script>
31+
"use strict";
32+
var els = {};
33+
var allEvents = { events: [] };
34+
function displayMessage(message) {
35+
document.getElementById("events").innerHTML = "<p>" + message + "</p>";
36+
}
37+
38+
function appendMessage(message) {
39+
document.getElementById("events").innerHTML += "<p>" + message + "</p>";
40+
}
41+
42+
function recordPointerEvent(event) {
43+
if (event.type === "contextmenu") {
44+
event.preventDefault();
45+
}
46+
allEvents.events.push({
47+
"type": event.type,
48+
"button": event.button,
49+
"buttons": event.buttons,
50+
"pageX": event.pageX,
51+
"pageY": event.pageY,
52+
"ctrlKey": event.ctrlKey,
53+
"metaKey": event.metaKey,
54+
"altKey": event.altKey,
55+
"shiftKey": event.shiftKey,
56+
"target": event.target.id,
57+
"pointerType": event.pointerType,
58+
"width": event.width,
59+
"height": event.height,
60+
"pressure": event.pressure,
61+
"tangentialPressure": event.tangentialPressure,
62+
"tiltX": event.tiltX,
63+
"tiltY": event.tiltY,
64+
"twist": event.twist,
65+
"altitudeAngle": event.altitudeAngle,
66+
"azimuthAngle": event.azimuthAngle
67+
});
68+
appendMessage(event.type + " " +
69+
"button: " + event.button + ", " +
70+
"pageX: " + event.pageX + ", " +
71+
"pageY: " + event.pageY + ", " +
72+
"button: " + event.button + ", " +
73+
"buttons: " + event.buttons + ", " +
74+
"ctrlKey: " + event.ctrlKey + ", " +
75+
"altKey: " + event.altKey + ", " +
76+
"metaKey: " + event.metaKey + ", " +
77+
"shiftKey: " + event.shiftKey + ", " +
78+
"target id: " + event.target.id + ", " +
79+
"pointerType: " + event.pointerType + ", " +
80+
"width: " + event.width + ", " +
81+
"height: " + event.height + ", " +
82+
"pressure: " + event.pressure + ", " +
83+
"tangentialPressure: " + event.tangentialPressure + ", " +
84+
"tiltX: " + event.tiltX + ", " +
85+
"tiltY: " + event.tiltY + ", " +
86+
"twist: " + event.twist + ", " +
87+
"altitudeAngle: " + event.altitudeAngle + ", " +
88+
"azimuthAngle: " + event.azimuthAngle);
89+
}
90+
91+
function resetEvents() {
92+
allEvents.events.length = 0;
93+
displayMessage("");
94+
}
95+
96+
document.addEventListener("DOMContentLoaded", function () {
97+
var pointerArea = document.getElementById("pointerArea");
98+
pointerArea.addEventListener("pointerdown", recordPointerEvent);
99+
pointerArea.addEventListener("pointermove", recordPointerEvent);
100+
pointerArea.addEventListener("pointerup", recordPointerEvent);
101+
pointerArea.addEventListener("pointerover", recordPointerEvent);
102+
pointerArea.addEventListener("pointerenter", recordPointerEvent);
103+
pointerArea.addEventListener("pointerout", recordPointerEvent);
104+
pointerArea.addEventListener("pointerleave", recordPointerEvent);
105+
});
106+
</script>
107+
</head>
108+
109+
<body>
110+
<div id="trackPointer" class="block"></div>
111+
<div>
112+
<h2>PointerReporter</h2>
113+
<div id="pointerArea" class="area">
114+
</div>
115+
</div>
116+
<div id="resultContainer">
117+
<h2>Events</h2>
118+
<div id="events"></div>
119+
</div>
120+
</body>
121+
122+
</html>

py/selenium/webdriver/common/actions/pointer_actions.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -37,15 +37,25 @@ def __init__(self, source=None, duration=250):
3737
self._duration = duration
3838
super(PointerActions, self).__init__(source)
3939

40-
def pointer_down(self, button=MouseButton.LEFT):
41-
self._button_action("create_pointer_down", button=button)
40+
def pointer_down(self, button=MouseButton.LEFT, width=None, height=None, pressure=None,
41+
tangential_pressure=None, tilt_x=None, tilt_y=None, twist=None,
42+
altitude_angle=None, azimuth_angle=None):
43+
self._button_action("create_pointer_down", button=button, width=width, height=height,
44+
pressure=pressure, tangential_pressure=tangential_pressure,
45+
tilt_x=tilt_x, tilt_y=tilt_y, twist=twist,
46+
altitude_angle=altitude_angle, azimuth_angle=azimuth_angle)
47+
return self
4248

4349
def pointer_up(self, button=MouseButton.LEFT):
4450
self._button_action("create_pointer_up", button=button)
51+
return self
4552

46-
def move_to(self, element, x=None, y=None):
53+
def move_to(self, element, x=0, y=0, width=None, height=None, pressure=None,
54+
tangential_pressure=None, tilt_x=None, tilt_y=None, twist=None,
55+
altitude_angle=None, azimuth_angle=None):
4756
if not isinstance(element, WebElement):
4857
raise AttributeError("move_to requires a WebElement")
58+
4959
if x or y:
5060
el_rect = element.rect
5161
left_offset = el_rect['width'] / 2
@@ -55,7 +65,12 @@ def move_to(self, element, x=None, y=None):
5565
else:
5666
left = 0
5767
top = 0
58-
self.source.create_pointer_move(origin=element, duration=self._duration, x=int(left), y=int(top))
68+
69+
self.source.create_pointer_move(origin=element, duration=self._duration, x=int(left), y=int(top),
70+
width=width, height=height, pressure=pressure,
71+
tangential_pressure=tangential_pressure,
72+
tilt_x=tilt_x, tilt_y=tilt_y, twist=twist,
73+
altitude_angle=altitude_angle, azimuth_angle=azimuth_angle)
5974
return self
6075

6176
def move_by(self, x, y):
@@ -103,7 +118,7 @@ def pause(self, duration=0):
103118
self.source.create_pause(duration)
104119
return self
105120

106-
def _button_action(self, action, button=MouseButton.LEFT):
121+
def _button_action(self, action, **kwargs):
107122
meth = getattr(self.source, action)
108-
meth(button)
123+
meth(**kwargs)
109124
return self

py/selenium/webdriver/common/actions/pointer_input.py

Lines changed: 20 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,19 +33,22 @@ def __init__(self, kind, name):
3333
self.kind = kind
3434
self.name = name
3535

36-
def create_pointer_move(self, duration=DEFAULT_MOVE_DURATION, x=None, y=None, origin=None):
36+
def create_pointer_move(self, duration=DEFAULT_MOVE_DURATION, x=0, y=0, origin=None, **kwargs):
3737
action = dict(type="pointerMove", duration=duration)
3838
action["x"] = x
3939
action["y"] = y
40+
action.update(**kwargs)
4041
if isinstance(origin, WebElement):
4142
action["origin"] = {"element-6066-11e4-a52e-4f735466cecf": origin.id}
4243
elif origin:
4344
action["origin"] = origin
4445

45-
self.add_action(action)
46+
self.add_action(self._convert_keys(action))
4647

47-
def create_pointer_down(self, button):
48-
self.add_action({"type": "pointerDown", "duration": 0, "button": button})
48+
def create_pointer_down(self, **kwargs):
49+
data = dict(type="pointerDown", duration=0)
50+
data.update(**kwargs)
51+
self.add_action(self._convert_keys(data))
4952

5053
def create_pointer_up(self, button):
5154
self.add_action({"type": "pointerUp", "duration": 0, "button": button})
@@ -61,3 +64,16 @@ def encode(self):
6164
"parameters": {"pointerType": self.kind},
6265
"id": self.name,
6366
"actions": [acts for acts in self.actions]}
67+
68+
def _convert_keys(self, actions):
69+
out = {}
70+
for k in actions.keys():
71+
if actions[k] is None:
72+
continue
73+
if k == "x" or k == "y":
74+
out[k] = int(actions[k])
75+
continue
76+
splits = k.split('_')
77+
new_key = splits[0] + ''.join(v.title() for v in splits[1:])
78+
out[new_key] = actions[k]
79+
return out

0 commit comments

Comments
 (0)