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

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

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

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

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 类定义了输入源类。

1、空输入源(null input source)

提供以下行为:

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

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

提供以下行为:

KeyDown:按下某个键

KeyUp:释放某个键

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

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

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

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

PointerMove:移动到屏幕某个点

PointerCancel:删除某个指针操作

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

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

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

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

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

汇总一下上面几个类:

6、ActionBuilder 类

初始化方法:

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

属性:key_action,pointer_action

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

添加新的输入源:add_key_input,add_pointer_input 

 

2、ActionChains 类

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

初始化:

3、单点触控 - ActionChains 类

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

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

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

4、多点触控 - ActionChains 类

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

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

  1. actions = ActionChains(driver)

  2. # 输入源设备列表为空

  3. actions.w3c_actions.devices = []

  4. # 添加一个新的输入源到设备到中,输入源类型为Touch

  5. new_input = actions.w3c_actions.add_pointer_input('touch', f'finger{finger}')

  6. # 输入源的动作:移动到某个点,按下,移动到另外一点,释放

  7. new_input.create_pointer_move(x=start_x, y=start_y)

  8. new_input.create_pointer_down(MouseButton.LEFT)

  9. new_input.create_pause(duration / 1000)

  10. new_input.create_pointer_move(x=end_x, y=end_y)

  11. new_input.create_pointer_up(MouseButton.LEFT)

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

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

  1. from time import sleep

  2. from appium import webdriver

  3. from selenium.webdriver import ActionChains

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

  5. #我要在android7.1.2设备上,打开百度地图app

  6. desired_caps = {

  7. "automationName":"UiAutomator2",

  8. "platformName":"Android",

  9. "platformVersion":"7.1.2",

  10. "deviceName":"HuaWei",

  11. "noReset":True,

  12. "appPackage":"com.baidu.BaiduMap",

  13. "appActivity":"com.baidu.baidumaps.WelcomeScreen",

  14. "systemPort": 8225,

  15. "newCommandTimeout": 1200

  16. }

  17. #先连接appium server。传递指令。 appium server连接地址

  18. driver = webdriver.Remote('<http://127.0.0.1:4723/wd/hub>', desired_caps)

  19. sleep(20)

  20. #获取设备的大小 - size

  21. size_dict = driver.get_window_size()

  22. # ==========放大地图:从地图中心分别向对角线滑动放大 - 2个手指同时执行滑动操作 ==================

  23. actions = ActionChains(driver)

  24. #输入源设备列表为空

  25. actions.w3c_actions.devices = []

  26. # ========== 第1个手指:从正中心向右上角滑动 ==================

  27. #添加一个新的输入源到设备到中,输入源类型为Touch,id为finger0

  28. new_input = actions.w3c_actions.add_pointer_input('touch','finger0')

  29. #输入源的动作:移动到某个点,按下,移动到另外一点,释放

  30. new_input.create_pointer_move(x=size_dict["width"] * 0.5, y=size_dict["height"] * 0.5)

  31. new_input.create_pointer_down()

  32. # new_input.create_pointer_down(MouseButton.LEFT)

  33. new_input.create_pause(0.2) # 200ms

  34. new_input.create_pointer_move(x=size_dict["width"] * 0.9, y=size_dict["height"] * 0.1)

  35. new_input.create_pointer_up(MouseButton.LEFT)

  36. # ========== 第2个手指:从正中心向左下角滑动 ==================

  37. #添加一个新的输入源到设备到中,输入源类型为Touch。id为finger1

  38. new_input = actions.w3c_actions.add_pointer_input('touch','finger1')

  39. #输入源的动作:移动到某个点,按下,移动到另外一点,释放

  40. new_input.create_pointer_move(x=size_dict["width"] * 0.5, y=size_dict["height"] * 0.5)

  41. new_input.create_pointer_down()

  42. # new_input.create_pointer_down(MouseButton.LEFT)

  43. new_input.create_pause(0.2) # 200ms

  44. new_input.create_pointer_move(x=size_dict["width"] * 0.1, y=size_dict["height"] * 0.9)

  45. new_input.create_pointer_up(MouseButton.LEFT)

  46. #执行动作

  47. actions.perform()

 

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

  1. 文档获取方式:

  2. 加入我的软件测试交流群:680748947免费获取~(同行大佬一起学术交流,每晚都有大佬直播分享技术知识点)

这份文档,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!

以上均可以分享,只需要你搜索vx公众号:程序员雨果,即可免费领取

  • 15
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值