summaryrefslogtreecommitdiffstats
path: root/testing/marionette/client/marionette_driver/gestures.py
diff options
context:
space:
mode:
Diffstat (limited to 'testing/marionette/client/marionette_driver/gestures.py')
-rw-r--r--testing/marionette/client/marionette_driver/gestures.py93
1 files changed, 93 insertions, 0 deletions
diff --git a/testing/marionette/client/marionette_driver/gestures.py b/testing/marionette/client/marionette_driver/gestures.py
new file mode 100644
index 000000000..55b27ec83
--- /dev/null
+++ b/testing/marionette/client/marionette_driver/gestures.py
@@ -0,0 +1,93 @@
+# This Source Code Form is subject to the terms of the Mozilla Public
+# License, v. 2.0. If a copy of the MPL was not distributed with this
+# file, You can obtain one at http://mozilla.org/MPL/2.0/.
+
+from marionette import MultiActions, Actions
+
+
+def smooth_scroll(marionette_session, start_element, axis, direction,
+ length, increments=None, wait_period=None, scroll_back=None):
+ """
+ :param axis: y or x
+ :param direction: 0 for positive, and -1 for negative
+ :param length: total length of scroll scroll
+ :param increments: Amount to be moved per scrolling
+ :param wait_period: Seconds to wait between scrolling
+ :param scroll_back: Scroll back to original view?
+ """
+ if axis not in ["x", "y"]:
+ raise Exception("Axis must be either 'x' or 'y'")
+ if direction not in [-1, 0]:
+ raise Exception("Direction must either be -1 negative or 0 positive")
+ increments = increments or 100
+ wait_period = wait_period or 0.05
+ scroll_back = scroll_back or False
+ current = 0
+ if axis is "x":
+ if direction is -1:
+ offset = [-increments, 0]
+ else:
+ offset = [increments, 0]
+ else:
+ if direction is -1:
+ offset = [0, -increments]
+ else:
+ offset = [0, increments]
+ action = Actions(marionette_session)
+ action.press(start_element)
+ while (current < length):
+ current += increments
+ action.move_by_offset(*offset).wait(wait_period)
+ if scroll_back:
+ offset = [-value for value in offset]
+ while (current > 0):
+ current -= increments
+ action.move_by_offset(*offset).wait(wait_period)
+ action.release()
+ action.perform()
+
+
+def pinch(marionette_session, element, x1, y1, x2, y2, x3, y3, x4, y4, duration=200):
+ """
+ :param element: target
+ :param x1, y1: 1st finger starting position relative to the target
+ :param x3, y3: 1st finger ending position relative to the target
+ :param x2, y2: 2nd finger starting position relative to the target
+ :param x4, y4: 2nd finger ending position relative to the target
+ :param duration: Amount of time in milliseconds to complete the pinch.
+ """
+ time = 0
+ time_increment = 10
+ if time_increment >= duration:
+ time_increment = duration
+ move_x1 = time_increment*1.0/duration * (x3 - x1)
+ move_y1 = time_increment*1.0/duration * (y3 - y1)
+ move_x2 = time_increment*1.0/duration * (x4 - x2)
+ move_y2 = time_increment*1.0/duration * (y4 - y2)
+ multiAction = MultiActions(marionette_session)
+ action1 = Actions(marionette_session)
+ action2 = Actions(marionette_session)
+ action1.press(element, x1, y1)
+ action2.press(element, x2, y2)
+ while (time < duration):
+ time += time_increment
+ action1.move_by_offset(move_x1, move_y1).wait(time_increment/1000)
+ action2.move_by_offset(move_x2, move_y2).wait(time_increment/1000)
+ action1.release()
+ action2.release()
+ multiAction.add(action1).add(action2).perform()
+
+
+def long_press_without_contextmenu(marionette_session, element, time_in_seconds, x=None, y=None):
+ """
+ :param element: The element to press.
+ :param time_in_seconds: Time in seconds to wait before releasing the press.
+ #x: Optional, x-coordinate to tap, relative to the top-left corner of the element.
+ #y: Optional, y-coordinate to tap, relative to the top-leftcorner of the element.
+ """
+ action = Actions(marionette_session)
+ action.press(element, x, y)
+ action.move_by_offset(0, 0)
+ action.wait(time_in_seconds)
+ action.release()
+ action.perform()