Class: Appium::Core::TouchAction

Inherits:
Object
  • Object
show all
Defined in:
lib/appium_lib_core/device/touch_actions.rb

Constant Summary collapse

ACTIONS =
%i(move_to long_press double_tap two_finger_tap press release tap wait perform).freeze
COMPLEX_ACTIONS =
%i(swipe).freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(driver) ⇒ TouchAction

Returns a new instance of TouchAction.



27
28
29
30
# File 'lib/appium_lib_core/device/touch_actions.rb', line 27

def initialize(driver)
  @actions = []
  @driver = driver
end

Instance Attribute Details

#actionsObject (readonly)

Returns the value of attribute actions.



25
26
27
# File 'lib/appium_lib_core/device/touch_actions.rb', line 25

def actions
  @actions
end

#driverObject (readonly)

Returns the value of attribute driver.



25
26
27
# File 'lib/appium_lib_core/device/touch_actions.rb', line 25

def driver
  @driver
end

Instance Method Details

#cancelObject

Does nothing, currently.



167
168
169
170
171
# File 'lib/appium_lib_core/device/touch_actions.rb', line 167

def cancel
  @actions << { action: cancel }
  @driver.touch_actions @actions
  self
end

#double_tap(opts) ⇒ Object

Double tap an element on the screen

Parameters:

  • opts (Hash)

    Options

Options Hash (opts):

  • :element (WebDriver::Element) — default: Optional

    Element to restrict scope too.

  • :x (integer)

    x co-ordinate to tap

  • :y (integer)

    y co-ordinate to tap



106
107
108
109
110
# File 'lib/appium_lib_core/device/touch_actions.rb', line 106

def double_tap(opts)
  args = opts.select { |k, _v| %i(element x y).include? k }
  args = args_with_ele_ref(args)
  chain_method(:doubleTap, args) # doubleTap is what the appium server expects
end

#long_press(opts) ⇒ Object

Press down for a specific duration. Alternatively, you can use ‘press(…).wait(…).release()` instead of `long_press` if duration doesn’t work well. github.com/appium/ruby_lib/issues/231#issuecomment-269895512 e.g. Appium::TouchAction.new.press(x: 280, y: 530).wait(2000).release.perform

Parameters:

  • opts (Hash)

    Options

Options Hash (opts):

  • element (WebDriver::Element)

    the element to press.

  • x (integer)

    X co-ordinate to press on.

  • y (integer)

    Y co-ordinate to press on.

  • duration (integer)

    Number of milliseconds to press.



55
56
57
58
59
# File 'lib/appium_lib_core/device/touch_actions.rb', line 55

def long_press(opts)
  args = opts.select { |k, _v| %i(element x y duration).include? k }
  args = args_with_ele_ref(args)
  chain_method(:longPress, args) # longPress is what the appium server expects
end

#move_to(opts) ⇒ Object

Move to the given co-ordinates.

‘move_to`’s ‘x` and `y` have two case. One is working as coordinate, the other is working as offset.

Parameters:

  • opts (Hash)

    Options

Options Hash (opts):

  • :x (integer)

    x co-ordinate to move to if element isn’t set. Works as an offset if x is set with Element.

  • :y (integer)

    y co-ordinate to move to if element isn’t set. Works as an offset if y is set with Element.

  • Element (WebDriver::Element)

    to scope this move within.



40
41
42
43
# File 'lib/appium_lib_core/device/touch_actions.rb', line 40

def move_to(opts)
  opts = args_with_ele_ref(opts)
  chain_method(:moveTo, opts)
end

#performObject

Ask the driver to perform all actions in this action chain.



160
161
162
163
164
# File 'lib/appium_lib_core/device/touch_actions.rb', line 160

def perform
  @driver.touch_actions @actions
  @actions.clear
  self
end

#press(opts) ⇒ Object

Press a finger onto the screen. Finger will stay down until you call ‘release`.

Parameters:

  • opts (Hash)

    Options

Options Hash (opts):

  • :element (WebDriver::Element) — default: Optional

    Element to press within.

  • :x (integer)

    x co-ordinate to press on

  • :y (integer)

    y co-ordinate to press on



67
68
69
70
71
# File 'lib/appium_lib_core/device/touch_actions.rb', line 67

def press(opts)
  args = opts.select { |k, _v| %i(element x y).include? k }
  args = args_with_ele_ref(args)
  chain_method(:press, args)
end

#release(opts = nil) ⇒ Object

Remove a finger from the screen.

Parameters:

  • opts (Hash) (defaults to: nil)

    Options

Options Hash (opts):

  • :element (WebDriver::Element) — default: Optional

    Element to release from.

  • :x (integer)

    x co-ordinate to release from

  • :y (integer)

    y co-ordinate to release from



79
80
81
82
# File 'lib/appium_lib_core/device/touch_actions.rb', line 79

def release(opts = nil)
  args = args_with_ele_ref(opts) if opts
  chain_method(:release, args)
end

#swipe(opts, ele = nil) ⇒ Object

Convenience method to perform a swipe.

Parameters:

  • opts (Hash)

    Options

Options Hash (opts):

  • :start_x (int)

    Where to start swiping, on the x axis. Default 0.

  • :start_y (int)

    Where to start swiping, on the y axis. Default 0.

  • :offset_x (int)

    Move to the end, on the x axis. Default 0.

  • :offset_y (int)

    Move to the end, on the y axis. Default 0.

  • :duration (int)

    How long the actual swipe takes to complete in milliseconds. Default 200.



139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
# File 'lib/appium_lib_core/device/touch_actions.rb', line 139

def swipe(opts, ele = nil)
  start_x  = opts.fetch :start_x, 0
  start_y  = opts.fetch :start_y, 0
  offset_x = opts.fetch :offset_x, 0
  offset_y = opts.fetch :offset_y, 0
  duration = opts.fetch :duration, 200

  if ele # pinch/zoom for XCUITest
    press x: start_x, y: start_y, element: ele
    move_to x: offset_x, y: offset_y, element: ele
  else
    press x: start_x, y: start_y
    wait(duration) if duration
    move_to x: offset_x, y: offset_y
  end
  release

  self
end

#tap(opts) ⇒ Object

Touch a point on the screen. Alternatively, you can use ‘press(…).release.perform` instead of `tap(…).perform`.

Parameters:

  • opts (Hash)

    Options

Options Hash (opts):

  • :element (WebDriver::Element) — default: Optional

    Element to restrict scope too.

  • :x (integer)

    x co-ordinate to tap

  • :y (integer)

    y co-ordinate to tap

  • :fingers (integer)

    how many fingers to tap with (Default 1)



92
93
94
95
96
97
# File 'lib/appium_lib_core/device/touch_actions.rb', line 92

def tap(opts)
  opts[:count] = opts.delete(:fingers) if opts[:fingers]
  opts[:count] ||= 1
  args = args_with_ele_ref opts
  chain_method(:tap, args)
end

#two_finger_tap(opts) ⇒ Object

Two finger tap an element on the screen

Parameters:

  • opts (Hash)

    Options

Options Hash (opts):

  • :element (WebDriver::Element) — default: Optional

    Element to restrict scope too.

  • :x (integer)

    x co-ordinate to tap

  • :y (integer)

    y co-ordinate to tap



118
119
120
121
122
# File 'lib/appium_lib_core/device/touch_actions.rb', line 118

def two_finger_tap(opts)
  args = opts.select { |k, _v| %i(element x y).include? k }
  args = args_with_ele_ref(args)
  chain_method(:twoFingerTap, args) # twoFingerTap is what the appium server expects
end

#wait(milliseconds) ⇒ Object

Pause for a number of milliseconds before the next action

Parameters:

  • milliseconds (integer)

    Number of milliseconds to pause for



126
127
128
129
# File 'lib/appium_lib_core/device/touch_actions.rb', line 126

def wait(milliseconds)
  args = { ms: milliseconds }
  chain_method(:wait, args)
end