新鲜出炉:appium2.0+ 单点触控和多点触控新的解决方案

本贴最后更新于 930 天前,其中的信息可能已经时异事殊

在appium2.0之前,在移动端设备上的触屏操作,单手指触屏和多手指触屏分别是由TouchAction类,Multiaction类实现的。

在appium2.0之后,这2个方法将会被舍弃。

"[Deprecated] 'TouchAction' action is deprecated. Please use W3C actions instead."

1.png


1、w3c action是什么?

在w3c的actions当中,将输入源分为了三类:

  1. 键盘类 - Key
  2. 指针类 - Pointer
  3. None

对于Pointer指针类输入源,共有3种:Mouse鼠标、Touch触屏、Pen笔触

输入源,是提供输入事件的虚拟设备。

每一个输入源,都是一个输入id,输入源type。与真实设备一样,每一个输入源都有状态的,有输入事件。

在python selenium的源码当中,selenium/common/actions/input_devices.py里InputDevices类定义了输入源类。

2.png

1、空输入源(null input source)

提供以下行为:

pause:不做任何操作一段时间,或者动作的持续时间

2、键盘输入源(key input source)

提供以下行为:

KeyDown:按下某个键

KeyUp:释放某个键

在python selenium的源码当中,selenium/common/actions/key_input.py里KeyInput类定义了按钮输入源类。

3.png

3、指针输入源(pointer input source),提供以下行为:

PointerDown:按下鼠标键,或者触屏或者触屏笔触屏

PointerUp:松开鼠标键,或者手离开屏幕,或者触屏笔离开屏幕

PointerMove:移动到屏幕某个点

PointerCancel:删除某个指针操作

在python selenium的源码当中,selenium/common/actions/pointer_input.py里PointerInput类定义了指针输入源类。

4.png

4、在输入源基础上,定义了键盘操作类KeyActions

在python selenium的源码当中,selenium/common/actions/key_actions.py里KeyActions类定义了键盘操作类。

5.png

5、在输入源基础上,定义了鼠标/触屏操作PointerActions类:

在python selenium的源码当中,selenium/common/actions/pointer_actions.py里PointerActions类定义了鼠标/触屏操作类。

image.png

7.png

汇总一下上面几个类:

image.png

6、ActionBuilder类

初始化方法:

  1. 输入源设备列表,会放2个输入源:鼠标输入源、键盘输入源。
  2. 有2个私有属性:键盘操作对象(KeyActions类实例化**)**,鼠标/触屏操作对象(PointerActions类实例化)

image.png

属性:key_action,pointer_action

在ActionChains类当中,就是通过这2个属性来调用鼠标和键盘的操作的。

image.png

添加新的输入源:add_key_input,add_pointer_input

10.png


2、ActionChains类

selenium中的鼠标操作类,鼠标行为都是使用的ActionBuilder类。

初始化:

1.png

2.png


3、单点触控 - ActionChains类

直接使用ActionChains类里的,w3c_actions去实现。

比如appium当中的swipe滑屏方法:

移动到某一个坐标点 → 按下 → 移动到另一个坐标点 → 释放

2.png


4、多点触控 - ActionChains类

多点触控,是个单点触控操作同时发生,比如2个手指,同时在屏幕上进行滑动操作。

仍然是ActionChains类,不过需要在里面,添加新的单点触控操作。

actions = ActionChains(driver)
# 输入源设备列表为空
actions.w3c_actions.devices = []

# 添加一个新的输入源到设备到中,输入源类型为Touch
new_input = actions.w3c_actions.add_pointer_input('touch', f'finger{finger}')
# 输入源的动作:移动到某个点,按下,移动到另外一点,释放
new_input.create_pointer_move(x=start_x, y=start_y)
new_input.create_pointer_down(MouseButton.LEFT)
new_input.create_pause(duration / 1000)
new_input.create_pointer_move(x=end_x, y=end_y)
new_input.create_pointer_up(MouseButton.LEFT)

# 以此类推,可以添加多个输入源操作到设备当中。可以是鼠标操作,也可以是触屏,按键等操作

比如,对百度地图app进行放大操作的代码如下:

from time import sleep
from appium import webdriver

from selenium.webdriver import ActionChains
from selenium.webdriver.common.actions.mouse_button import MouseButton

#我要在android7.1.2设备上,打开百度地图app
desired_caps = {
"automationName":"UiAutomator2",
"platformName":"Android",
"platformVersion":"7.1.2",
"deviceName":"HuaWei",
"noReset":True,
"appPackage":"com.baidu.BaiduMap",
"appActivity":"com.baidu.baidumaps.WelcomeScreen",
"systemPort": 8225,
"newCommandTimeout": 1200
}

#先连接appium server。传递指令。 appium server连接地址
driver = webdriver.Remote('<http://127.0.0.1:4723/wd/hub>', desired_caps)

sleep(20)

#获取设备的大小 - size
size_dict = driver.get_window_size()

# ==========放大地图:从地图中心分别向对角线滑动放大 - 2个手指同时执行滑动操作  ==================
actions = ActionChains(driver)
#输入源设备列表为空
actions.w3c_actions.devices = []

# ========== 第1个手指:从正中心向右上角滑动  ==================
#添加一个新的输入源到设备到中,输入源类型为Touch,id为finger0
new_input = actions.w3c_actions.add_pointer_input('touch','finger0')
#输入源的动作:移动到某个点,按下,移动到另外一点,释放
new_input.create_pointer_move(x=size_dict["width"] * 0.5, y=size_dict["height"] * 0.5)
new_input.create_pointer_down()
# new_input.create_pointer_down(MouseButton.LEFT)
new_input.create_pause(0.2) # 200ms
new_input.create_pointer_move(x=size_dict["width"] * 0.9, y=size_dict["height"] * 0.1)
new_input.create_pointer_up(MouseButton.LEFT)

# ========== 第2个手指:从正中心向左下角滑动  ==================
#添加一个新的输入源到设备到中,输入源类型为Touch。id为finger1
new_input = actions.w3c_actions.add_pointer_input('touch','finger1')
#输入源的动作:移动到某个点,按下,移动到另外一点,释放
new_input.create_pointer_move(x=size_dict["width"] * 0.5, y=size_dict["height"] * 0.5)
new_input.create_pointer_down()
# new_input.create_pointer_down(MouseButton.LEFT)
new_input.create_pause(0.2) # 200ms
new_input.create_pointer_move(x=size_dict["width"] * 0.1, y=size_dict["height"] * 0.9)
new_input.create_pointer_up(MouseButton.LEFT)

#执行动作
actions.perform()

last.png

1 操作
xiaojian 在 2022-04-29 19:39:29 更新了该帖
回帖
请输入回帖内容 ...