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())
效果如下:
标签:el,None,TouchAction,driver,Appium,appium,press,13 From: https://blog.51cto.com/YouJeffrey/6363059