TouchAction操作
Appium的辅助类,主要针对手势操作,比如滑动、长按、拖动等。其原理是将一系列的动作放在一个链条中,然后将该链条传递给服务器。服务器接受到该链条后,解析各个动作,逐个执行。
TouchAction类支持的动作很多;常用操作如下:
1、press(self,el=None,x=None,y=None): 按压一个元素或坐标,el为要点击的元素,x/y为坐标
2、long_press(self,el=None,x=None,y=None,duration=1000): 长按压一个元素或坐标,默认长按时间1000ms
3、tap(self,element=None,x=None,y=None,count=1): 对一个元素或控件执行点击操作
4、move_to(self,el=None,x=None,y=None): 将指针从上一个点移动到指定的元素或点
5、wait(self,ms=0): 等待时间,单位毫秒
6、release(self): 释放,结束屏幕上的一系列动作的命令操作
7、perform(self): 执行,将待执行的操作发送到服务器的命令操作
利用TouchAction类实现操作如下:
一、利用TouchAction类实现点击操作
导入 from appium.webdriver.common.touch_action import TouchAction
代码示例:
from appium import webdriver # 导入appium 驱动包 from appium.webdriver.webdriver import By # 导入appium 定位的方法包 from appium.webdriver.common.touch_action import TouchAction # 导入appium的TouchAction类 des = { 'automationName':'appium', 'platformName':'Android', 'platformVersion':'6.0.1', # 填写android虚拟机/真机的系统版本号 'deviceName':'MuMu', # 填写安卓虚拟机/真机的设备名称 'appPackage':'com.android.settings', # 填写被测app包名 'appActivity':'.Settings', # 填写被测app的入口 'udid':'127.0.0.1:7555', # 填写通过命令行 adb devices 查看到的udid 'noReset':True, # 是否重置APP 'unicodeKeyboard':True, # 是否支持中文输入 'resetKeyboard':True, # 是否支持重置键盘 'newCommandTimeout':30 # 30秒没发送新命令就断开连接 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',des) el = driver.find_element(By.XPATH,'//android.widget.TextView[@text="显示"]') # el.click() # 通过TouchAction类实现点击操作 TouchAction(driver).press(el).release().perform() # 链条指令 点击操作(同click效果一样)
二、长按操作:
TouchAction(driver).long_press(el,None,None,10000).perform()
代码示例:
# 长按 el元素 3秒 TouchAction(driver).long_press(el=el,duration=3000).perform()
注:long_press 有个bug:把元素作为参数,会把该元素的bounds(该属性可以在ispector工具中查看)属性,相加 /2,得到x,y坐标,但是x和y坐标可能出现小数情况;因为坐标只能是整数,所以会导致报错;
解决方案:
直接使用 long_press 的坐标进行操作;通过元素的x,y坐标的 bounds 属性,把元素坐标的 x相加 除以2 再把 y相加 除以2,如果有小数,就四舍五入
bounds 属性值为元素的左上角坐标和右下角坐标;如下图:
三、手势轨迹操作:
TouchAction(driver).press(x=211,y=660).wait(100).move_to(x=325,y=0).wait(100).move_to(x=0,y=325).move_to(x=0,y=325).release().perform()
备注:坐标采用相对值,非绝对坐标值
代码示例:通过点击并移动实现图案的手势操作
import time from appium import webdriver from appium.webdriver.common.touch_action import TouchAction from appium.webdriver.webdriver import By des = { 'automationName':'appium', 'platformName':'Android', 'platformVersion':'6.0.1', # 填写android虚拟机/真机的系统版本号 'deviceName':'MuMu', # 填写安卓虚拟机/真机的设备名称 'appPackage':'com.android.settings', # 填写被测app包名 'appActivity':'.Settings', # 填写被测app的入口 'udid':'127.0.0.1:7555', # 填写通过命令行 adb devices 查看到的udid 'noReset':True, # 是否重置APP 'unicodeKeyboard':True, # 是否支持中文输入 'resetKeyboard':True, # 是否支持重置键盘 'newCommandTimeout':30 # 30秒没发送新命令就断开连接 } driver = webdriver.Remote('http://127.0.0.1:4723/wd/hub',des) driver.swipe(220,1872,220,1027,5000) # 从坐标1移动到坐标2 时间为5秒 time.sleep(2) # 点击 安全 按钮 el_01 = driver.find_element(By.XPATH,'//android.widget.TextView[@text="安全"]') touch_action = TouchAction(driver) touch_action.press(el_01).release().perform() time.sleep(2) # 点击 屏幕锁定方式 按钮 el_02 = driver.find_element(By.XPATH,'//android.widget.TextView[@text="屏幕锁定方式"]') touch_action.press(el_02).release().perform() time.sleep(2) # 点击 图案 按钮 el_03 = driver.find_element(By.XPATH,'//android.widget.TextView[@text="图案"]') touch_action.press(el_03).release().perform() # 执行手势操作 图案坐标 190 705 / 564 708 / 565 1085 / 562 1457 / 937 1455 / 935 1085 touch_action = (touch_action.press(x=190,y=705).wait(1000).move_to(x=564,y=708) .wait(1000).move_to(x=565,y=1085).wait(1000).move_to(x=562,y=1457) .wait(1000).move_to(x=937,y=1455).wait(1000).move_to(x=935, y=1085) .release().perform())
效果如下:
自动化测试相关教程推荐:
2023最新自动化测试自学教程新手小白26天入门最详细教程,目前已有300多人通过学习这套教程入职大厂!!_哔哩哔哩_bilibili
2023最新合集Python自动化测试开发框架【全栈/实战/教程】合集精华,学完年薪40W+_哔哩哔哩_bilibili
测试开发相关教程推荐
2023全网最牛,字节测试开发大佬现场教学,从零开始教你成为年薪百万的测试开发工程师_哔哩哔哩_bilibili
postman/jmeter/fiddler测试工具类教程推荐
讲的最详细JMeter接口测试/接口自动化测试项目实战合集教程,学jmeter接口测试一套教程就够了!!_哔哩哔哩_bilibili
2023自学fiddler抓包,请一定要看完【如何1天学会fiddler抓包】的全网最详细视频教程!!_哔哩哔哩_bilibili
2023全网封神,B站讲的最详细的Postman接口测试实战教学,小白都能学会_哔哩哔哩_bilibili
总结:
光学理论是没用的,要学会跟着一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
如果对你有帮助的话,点个赞收个藏,给作者一个鼓励。也方便你下次能够快速查找。
如有不懂还要咨询下方小卡片,博主也希望和志同道合的测试人员一起学习进步
在适当的年龄,选择适当的岗位,尽量去发挥好自己的优势。
我的自动化测试开发之路,一路走来都离不每个阶段的计划,因为自己喜欢规划和总结,
测试开发视频教程、学习笔记领取传送门!!