APP模拟手势的动作都被封装在TouchAction类中,TouchActionAppiumDriver的辅助类,主要针对手势操作,如滑动、按、拖动等,原理是将一系列的动作放在一个链条中发送到服务器,服务器接受到该链条后,解析各个动作,逐个执行。 所有手势都要通过执行函数才会运行。

提示:

我们之前学习的滑动操作,都是对TouchAction进行的封装。

之前我们说可以自定义滑动操作,就是通过封装TouchAction类中的方法实现的。

注意:

  • TouchAction辅助类所有的方法,都不能直接执行,需要调用perfrom()方法执行。
  • TouchAction类使用前需要导入包:

from appium.webdriver.common.touch_action import TouchAction

1、手指轻敲操作

模拟手指轻敲一下屏幕操作。

方法介绍:

轻敲操作:tap(element=None, x=None, y=None)

# 发送命令到服务器执行操作
执行方法:perform() # 调用方式
TouchAction(driver).tap(element,x,y).perform()

参数:

  1. element:被定位到的元素
  2. x:相对于元素左上⻆的坐标,通常会使用元素的X轴坐标
  3. y:通常会使用元素的Y轴坐标

参数可以传入元素,也可以传入xy坐标。也就是说可以在元素上进行轻敲动作,也可以在坐标上进行轻敲动作。

业务场景:

  1. 进入设置。
  2. 点击“蓝牙”选项。

代码实现:

"""
1.学习目标
掌握TouchAction类使用,
轻敲方法tap
2.操作步骤
2.1 导入TouchAction类
2.2 使用tap方法---手指轻敲
tap(element=None,x=None,y=None)
element 元素
x 坐标
y 坐标 使用方式:
TouchAction(driver).tap(element,x,y).perform()
3.需求
使用tap方法点击设置首页蓝牙
""" # 1.导入appium和TouchAction
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction # 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
"platformName": "Android", # 系统名称
"platformVersion": "7.1.2", # 系统版本
"deviceName": "127.0.0.1:21503", # 设备名称
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP启动名
} # 3.启动APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
time.sleep(2) # 4.操作APP
# 使用TouchAction中的tap方法点击蓝牙
# 4.1 敲击元素,传入元素
# 先定位到元素
blue_tooth = driver.find_element_by_android_uiautomator('new UiSelector().text("蓝牙")')
# 轻敲蓝牙按钮
TouchAction(driver).tap(blue_tooth).perform() # 注意:
# 现在不是用click()方法进行点击元素的,
# 而是用TouchAction类中的tap方法进行的点击元素操作。 # 4.2 进入到蓝牙界面,传入开启\关闭按钮的坐标,实现开启\关闭蓝牙的操作
# 可以通过uiautomatorviewer定位工具获得元素按钮的坐标
# 开启\关闭元素的坐标为:[108,138][624,185]
# 也就是该元素x轴坐标为108到624,y轴坐标138到185
# 点击“关闭”按钮关闭蓝牙
time.sleep(2)
TouchAction(driver).tap(x=120, y=200).perform() # 点击“开启”按钮打开蓝牙
time.sleep(2)
TouchAction(driver).tap(x=120, y=200).perform() # 5.关闭APP
time.sleep(5)
driver.quit()

拓展:

如果调用tap()方法时,同时元素和坐标都传入参数,到底会怎样执行呢?

结论:

  • tap()方法元素和坐标参数同时传入,使用元素参数进行操作。
  • 如果所传的元素参数定位不到该元素,就会报错。

所以,传入元素参数就不用传入坐标参数了,二者选其一就行。

示例:

# 1.导入appium和TouchAction
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction # 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
"platformName": "Android", # 系统名称
"platformVersion": "7.1.2", # 系统版本
"deviceName": "127.0.0.1:21503", # 设备名称
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP启动名
} # 3.启动APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
time.sleep(2) # 4.操作APP
# 元素和坐标都传入
# 当元素和坐标在同一个元素上的时候,两个都传入会正常执行。
# 当元素和坐标所指的位置不同时,执行元素参数。
view = driver.find_element_by_android_uiautomator('new UiSelector().text("显示")')
# 坐标指向蓝牙,坐标为x=120, y=200
TouchAction(driver).tap(element=view, x=120, y=200).perform() # 5.关闭APP
time.sleep(5)
driver.quit()

2、手指按下和抬起操作

一个点击屏幕的操作,可以分为按下和抬起两个操作。

press()方法:模拟手指按下屏幕的操作。

release()方法:表示结束动作,手指离开屏幕

方法介绍:

# press()方法
press(el=None, x=None, y=None)
参数:
1.element:被定位到的元素
2.x:通常会使用元素的X轴坐标
3.y:通常会使用元素的Y轴坐标 # release()方法没有参数,执行调用即可 # 调用方式
TouchAction(driver).press(el=None, x=None, y=None).release().perform()

业务场景:

  1. 进入设置。
  2. 点击蓝牙选项。

代码实现:

"""
1.学习目标
掌握TouchAction类使用,
按下press()方法和抬起release()方法的操作
2.操作步骤
2.1 导入TouchAction类
2.2 使用press()---按压操作
press(el=None,x=None,y=None)
element 元素
x 坐标
y 坐标 release()方法---抬起操作 使用方式:
TouchAction(driver).press(el=None, x=None, y=None).release().perform()
3.需求
使用press()方法和抬起release()方法实现点击设置首页蓝牙按钮
""" # 1.导入appium和TouchAction
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction # 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
"platformName": "Android", # 系统名称
"platformVersion": "7.1.2", # 系统版本
"deviceName": "127.0.0.1:21503", # 设备名称
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP启动名
} # 3.启动APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
time.sleep(2) # 4.操作APP
# 使用press()方法按下蓝牙按钮,使用release()方法抬起
blue_tooth = driver.find_element_by_android_uiautomator('new UiSelector().text("蓝牙")')
# 如果三个参数都传入,按照元素参数执行,同tap()方法。
TouchAction(driver).press(blue_tooth).release().perform() # 注意:如果想按住不松手,就单独调用一个press()方法即可。 # 5.关闭APP
time.sleep(5)
driver.quit()

3、等待操作

wait()方法相当于一个动作要持续多长时间。

方法介绍:

# wait()方法,参数单位:毫秒
wait(ms=0) # 参数:
ms:暂停的毫秒数 # 调用方式
TouchAction(driver).press(el=None, x=None, y=None).wait(5000).perform()

业务场:

  1. 进入设置。
  2. 长按蓝牙选项5秒。

代码实现:

"""
1.学习目标
掌握TouchAction类中等待操作使用
2.操作步骤
2.1 等待方法 wait(时间,单位ms)
2.2 调用方式
TouchAction(driver).press(el=None, x=None, y=None).wait(5000).perform()
3.需求
在设置app首页长按蓝牙选项5秒
""" # 1.导入appium和TouchAction
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction # 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
"platformName": "Android", # 系统名称
"platformVersion": "7.1.2", # 系统版本
"deviceName": "127.0.0.1:21503", # 设备名称
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP启动名
} # 3.启动APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
time.sleep(2) # 4.操作APP
# 在设置app首页长按蓝牙选项5秒
# 定位蓝牙元素
blue_tooth = driver.find_element_by_android_uiautomator('new UiSelector().text("蓝牙")')
# 长按蓝牙选项5秒
TouchAction(driver).press(blue_tooth).wait(5000).perform()
# 也可以长安蓝牙选项5秒之后把手抬起操作,如下调用方式:
# TouchAction(driver).press(blue_tooth).wait(5000).release().perform() # 5.关闭APP
time.sleep(5)
driver.quit()

4、手指长按操作

long_press()模拟手机按下屏幕一段时间。

方法介绍:

# long_press()方法
long_press(el=None, x=None, y=None, duration=1000) 参数:
1.element:被定位到的元素。
2.x:通常会使用元素的X轴坐标。
3.y:通常会使用元素的Y轴坐标。
4.duration:持续时间,默认为1000ms。 # 调用方式
TouchAction(driver).long_press(el=None, x=None, y=None, duration=1000).release().perform()

业务场景:

  1. 进入设置。
  2. 长按蓝牙选项。

代码实现:

"""
1.学习目标
掌握TouchAction类长按操作使用
2.操作步骤
2.1 长按 long_press(el=None, x=None, y=None, duration=1000)
参数:
1.element:被定位到的元素。
2.x:通X轴坐标。
3.y:Y轴坐标。
4.duration:持续时间,默认为1000ms。
3.需求
在设置app首页长按蓝牙选项
""" # 1.导入appium和TouchAction
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction # 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
"platformName": "Android", # 系统名称
"platformVersion": "7.1.2", # 系统版本
"deviceName": "127.0.0.1:21503", # 设备名称
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP启动名
} # 3.启动APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
time.sleep(2) # 4.操作APP
# 在设置app首页长按蓝牙选项
blue_tooth = driver.find_element_by_android_uiautomator('new UiSelector().text("蓝牙")')
TouchAction(driver).long_press(el=blue_tooth, duration=5000).release().perform() # 5.关闭APP
time.sleep(5)
driver.quit()

说明:long_press()方法就相当于press()方法和wait()方法的封装。

5、手指移动操作

move_to()方法:模拟手机的滑动操作。

方法介绍:

# move_to()方法
move_to(el=None, x=None, y=None) 参数:
1.el:定位的元素
2.x:滑动到元素的X轴坐标
3.y:滑动到元素的Y轴坐标 # 调用方式
TouchAction(driver).press(save).move_to(el=None, x=None, y=None).release().perform()

业务场景:

  1. 进入设置APP。
  2. 在设置APP首页从存储滑动到蓝牙。

代码实现:

"""
1.学习目标
掌握TouchAction类中手指移动使用
2.操作步骤
移动 move_to(元素)
3.需求
在设置app首页从存储滑动到蓝牙
""" # 1.导入appium和TouchAction
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction # 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
"platformName": "Android", # 系统名称
"platformVersion": "7.1.2", # 系统版本
"deviceName": "127.0.0.1:21503", # 设备名称
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP启动名
} # 3.启动APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
time.sleep(2) # 4.操作APP
# 在设置app首页从存储滑动到蓝牙
save = driver.find_element_by_android_uiautomator('new UiSelector().text("存储")')
blue_tooth = driver.find_element_by_android_uiautomator('new UiSelector().text("蓝牙")')
# 滑动,相当于于向上滑动屏幕操作
TouchAction(driver).press(save).wait(5000).move_to(blue_tooth).release().perform() # 5.关闭APP
time.sleep(5)
driver.quit()

6、综合练习

业务场景:打开设置APP,设置屏幕锁定。

说明:

  • 实现步骤:

    打开设置APP首页,

    需要向上滑动屏幕(手势),到页面显示"安全"选项。

    定位"安全"选项,并进入安全页面。

    在安全页面中定位”屏幕锁定“选项,并点击进入。

    ”屏幕锁定“页面定位”图案“选项,并点击进入。

    开始绘制z字型图案。
  • 问题:

    1,不能直接定位到9个黑点的位置。因为红框内为一个元素,是一个整体,所以只能通过坐标的方式来进行定位。



    2,如何使用坐标的方式定位黑点

    方法很简单,就在UI Automator Viewer工具中,把鼠标放在黑点的上方就可以了。如下图:

    (注意:需要把工具的界面拉大一些。)

代码实现:

# 1.导入appium和TouchAction
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction # 2.创建Desired capabilities对象,添加启动参数
desired_caps = {
"platformName": "Android", # 系统名称
"platformVersion": "7.1.2", # 系统版本
"deviceName": "127.0.0.1:21503", # 设备名称
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP启动名
} # 3.启动APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
time.sleep(2) # 4.操作APP
# 4.1 在设置app首页从存储滑动到蓝牙
# 定位“存储”和“滑动”元素
save = driver.find_element_by_android_uiautomator('new UiSelector().text("存储")')
blue_tooth = driver.find_element_by_android_uiautomator('new UiSelector().text("蓝牙")')
# 开始滑动屏幕
driver.scroll(save, blue_tooth, duration=4000)
time.sleep(2) # 4.2 定位“安全”选项,并点击进入。 safe = driver.find_element_by_android_uiautomator('new UiSelector().text("安全")')
# 使用tap()方法,轻敲点击进入
TouchAction(driver).tap(safe).perform()
time.sleep(1) # 4.3 定位“屏幕锁定”选项,并点击进入。
# 定位“屏幕锁定”选项
lock = driver.find_element_by_android_uiautomator('new UiSelector().text("屏幕锁定")')
# 使用按下和抬起操作,点击进入
TouchAction(driver).press(lock).wait(3000).release().perform()
time.sleep(1) # 4.4 定位“图案”选项,并点击进入。
# 定位“图案”选项
design = driver.find_element_by_android_uiautomator('new UiSelector().text("图案")')
# 使用长按操作,点击进入
TouchAction(driver).long_press(el=design, duration=3000).release().perform()
time.sleep(1) # 5.开始绘图
TouchAction(driver).press(x=145, y=615).move_to(x=575, y=620).wait(3000) \
.move_to(x=145, y=1050).wait(3000) \
.move_to(x=575, y=1050).release().perform() # 之后可以点击确定等继续操作 # 6.关闭APP
time.sleep(5)
driver.quit()

『与善仁』Appium基础 — 25、APP模拟手势高级操作的更多相关文章

  1. 『与善仁』Appium基础 — 27、模拟手势点击坐标

    目录 1.模拟手势点击坐标 2.tap()用法 3.练习 4.弊端 1.模拟手势点击坐标 在定位元素的时候,你使出了十八班武艺还是定位不到,怎么办呢?(面试经常会问) 那就拿出绝招:点击元素所在位置的 ...

  2. 『与善仁』Appium基础 — 15、使用Appium的第一个Demo

    我们使用Python语言作为测试脚本的编写语言. 执行脚本前提: Android模拟器或者手机是开机状态. 使用确保电脑和Android设备进行了链接. 也就是使用ADB命令adb connect链接 ...

  3. 『与善仁』Appium基础 — 18、元素定位工具(二)

    目录 1.Appium Inspector介绍 2.Appium Inspector打开方式 3.Appium Inspector布局介绍 4.Appium Inspector工具的配置 5.Appi ...

  4. 『与善仁』Appium基础 — 20、Appium元素定位

    目录 1.by_id定位 2.by_name定位 3.by_class_name定位 4.by_xpath定位 5.by_accessibility_id定位 6.by_android_uiautom ...

  5. 『与善仁』Appium基础 — 21、元素的基本操作

    目录 1.元素的基本操作说明 (1)点击操作 (2)清空操作 (3)输入操作 2.综合练习 1.元素的基本操作说明 (1)点击操作 点击操作:click()方法.(同Selenium中使用方式一致) ...

  6. 『与善仁』Appium基础 — 8、Appium自动化测试框架介绍

    目录 1.主流的移动端自动化测试框架 (1)Robotium (2)Macaca (3)Appium 2.自动化测试工具的选择 3.Appium简介 提示:我们前面说的Android环境搭建和adb命 ...

  7. 『与善仁』Appium基础 — 22、获取元素信息的操作(一)

    目录 1.获取元素文本内容 (1)text()方法 (2)get_attribute()方法 (3)综合练习 2.获取元素在屏幕上的坐标 1.获取元素文本内容 (1)text()方法 业务场景: 进入 ...

  8. 『与善仁』Appium基础 — 23、操作滑动的方式

    目录 1.swipe滑动 2.scroll滑动 3.drag拖拽事件 4.滑动方法小结 5.拓展:多次滑动 6.综合练习 在Appium中提供了三种滑动的方式,swipe滑动.scroll滑动.dra ...

  9. 『与善仁』Appium基础 — 26、常用手机操作的API说明

    目录 1.获取当前手机的时间 2.获取手机屏幕的宽和高 3.获取手机当前网络 4.设置手机网络模式 5.操作手机通知栏 6.综合练习 7.发送键到设备(掌握) 8.手机截图(掌握) 是针对手机一些常用 ...

随机推荐

  1. [atARC110F]Esoswap

    先构造使得$p_{i}$降序(即$p_{i}=n-1-i$),只需要从后往前,不断执行$i$操作直至合法即可 正确性的证明:首先保证了$[0,n-i)$这些数字都已经出现,因此操作不会破坏已确定的数字 ...

  2. React-native键盘遮挡输入框问题的解决

    2016年10月25日更新: 现在有一个更准确一点的做法是用一个View包裹住TextInput,然后通过该View的onLayout方法获取该输入框的y轴位置,再减去一个适当的高度去处理scroll ...

  3. 统计学习2:线性可分支持向量机(Scipy实现)

    1. 模型 1.1 超平面 我们称下面形式的集合为超平面 \[\begin{aligned} \{ \bm{x} | \bm{a}^{T} \bm{x} - b = 0 \} \end{aligned ...

  4. Codeforces Round #681 (Div. 1) Solution

    A. Extreme Subtraction 把这个数组差分一下,发现操作一的作用是把 \(d_1\) 的大小分给 \(d_i\),而操作二的作用是把 \(d_i\) 减去任意值,目标是把 \(d\) ...

  5. R之dplyr::select/mutate函数扩展

    select函数 dplyr包select函数用的很多,不过我们一般也是通过正反选列名或数字来选择列. 常见用法如: select(iris,c(1,3)) select(iris,1,3) #同上 ...

  6. C语言 字符串指针和字符串数组使用区别

    字符串指针和字符串数组使用区别 1 #include <stdio.h> 2 #include <string.h> 3 #include <stdlib.h> 4 ...

  7. 变量、内存区域、MDK文件(map、htm)

    变量分为:局部变量和全局变量 局部变量:函数体内部定义的变量,作用域为函数内部,static声明(静态局部变量)该变量则函数调用结束后不消失而保留值,分配的存储空间不释放. 全局变量:函数体外部定义的 ...

  8. Demo01无重复数字

    package 习题集2;//有1,2,3,4四个数字,能组成多少个互不相同且无重复数字的三位数?都是多少?public class Demo1 { public static void main(S ...

  9. 学习java的第九天

    一.今日收获 1.java完全学习手册第二章程序流程控制中的顺序结构与选择结构 2.学习了java中选择的一些语句和关键词 二.今日问题 1.例题验证有错的情况 2.哔哩哔哩教学视频的一些术语不太理解 ...

  10. Windows Server 2016域控制器升级到Windows Server 2022遇到的问题记录Fix error 0x800F081E – 0x20003

    1. 非域控服务器升级 将两台Web服务器和数据库服务器(Windows Server 2016, 2019)成功升级至到Windows Server 2022,非常顺利,一次成功. 直接在Windo ...