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类实现点击:
导入 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 = {
'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 属性值为元素的左上角坐标和右下角坐标;如下图: