news 2026/9/26 10:38:53

Python+Appium自动化测试(10)-TouchAction类与MultiAction类(控件元素的滑动、拖动,九宫格解锁,手势操作等)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Python+Appium自动化测试(10)-TouchAction类与MultiAction类(控件元素的滑动、拖动,九宫格解锁,手势操作等)

滑动屏幕方法swipe一般用于对页面进行上下左右滑动操作,但自动化过程中还会遇到其他情况,如对控件元素进行滑动、拖拽操作,九宫格解锁,手势操作,地图的放大与缩小等。这些需要针对控件元素的滑动操作,或者点至点、元素至元素之间的滑动操作,使用swipe方法显然不是很方便,这时候就可以用到appium里提供TouchAction类和MultiAction类。

一,TouchAction类

1,TouchAction类由webdriver库提供,提供以下方法:
tap(self, element=None, x=None, y=None, count=1),点击,点击元素el或坐标点(x, y) 1次

press(self, el=None, x=None, y=None, pressure=None),短按,按压元素el或坐标点(x, y)

long_press(self, el=None, x=None, y=None, duration=1000),长按,长按元素el或坐标点(x, y),duration为按压时间,默认1000ms

wait(self, ms=0),暂停,时间默认为0

move_to(self, el=None, x=None, y=None),移动到,滑动至目标元素el位置或目标坐标点(x, y)

release(self),释放,将指针提离屏幕结束操作

perform(self),执行,将命令发送到要操作的服务器来执行该操作

注意,坐标x、y为int型,示例如下:

ss="language-python"># @author: 给你一页白纸 from appium import webdriver # 需要导入模块TouchAction from appium.webdriver.common.touch_action import TouchAction desired_caps = { "platformName": "Android", "platformVersion": "10", "deviceName": "PCT_AL10", "appPackage": "com.ss.android.article.news", "appActivity": ".activity.MainActivity", "automationName": "uiautomator2", "unicodeKeyboard": True, "resetKeyboard": True, "noReset": False, } # 启动app driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps) # 构造TouchAction实例对象 action = TouchAction(driver) 按住点(x1, y1),等待1000ms,滑动至点(x2, y2),释放 action.press(x=x1, y=y1).wait(1000).move_to(x=x2, y=y2).release() # 执行操作 action.perform()

2,tap点击

# 点击元素的中心点 tap(element=ele1) # 点击坐标(x1, y1) tap(x=x1, y=y1) # 以元素ele1左上角的x坐标向右移动x2单位,y坐标向下移动y2单位,在点(x+x2, y+y2)上点击 tap(element=ele1, x=x2, y=y2)

3,press短按

# 按压元素 press(el=ele1) # 按压坐标 press(x=x1, y=y1) # 以元素ele1左上角的x坐标向右移动x2单位,y坐标向下移动y2单位,在点(x+x2, y+y2)上按压 press(el=ele1, x=x2, y=y2)

4,long_press长按

# 按压元素,默认1000ms long_press(el=ele1) # 按压坐标500ms long_press(x=x1, y=y1, duration=500) # 以元素ele1左上角的x坐标向右移动x2单位,y坐标向下移动y2单位,在点(x+x2, y+y2)上按压 long_press(el=ele1, x=x2, y=y2)

5,move_to移动至目标点

# 该方法需要与press()、long_press()结合使用 # 从另一个点移动至目标元素ele1 move_to(el=ele1) # 从另一个点移动至点(x1, y1) move_to(x=x1, y=y1) # 从另一个点移动至点(x+x2, y+y2), (x, y)为元素ele1左上角的坐标 move_to(el=ele1, x=x2, y=y2)

6,wait等待

# 等待,如等待500ms wait(500)

7,release释放

# 释放操作,与按压、长按结合使用 release()

8,perform执行

# 将动作命令发送至服务器来执行该动作,如: action = TouchAction(driver).press(x=x1, y=y1).move_to(x=x2, y=y2).release() 执行滑动操作 action.perform()

二,多点触控MultiAction类

1,MultiAction类中提供以下方法:
add(self,touch_actions),参数touch_actions为触摸操作集合,将一个或多个触摸操作添加至当前的多点触控实例中

perform(self),执行多点触控操作

使用场景,如页面的放大、缩小等

2,示例

ss="language-python"># @author: 给你一页白纸 from appium import webdriver from appium.webdriver.common.touch_action import TouchAction # 需要导入模块MultiAction from appium.webdriver.common.multi_action import MultiAction desired_caps = { "platformName": "Android", "platformVersion": "10", "deviceName": "PCT_AL10", "appPackage": "com.ss.android.article.news", "appActivity": ".activity.MainActivity", "automationName": "uiautomator2", "unicodeKeyboard": True, "resetKeyboard": True, "noReset": False, } # 启动app driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub', desired_caps # 创建两个触摸事件 action = TouchAction(driver) action1 = action.press(ele1).move_to(ele2).release() action2 = action.press(x=50, y=50).move_to(x=100, y=200).release() # 创建MultiAction实例对象 multi_action = MultiAction(driver) # 将触摸事件加入TouchAction对象 multi_action.add(action1, action2) # 执行事件 multi_action.perform()

三,使用场景
1,TouchAction使用场景–控件元素滑动
今日头条顶部菜单栏向左滑动

思路:长按"视频"元素滑动至"关注"元素位置,然后释放

# 关注按钮元素 concern_ele = driver.find_element_by_xpath("//*[@content-desc='关注']") # 视频按钮元素 video_ele = driver.find_element_by_xpath("//*[@content-desc='视频']") action = TouchAction(driver) 长按"视频"元素滑动至"关注"元素位置,然后释放 action.long_press(video_ele).move_to(concern_ele).release().perform()

还有下面这种形式,通过对滑动控件元素来选择时间:

思路:通过向上滑动选择年月日。以日期选择控件为例,按压日期元素滑动至【确定】按钮即可滚动日期(由于元素属性的原因这里不能选择精确的日期)

# 日期元素 day_ele = driver.find_element_by_id("resource-id") # 视频按钮元素 sure_ele = driver.find_element_by_xpath("//*[@text='确定']") action = TouchAction(driver) # 长按日期元素滑动至确定按钮元素位置,然后释放 action.long_press(day_ele).move_to(sure_ele).release().perform()

2,TouchAction使用场景–九宫格解锁

# @author: 给你一页白纸 from appium.webdriver.common.touch_action import TouchAction class NineSquUnlock(object): ''' 九宫格解锁,九宫格中每个点的坐标可以通过uiautomatorviewer获取,以下仅为示例 ''' def __init__(self, driver): self.driver = driver self.pwd = '1235789' # 解锁密码 self.unit_location = [ (300, 300), (300, 600), (300, 900), (600, 200), (600, 600), (600, 900), (900, 200), (900, 600), (900, 900) ] def unlock(self): # 将密码转换为对应坐标点的索引,获取密码对应的坐标点 pwd_loc = [] for i in self.pwd: unit_index = self.unit_location[int(i)] pwd_loc.append(unit_index) action = TouchAction(self.driver) # 按压起点 action.press(*pwd_loc[0]).wait(200) # 根据坐标点滑动 for i in range(1, len(pwd_loc)): action.move_to(*pwd_loc[i]).wait(200) # 释放动作并执行 action.release().perform() if __name__ == '__main__': # 调试,构造的driver仅为示例 from appium import webdriver driver = webdriver.Remote() NineSquUnlock(driver).unlock()

3,MultiAction使用场景
app中地图的放大、缩小;app中图片的放大、缩小。

如下图中A、B、C、D四个坐标点,1所示滑动操作则放大图片,2所示滑动操作则缩小照片。

代码参考第二步中示例。

最后作为一位过来人也是希望大家少走一些弯路,在这里我给大家分享一些软件测试的学习资料和我花了3个月整理的软件测试自学全栈,这些资料希望能给你前进的路上带来帮助。

​视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 16:16:37

SIEMENS 6SL3210-1PE33-0CL0 变频器

常见故障及解决方法‌通信故障‌‌原因‌:通信线路松动、参数设置错误(如波特率、设备名称不匹配)或接口损坏。‌解决‌:检查线路连接,核对参数一致性,更换损坏接口。‌过流/过压/欠压‌‌过流‌&#xff1…

作者头像 李华
网站建设 2026/9/26 16:32:18

软件测试常用的7种方法,最后一个是升职加薪关键!(零基础小白转行IT互联网高效进阶)

一般而言,软件测试方法分为黑盒测试、白盒测试、灰盒测试、静态测试、动态测试、手动测试、自动化测试和探索性测试等类型。 【1】黑盒测试 黑盒测试又称功能测试、数据驱动测试或基于需求规格说明书的功能测试。该测试方法验证被测对象使用质量及外部质量表现。 …

作者头像 李华
网站建设 2026/9/25 22:40:46

【RTOS】EasyLog的移植与使用

当前log的突出问题: ①log不方便定位到源程序所在位置 ②log不分主次,比较难生成想要的信息 1. 彩色log 1.1 编译器内置宏:__FILE__,__LINE__ led1下直接打印出当前文件的行号和名字 led2复制粘贴过来,改一下引脚 实验现象 哎…

作者头像 李华
网站建设 2026/9/26 3:01:22

在数据库里玩“平行宇宙”:MatrixOne Data Branch 让数据也拥有Git 的分支/合并/对比/回滚(含跨集群同步)

这篇文章讲一件事:当数据像代码一样频繁迭代时,数据库内生的“分支工作流”会比备份/复制更可靠、更省钱、更工程化。 1. 从一个真实的“数据事故现场”开始 当你的 AI 模型不慎清空了核心数据库,或者错误地注入了大量虚假数据,传…

作者头像 李华
网站建设 2026/9/25 8:06:27

基于单片机的全自动洗衣机系统的设计

基于单片机的全自动洗衣机系统的设计 第一章 引言 传统洗衣机依赖人工手动控制进水、洗涤、漂洗、脱水等流程,操作繁琐且水资源与电能浪费严重。随着智能家居技术的发展,全自动洗衣机成为家庭生活的主流需求,其核心在于通过智能控制实现洗衣流…

作者头像 李华
网站建设 2026/9/25 6:22:57

5.6 模型部署与智能体集成实战

5.6 模型部署与智能体集成实战 直播导语:同学们,欢迎来到我们《Agentic AI 智能体开发行动营》的最后一次直播课!在过去的五周里,我们一起经历了一段非凡的旅程:从 Function Calling 的“第一次接触”,到 LangGraph 的“图之思维”,再到“旅小智”的“全栈出海”,最终我…

作者头像 李华