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

代码参考第二步中示例。

相关文章
|
2天前
|
C++ Python
Python中的类与对象
Python中的类与对象
5 1
|
3天前
|
SQL 测试技术 网络安全
Python之SQLMap:自动SQL注入和渗透测试工具示例详解
Python之SQLMap:自动SQL注入和渗透测试工具示例详解
12 0
|
3天前
|
测试技术 开发者 Python
Python中的单元测试
【5月更文挑战第8天】在Python软件开发中,确保代码质量是关键,单元测试和测试驱动开发(TDD)是实现这一目标的有效方法。本文介绍了如何使用unittest和pytest进行单元测试,以及如何通过TDD编写可靠代码。首先,展示了单元测试的基本概念和示例,然后详细解释了TDD的"红-绿-重构"循环。此外,还讨论了pytest如何简化单元测试,并给出了使用TDD重构函数的例子。
6 1
|
4天前
|
JavaScript 前端开发 测试技术
《手把手教你》系列技巧篇(三十八)-java+ selenium自动化测试-日历时间控件-下篇(详解教程)
【5月更文挑战第2天】在自动化测试过程中,经常会遇到处理日期控件的点击问题。宏哥之前分享过一种方法,但如果输入框是`readonly`属性,这种方法就无法奏效了。不过,通过修改元素属性,依然可以实现自动化填写日期。首先,定位到日期输入框并移除`readonly`属性,然后使用`sendKeys`方法输入日期。这样,即使输入框设置了`readonly`,也能成功处理日期控件。
23 1
|
4天前
|
Python
在Python中,类的属性可以分为公有属性和私有属性
Python类包含公有和私有属性。公有属性可直接外部访问,如`person.name`,而私有属性如`_name`需通过getter/setter方法访问,如`person.getName()`和`person.setName()`。私有属性用于封装数据、隐藏实现细节,增强代码可维护性和安全性。封装能灵活修改内部实现,不影响外部;安全性防止外部非法修改数据;一致性确保所有数据操作在类内完成,简化代码并减少错误。
22 10
|
4天前
|
Python
【Python 基础】Python中的实例方法、静态方法和类方法有什么区别?
【5月更文挑战第6天】【Python 基础】Python中的实例方法、静态方法和类方法有什么区别?
|
5天前
|
存储 程序员 Python
Python中自定义类实例化数组的艺术
Python中自定义类实例化数组的艺术
7 1
|
5天前
|
程序员 Linux C++
Python中的WinForms类桌面应用程序开发
Python中的WinForms类桌面应用程序开发
22 4
|
5天前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(三十七)-java+ selenium自动化测试-日历时间控件-上篇(详解教程)
【5月更文挑战第1天】该文介绍了使用Selenium自动化测试网页日历控件的方法。首先,文章提到在某些Web应用中,日历控件常用于选择日期并筛选数据。接着,它提供了两个实现思路:一是将日历视为文本输入框,直接输入日期;二是模拟用户交互,逐步选择日期。文中给出了JQueryUI网站的一个示例,并展示了对应的Java代码实现,包括点击日历、选择日期等操作。
26 0
|
5月前
|
XML Java 测试技术
『App自动化测试之Appium应用篇』| 元素定位工具Appium-Inspector从简介、安装、配置到使用的完整攻略
『App自动化测试之Appium应用篇』| 元素定位工具Appium-Inspector从简介、安装、配置到使用的完整攻略
202 3