blob: 257e050d134238dcbf59468ac9613317618b6af3 [file] [log] [blame]
""""
Touch Actions implementation
"""
from selenium.webdriver.remote.command import Command
class TouchActions(object):
"""
Generate touch actions. Works like ActionChains; actions are stored in the
TouchActions object and are fired with perform().
"""
def __init__(self, driver):
"""
Creates a new TouchActions object.
Args:
-driver: The WebDriver instance, which must be touchscreen enabled.
"""
self._driver = driver
self._actions = []
def perform(self):
"""
Performs all stored actions.
"""
for action in self._actions:
action()
def tap(self, on_element):
"""
Taps on a given element.
Args:
-element: The element to tap.
"""
self._actions.append(lambda:
self._driver.execute(Command.SINGLE_TAP, {'element': on_element.id}))
return self
def double_tap(self, on_element):
"""
Double taps on a given element.
Args:
-element: The element to tap.
"""
self._actions.append(lambda:
self._driver.execute(Command.DOUBLE_TAP, {'element': on_element.id}))
return self
def tap_and_hold(self, xcoord, ycoord):
"""
Tap and hold a given element.
Args:
-xcoord: X Coordinates.
-ycoord: Y Coordinates.
"""
self._actions.append(lambda:
self._driver.execute(Command.TOUCH_DOWN, {
'x': xcoord,
'y': ycoord}))
return self
def move(self, xcoord, ycoord):
"""
Move held tap to specified location.
Args:
-xcoord: X Coordinates.
-ycoord: Y Coordinates.
"""
self._actions.append(lambda:
self._driver.execute(Command.TOUCH_MOVE, {
'x': xcoord,
'y': ycoord}))
return self
def release(self, xcoord, ycoord):
"""
Release previously issued tap and hold command, at specified location.
Args:
-xcoord: X Coordinates.
-ycoord: Y Coordinates.
"""
self._actions.append(lambda:
self._driver.execute(Command.TOUCH_UP, {
'x': xcoord,
'y': ycoord}))
return self
def scroll(self, xoffset, yoffset):
"""
Touch and scroll, moving by xoffset and yoffset.
Args:
-xoffset: X offset to move to.
-yoffset: Y offset to move to.
"""
self._actions.append(lambda:
self._driver.execute(Command.TOUCH_SCROLL, {
'xoffset': xoffset,
'yoffset': yoffset}))
return self
def scroll_from_element(self, on_element, xoffset, yoffset):
"""
Touch and scroll starting at on_element, moving by xoffset and yoffset.
Args:
-on_element: Element where scroll starts.
-xoffset: X offset to move to.
-yoffset: Y offset to move to.
"""
self._actions.append(lambda:
self._driver.execute(Command.TOUCH_SCROLL, {
'element': on_element.id,
'xoffset': xoffset,
'yoffset': yoffset}))
return self
def long_press(self, on_element):
"""
Long press on an element.
Args:
-on_element: The element to long press.
"""
self._actions.append(lambda:
self._driver.execute(Command.LONG_PRESS, {'element': on_element.id}))
return self
def flick(self, xspeed, yspeed):
"""
Flicks, starting anywhere on the screen.
Args:
-xspeed: The X speed in pixels per second.
-yspeed: The Y speed in pixels per second.
"""
self._actions.append(lambda:
self._driver.execute(Command.FLICK, {
'xSpeed': xspeed,
'ySpeed': yspeed}))
return self
def flick_element(self, on_element, xoffset, yoffset, speed):
"""
Flick starting at on_element, and moving by the xoffset and yoffset.
Args:
-on_element: Flick will start at center of element.
-xoffset: X offset to flick to.
-yoffset: Y offset to flick to.
-speed: Pixels per second to flick.
"""
self._actions.append(lambda:
self._driver.execute(Command.FLICK, {
'element': on_element.id,
'xoffset': xoffset,
'yoffset': yoffset,
'speed': speed}))
return self