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型,示例如下:

# @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,示例

# @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使用场景--控件元素滑动

  • 今日头条顶部菜单栏向左滑动
    微信图片_20220424155825.png
    思路:长按"视频"元素滑动至"关注"元素位置,然后释放
# 关注按钮元素
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()
  • 还有下面这种形式,通过对滑动控件元素来选择时间:
    微信图片_20220424155829.png
    思路:通过向上滑动选择年月日。以日期选择控件为例,按压日期元素滑动至【确定】按钮即可滚动日期(由于元素属性的原因这里不能选择精确的日期)
# 日期元素
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所示滑动操作则缩小照片。

微信图片_20220424155834.png

代码参考第二步中示例。

相关文章
|
14天前
|
Java 测试技术 持续交付
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
本文重点讲解如何搭建App自动化测试框架的思路,而非完整源码。主要内容包括实现目的、框架设计、环境依赖和框架的主要组成部分。适用于初学者,旨在帮助其快速掌握App自动化测试的基本技能。文中详细介绍了从需求分析到技术栈选择,再到具体模块的封装与实现,包括登录、截图、日志、测试报告和邮件服务等。同时提供了运行效果的展示,便于理解和实践。
55 4
【入门思路】基于Python+Unittest+Appium+Excel+BeautifulReport的App/移动端UI自动化测试框架搭建思路
|
5天前
|
开发者 Python
使用Python实现自动化邮件通知:当长时程序运行结束时
本文介绍了如何使用Python实现自动化邮件通知功能,当长时间运行的程序完成后自动发送邮件通知。主要内容包括:项目背景、设置SMTP服务、编写邮件发送函数、连接SMTP服务器、发送邮件及异常处理等步骤。通过这些步骤,可以有效提高工作效率,避免长时间等待程序结果。
41 9
|
4天前
|
运维 监控 网络安全
自动化运维的崛起:如何利用Python脚本简化日常任务
【10月更文挑战第43天】在数字化时代的浪潮中,运维工作已从繁琐的手工操作转变为高效的自动化流程。本文将引导您了解如何运用Python编写脚本,以实现日常运维任务的自动化,从而提升工作效率和准确性。我们将通过一个实际案例,展示如何使用Python来自动部署应用、监控服务器状态并生成报告。文章不仅适合运维新手入门,也能为有经验的运维工程师提供新的视角和灵感。
|
9天前
|
存储 Python
Python自动化脚本编写指南
【10月更文挑战第38天】本文旨在为初学者提供一条清晰的路径,通过Python实现日常任务的自动化。我们将从基础语法讲起,逐步引导读者理解如何将代码块组合成有效脚本,并探讨常见错误及调试技巧。文章不仅涉及理论知识,还包括实际案例分析,帮助读者快速入门并提升编程能力。
36 2
|
11天前
|
运维 监控 Python
自动化运维:使用Python脚本简化日常任务
【10月更文挑战第36天】在数字化时代,运维工作的效率和准确性成为企业竞争力的关键。本文将介绍如何通过编写Python脚本来自动化日常的运维任务,不仅提高工作效率,还能降低人为错误的风险。从基础的文件操作到进阶的网络管理,我们将一步步展示Python在自动化运维中的应用,并分享实用的代码示例,帮助读者快速掌握自动化运维的核心技能。
27 3
|
10天前
|
数据采集 IDE 测试技术
Python实现自动化办公:从基础到实践###
【10月更文挑战第21天】 本文将探讨如何利用Python编程语言实现自动化办公,从基础概念到实际操作,涵盖常用库、脚本编写技巧及实战案例。通过本文,读者将掌握使用Python提升工作效率的方法,减少重复性劳动,提高工作质量。 ###
24 1
|
17天前
|
运维 监控 应用服务中间件
自动化运维:如何利用Python脚本提升工作效率
【10月更文挑战第30天】在快节奏的IT行业中,自动化运维已成为提升工作效率和减少人为错误的关键技术。本文将介绍如何使用Python编写简单的自动化脚本,以实现日常运维任务的自动化。通过实际案例,我们将展示如何用Python脚本简化服务器管理、批量配置更新以及监控系统性能等任务。文章不仅提供代码示例,还将深入探讨自动化运维背后的理念,帮助读者理解并应用这一技术来优化他们的工作流程。
|
18天前
|
数据采集 Web App开发 JavaScript
爬虫策略规避:Python爬虫的浏览器自动化
爬虫策略规避:Python爬虫的浏览器自动化
|
16天前
|
Web App开发 测试技术 数据安全/隐私保护
自动化测试的魔法:使用Python进行Web应用测试
【10月更文挑战第32天】本文将带你走进自动化测试的世界,通过Python和Selenium库的力量,展示如何轻松对Web应用进行自动化测试。我们将一起探索编写简单而强大的测试脚本的秘诀,并理解如何利用这些脚本来确保我们的软件质量。无论你是测试新手还是希望提升自动化测试技能的开发者,这篇文章都将为你打开一扇门,让你看到自动化测试不仅可行,而且充满乐趣。
|
11天前
|
JSON Java 测试技术
SpringCloud2023实战之接口服务测试工具SpringBootTest
SpringBootTest同时集成了JUnit Jupiter、AssertJ、Hamcrest测试辅助库,使得更容易编写但愿测试代码。
43 3