一、前言
在做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偏移量來操作的,這個偏移量是以操作的元素中心為原點的。