UI自动化测试:TouchAction & TouchActions区别
一、前言
在做App自动化测试时,经常需要进行手势操作,比如滑屏、放大、缩小等,这里就涉及到TouchAction & TouchActions两个模块。TouchAction和TouchActions主要用于App、webview的手势操作,用法与PC端的ActionChains类似。
1、TouchAction、TouchActions区别
TouchAction是appium的辅助类,主要是一些手势操作。TouchActions是Selenium的辅助类,在TouchAction的基础上做了些功能补充。TouchAction和TouchActions只能用于单个手指的操作,MultiAction可以模拟多指操作。
二、TouchAction介绍
1、官方文档
http://appium.io/docs/cn/writing-running-appium/touch-actions/
2、导入TouchAction模块
from appium.webdriver.common.touch_action import TouchAction
3、操作方法
1)tap():点击操作
对一个元素或控件执行点击操作
方法:tap(element=None, x=None, y=None, count=1)
示例:
# 操作的元素对象
ele_str = driver.find_element(By.XPATH, "//span[text()='立即体验']")
# 通过定位到的元素点击
TouchAction(driver).tap(ele_str).release().perform()
# 通过元素坐标点击
TouchAction(driver).tap(x=360, y=1320).release().perform()
# 以定位的元素左上角为原点,分别向下、向右偏移10个像素点
TouchAction(driver).tap(ele_str, 10, 10).release().perform()
2) press():按压操作
按压一个元素或坐标点(x,y),通过手指按压手机屏幕的某个位置。
方法:press(el=None, x=None, y=None)
示例:
# 操作的元素对象
ele_str = driver.find_element(By.XPATH, "//span[text()='立即体验']")
# 按压定位到的元素
TouchAction(driver).press(ele_str).release().perform()
# 按压元素坐标点
TouchAction(driver).press(x=360, y=1320).release().perform()
# 以元素的左上角为原点,分别向下、向右偏移10个像素点,然后按压释放
TouchAction(driver).press(ele_str, 10, 10).release().perform()
3) long_press():长按操作
长按一个元素或坐标点(x,y)。 相比press()方法,long_press()多了一个入参duration。duration指按压持续时间,以毫秒为单位,1000表示按一秒钟,必须是int类型。其用法与press()方法相同。
方法:long_press(el=None, x=None, y=None, duration=1000)
示例:
# 操作的元素对象
ele_str = driver.find_element(By.XPATH, "//span[text()='立即体验']")
# 长按元素,持续5秒时间
TouchAction(driver).long_press(ele_str, duration=5000).release().perform()
# 长按坐标点,持续5秒时间
TouchAction(driver).long_press(x=360, y=1320, duration=5000).release().perform()
# 以元素的左上角为原点,分别向下、向右偏移10个像素点,长按5秒然后释放
TouchAction(driver).long_press(ele_str, 10, 10, duration=5000).release().perform()
4)move_to():移动
将指针或光标从上一个点移动到指定的元素或坐标点。
方法:move_to(el=None, x=None, y=None)
示例:
# 操作的元素对象
ele_str = driver.find_element(By.XPATH, "//span[text()='立即体验']")
# 在坐标(360,1320)处按下,滑动到坐标(700,1320)处,然后释放手指
TouchAction(driver).press(x=360, y=1320).move_to(x=700, y=1320).release().perform()
# 在元素ele_str所在位置处按下,滑动至元素ele_end处,然后释放手指
TouchAction(driver).press(ele_str).move_to(ele_end).release().perform()
5)wait():等待
执行手势动作时,等待一段时间。wait(int ms),单位是毫秒,1s = 1000ms
示例:
# 在坐标(360,1320)处按下后等待2秒,然后滑动至坐标(700,1320)处
TouchAction(self.driver).press(x=360, y=1320).wait(2000).move_to(x=700, y=1320).release().perform()
6)release():释放
释放屏幕上的指针操作,与按下和长按联合使用。
7) perform():执行
发送需要执行的动作指令集至服务器。
8)连续滑屏
App自动化测试时有时需要滑动多个点,可以使用多个move_to()组合。
示例:
TouchAction(driver).press(x=10, y=10).wait(2000) \
.move_to(x=20, y=20).wait(1000) \
.move_to(x=30, y=30).wait(1000) \
.release().perform()
三、TouchActions介绍
1、说明文档
TouchActions官方文档:
https://www.selenium.dev/selenium/docs/api/py/webdriver/selenium.webdriver.common.touch_actions.html
TouchActions中文版文档:
2、导入TouchActions模块
from selenium.webdriver.common.touch_actions import TouchActions
3、操作方法
1) tap(on_element):单击
点击给定的元素。
参数on_element: 要点按的元素
2) double_tap(on_element):双击
双击特定元素。
参数on_element: 要点按的元素。
3) tap_and_hold(xcoord, ycoord)
在给定坐标处按下并保持。
参数:
xcoord: X 轴坐标
ycoord: Y 轴坐标
4) move(xcoord, ycoord)
按压住某点移动至指定位置。
参数:
xcoord: X 轴坐标
ycoord: Y 轴坐标
5) scroll(xoffset, yoffset)
触摸并滚动,向 xoffset 和 yoffset 移动。
参数:
xoffset: X 轴偏移量
yoffset: Y 轴偏移量
6) scroll_from_element(on_element, xoffset, yoffset)
触摸并滚动从 on_element 开始,向 xoffset 和 yoffset 移动。
参数:
on_element: 滚动开始的元素
xoffset: X 轴偏移量
yoffset: Y 轴偏移量
7) long_press(on_element)
长按一个元素。
参数:
on_element: 长按的元素
8) flick(xspeed, yspeed)
从屏幕上的任意位置开始轻弹。
参数:
xspeed: X 轴速度,以每秒像素为单位。
yspeed: Y 轴速度,以每秒像素为单位。
9) flick_element(on_element, xoffset, yoffset, speed)
从 on_element 开始轻弹,然后以指定的速度移动 xoffset 和 yoffset。
参数:
on_element: Flick 将从元素的中心开始。
xoffset: X 轴偏移量
yoffset: Y 轴偏移量
speed: 每秒偏移的像素
10)release(xcoord, ycoord)
在指定位置释放先前发出的 tap 和 hold 命令。
参数:
xcoord: X 轴坐标
ycoord: Y 轴坐标
11)perform()
发送需要执行的动作指令集至服务器。
4、Tips
TouchActions我还没找到使用场景,后面遇到了再补上使用示例。
TouchAction和TouchActions方法中用到的坐标可以通过下面的方法获取:
1)获取屏幕大小
print("获取屏幕大小:", driver.get_window_size())
执行结果:获取屏幕大小: {'width': 720, 'height': 1491}
2)获取元素大小
# 操作的元素对象
ele_str = driver.find_element(By.XPATH, "//span[text()='立即体验']")
print("location获取元素坐标:", ele_str.location)
print("location获取元素坐标X值:", ele_str.location["x"])
print("size获取元素大小:", ele_str.size)
print("size获取元素的长度:", ele_str.size['width'])
print("rect获取元素坐标和大小:", ele_str.rect)
执行结果:
location获取元素坐标: {'x': 260, 'y': 1290}
location获取元素坐标X值: 260
size获取元素大小: {'height': 60, 'width': 200}
size获取元素的长度: 200
rect获取元素坐标和大小: {'height': 60, 'width': 200, 'x': 260, 'y': 1290}
3)手机App坐标与Webview页面坐标
在做UI自动化测试用到TouchAction和TouchActions时,有的需要获取元素的坐标,然后对坐标进行press、tap等操作。在进行手机App测试时,webview页面获取的坐标会有区别。
如上图,title部分是APP原生的,下面部分是webview环境,在获取webview部分的“看看关注”按钮的坐标时,是以webview环境的左上角为原点计算的,这样获取的坐标与屏幕的像素坐标点不一致,在使用TouchAction对“看看关注”坐标进行操作时,会得不到预期结果。
只有Android、ios原生的App环境获取的坐标可以使用TouchAction操作。
4)偏移量
TouchActions有的操作方法中是使用xoffset、yoffset偏移量来操作的,这个偏移量是以操作的元素中心为原点的。