HDC2021技术分论坛:进程崩溃/应用卡
278 2023-04-03 03:43:06
APP模拟手势的动作都被封装在TouchAction
类中,TouchAction
是AppiumDriver
的辅助类,主要针对手势操作,如滑动、按、拖动等,原理是将一系列的动作放在一个链条中发送到服务器,服务器接受到该链条后,解析各个动作,逐个执行。 所有手势都要通过执行函数才会运行。
提示:
我们之前学习的滑动操作,都是对
TouchAction
进行的封装。之前我们说可以自定义滑动操作,就是通过封装
TouchAction
类中的方法实现的。
注意:
TouchAction
辅助类所有的方法,都不能直接执行,需要调用perfrom()
方法执行。TouchAction
类使用前需要导入包:
from appium.webdriver.common.touch_action import TouchAction
模拟手指轻敲一下屏幕操作。
方法介绍:
轻敲操作:tap(element=None, x=None, y=None) # 发送命令到服务器执行操作 执行方法:perform() # 调用方式 TouchAction(driver).tap(element,x,y).perform()
参数:
element
:被定位到的元素x
:相对于元素左上⻆的坐标,通常会使用元素的X轴坐标y
:通常会使用元素的Y轴坐标参数可以传入元素,也可以传入x
、y
坐标。也就是说可以在元素上进行轻敲动作,也可以在坐标上进行轻敲动作。
业务场景:
代码实现:
""" 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()
一个点击屏幕的操作,可以分为按下和抬起两个操作。
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.学习目标 掌握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()
wait()
方法相当于一个动作要持续多长时间。
方法介绍:
# wait()方法,参数单位:毫秒 wait(ms=0) # 参数: ms:暂停的毫秒数 # 调用方式 TouchAction(driver).press(el=None, x=None, y=None).wait(5000).perform()
业务场:
代码实现:
""" 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()
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.学习目标 掌握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()
方法的封装。
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.学习目标 掌握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()
业务场景:打开设置APP,设置屏幕锁定。
说明:
z
字型图案。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()
__EOF__