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

代码参考第二步中示例。

相关文章
|
9月前
|
JavaScript 测试技术 Python
UI自动化测试中的元素等待机制解析
在UI自动化测试中,元素定位失败常因页面存在iframe或缺乏合理等待机制。本文解析三种等待策略及其应用场景:显式等待可精确控制单个元素等待条件,支持自定义轮询;隐式等待全局生效,适合简单页面加载;强制等待仅用于临时调试,正式脚本慎用。通过对比三者执行精度、资源消耗及适用场景,帮助选择最优策略,提升测试效率与稳定性。
|
敏捷开发 测试技术 持续交付
自动化测试之美:从零开始搭建你的Python测试框架
在软件开发的马拉松赛道上,自动化测试是那个能让你保持节奏、避免跌宕起伏的神奇小助手。本文将带你走进自动化测试的世界,用Python这把钥匙,解锁高效、可靠的测试框架之门。你将学会如何步步为营,构建属于自己的测试庇护所,让代码质量成为晨跑时清新的空气,而不是雾霾中的忧虑。让我们一起摆脱手动测试的繁琐枷锁,拥抱自动化带来的自由吧!
|
JSON 测试技术 持续交付
自动化测试与脚本编写:Python实践指南
自动化测试与脚本编写:Python实践指南
377 1
|
测试技术 数据安全/隐私保护 开发者
自动化测试的奥秘:如何用Selenium和Python提升软件质量
【9月更文挑战第35天】在软件开发的海洋中,自动化测试是那艘能引领我们穿越波涛的帆船。本文将揭开自动化测试的神秘面纱,以Selenium和Python为工具,展示如何构建一个简单而强大的自动化测试框架。我们将从基础出发,逐步深入到高级应用,让读者能够理解并实现自动化测试脚本,从而提升软件的质量与可靠性。
|
Web App开发 测试技术 持续交付
自动化测试的利器:Selenium与Python的完美结合
【9月更文挑战第21天】在软件开发的世界里,测试是确保产品质量的关键步骤。随着敏捷开发和持续集成的流行,自动化测试工具变得尤为重要。本文将介绍如何使用Selenium和Python进行高效的自动化测试,不仅提供代码示例,还深入探讨如何设计测试用例、选择正确的测试框架、以及如何整合到CI/CD流程中。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧。
297 3
|
安全 JavaScript 前端开发
自动化测试的魔法:如何用Python编写你的第一个测试脚本
【8月更文挑战第41天】在软件的世界里,质量是王道。而自动化测试,就像是维护这个王国的骑士,确保我们的软件产品坚不可摧。本文将引导你进入自动化测试的奇妙世界,教你如何使用Python这把强大的魔法杖,编写出能够守护你代码安全的第一道防护咒语。让我们一起开启这场魔法之旅吧!
|
Web App开发 测试技术 数据安全/隐私保护
自动化测试的魔法:使用Python进行Web应用测试
【10月更文挑战第32天】本文将带你走进自动化测试的世界,通过Python和Selenium库的力量,展示如何轻松对Web应用进行自动化测试。我们将一起探索编写简单而强大的测试脚本的秘诀,并理解如何利用这些脚本来确保我们的软件质量。无论你是测试新手还是希望提升自动化测试技能的开发者,这篇文章都将为你打开一扇门,让你看到自动化测试不仅可行,而且充满乐趣。
|
敏捷开发 测试技术 持续交付
自动化测试之美:如何用Selenium和Python打造高效测试脚本
【9月更文挑战第13天】在软件开发的海洋中,自动化测试是那抹不可或缺的亮色。它不仅提升了测试效率,还保障了产品质量。本文将带你领略使用Selenium和Python构建自动化测试脚本的魅力所在,从环境的搭建到脚本的编写,再到问题的排查,每一步都是对软件质量把控的深刻理解和实践。让我们开始这段探索之旅,解锁自动化测试的秘密吧!
354 1
|
Web App开发 测试技术 API
自动化测试之美:使用Selenium和Python进行Web应用测试
【8月更文挑战第31天】在软件开发的快节奏世界中,自动化测试如同一束明灯,照亮了质量保证之路。本文将引导你通过Selenium和Python的强大组合,探索如何构建高效的Web应用测试框架。我们不仅会讨论理论,还会深入代码,从一个简单的示例开始,逐步扩展至更复杂的场景。无论你是初学者还是有经验的开发者,这篇文章都将为你提供宝贵的见解和实用的技巧。让我们一同揭开自动化测试的神秘面纱,体验它的魅力所在。
|
Web App开发 XML 测试技术
自动化测试框架设计:以Python和Selenium为例
【8月更文挑战第31天】在软件开发的快节奏中,自动化测试成为确保产品质量的关键步骤。本文将引导读者了解如何结合Python语言和Selenium工具来设计一个高效的自动化测试框架。通过浅显易懂的语言和实际代码示例,我们将探索自动化测试框架的核心组件,并学习如何实现它们。无论你是测试新手还是希望提升自动化技能的开发者,这篇文章都将为你打开一扇通向高效软件测试的大门。

热门文章

最新文章

推荐镜像

更多