文章转自:https://www.cnblogs.com/lfr0123/p/13679568.html

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

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

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使用场景--九宫格解锁

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()

Appium-TouchAction类与MultiAction类(控件元素的滑动、拖动,九宫格解锁,手势操作等)的更多相关文章

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

    滑动屏幕方法swipe一般用于对页面进行上下左右滑动操作,但自动化过程中还会遇到其他情况,如对控件元素进行滑动.拖拽操作,九宫格解锁,手势操作,地图的放大与缩小等.这些需要针对控件元素的滑动操作,或者 ...

  2. MFC中 自定义类访问主对话框控件的方法

    之前一直在找有木有好点的方法.现在终于被我找到,收藏之~~~~~~ 在使用mfc的时候经常遇到自定义类访问主对话框控件的问题,例如自定义类中的方法要输出一段字符串到主对话框的EDIT控件.控制对话框的 ...

  3. appium滚动查找屏幕外的控件

    嗯,还是把自己做的实验保存一下 Appium1.12.1+python2.7 实验滚动,查找屏幕外控件以及控制seekbar scroll() 是根据页面中两个元素位置之间的距离进行滑动. 滑动寻找屏 ...

  4. IOS版App的控件元素定位

    前言 Android版App的控件元素可以通过Android studio自带的工具uiautomatorviewer来协助定位! IOS版App的控件元素可以通过Appium来实现(未实现),或ap ...

  5. 重新想象 Windows 8 Store Apps (12) - 控件之 GridView 特性: 拖动项, 项尺寸可变, 分组显示

    原文:重新想象 Windows 8 Store Apps (12) - 控件之 GridView 特性: 拖动项, 项尺寸可变, 分组显示 [源码下载] 重新想象 Windows 8 Store Ap ...

  6. Delphi fmx控件在手机滑动与单击的问题

    Delphi fmx控件在手机滑动与单击的问题 (2016-03-08 10:52:00) 转载▼ 标签: it delphi 分类: Delphi10 众所周知,fmx制作的app,对于象TEdit ...

  7. 【Android】自己定义控件实现可滑动的开关(switch)

    ~转载请注明来源:http://blog.csdn.net/u013015161/article/details/46704745 介绍 昨天晚上写了一个Android的滑动开关, 即SlideSwi ...

  8. Webview页面的控件元素定位

    前言 现在有很多App都是Hybrid的,即有原生的页面又有Webview的页面,元素的可以通过uiautomatorviewer工具 进行控件元素的定位,Webview页面的则无法通过此方式定位,而 ...

  9. Android版App的控件元素定位

    前言 如何获取页面上各控件元素,无论是Web自动化还是App自动化,此步骤都是非常关键的! Web页面的控件元素可通过开发者选项(Chrome浏览器的F12)来协助定位,App端也是有相应的工具来协助 ...

  10. UITableViewController的子控件不随着滑动

    UITableViewController的子控件不随着滑动 我们知道有时候使用UITableViewController简单便捷,省事,但是如果我们使用了addSubview,无论是[self.vi ...

随机推荐

  1. COM 进程注入技术

    COM PROCESS INJECTION for RUST 项目地址:https://github.com/0xlane/com-process-inject Process Injection v ...

  2. 再讲Floyd变形:传递闭包类问题

    题目 今天上课老师讲到一道传递闭包的问题,由于蒟蒻之前讲的不详细再来讲一遍. 传送门 思路 建图,注意是有向图. 能确定名次指的是:在图上由这个点可以到达的点数+在图上可以到达这个点的点数=n-1 对 ...

  3. 图文并茂--微信小程序,获取用户地理位置信息,并调用腾讯地图API来获取用户具体位置

    今天开始搞这个东西,下面是详细的记录 先看一下效果啦 1.小程序代码先获取用户基础位置信息 js data: { myLocation: 'GET LOCATION', }, openMap() { ...

  4. 解决前端发送post 请求出现403,cancled等问题

    问题一:页面初始加载,部分接口首次请求options是200,然后第二次post请求cancled状态 1. 检查console控制台报错,如果是接口问题,就不用操心了 2.如果是其他报错,那么就不用 ...

  5. Quarkus入门体验,22ms启动一个Web服务

    简介 Quarkus是类似于Spring Boot的框架,可以方便大家进行Java开发.利用GraalVM的魔力,能更好的适应云原生的场景,极快的启动速度. 创建项目 在IDEA就直接有创建Quark ...

  6. Kubernetes(k8s)密码管理:Secret

    目录 一.系统环境 二.前言 三.Secret概览 四.Secret 的类型 五.各种类型的secret使用实例 5.1 创建kubernetes.io/service-account-token类型 ...

  7. drf-day6——九个视图子类、视图集、路由系统、认证组件

    目录 一.九个视图子类 二.视图集 2.1 通过ModelViewSet编写5个接口 2.2 通过ReadOnlyModelViewSet编写2个只读接口 2.3 ViewSetMixin源码分析 总 ...

  8. Pytest插件pytest-order指定用例顺序

    Pytest插件pytest-order指定用例顺序 安装  pip install pytest-order 注意不是pytest-ordering 说起来这里有个故事 关于pytest-order ...

  9. 面向对象程序设计(二):C++模板初探

    背景:老师留了一个作业,对两个数组进行相加,但是总是会出现错误:首先我们需要知道当数组作为参数传递的时候是不能用 sizeof 的,因为当数组传入子函数就变成了普通的数组头:这时候使用 sizeof ...

  10. C++ 从数组中拿值,每个值不相同

    代码和思路 原理就是生成0,n个索引,每个索引不相同即可. 索引再到数组拿数据就行 #include <iostream> #include <vector> #include ...