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中文版文档:

https://liushilive.github.io/github_selenium_docs_api_py/md/selenium/webdriver/common/touch_actions.html

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偏移量来操作的,这个偏移量是以操作的元素中心为原点的。

posted @ 2021-09-18 19:38  飞翔的猪~  阅读(1308)  评论(2编辑  收藏  举报