APP模擬手勢的動作都被封裝在TouchAction
類中,TouchAction
是AppiumDriver
的輔助類,主要針對手勢操作,如滑動、按、拖動等,原理是將一系列的動作放在一個鏈條中傳送到伺服器,伺服器接受到該鏈條後,解析各個動作,逐個執行。 所有手勢都要通過執行函式才會執行。
提示:
我們之前學習的滑動操作,都是對
TouchAction
進行的封裝。之前我們說可以自定義滑動操作,就是通過封裝
TouchAction
類中的方法實現的。
注意:
TouchAction
輔助類所有的方法,都不能直接執行,需要呼叫perfrom()
方法執行。TouchAction
類使用前需要匯入包:
from appium.webdriver.common.touch_action import TouchAction
1、手指輕敲操作
模擬手指輕敲一下螢幕操作。
方法介紹:
輕敲操作:tap(element=None, x=None, y=None)
# 傳送命令到伺服器執行操作
執行方法:perform()
# 呼叫方式
TouchAction(driver).tap(element,x,y).perform()
引數:
element
:被定位到的元素x
:相對於元素左上⻆的座標,通常會使用元素的X軸座標y
:通常會使用元素的Y軸座標
引數可以傳入元素,也可以傳入x
、y
座標。也就是說可以在元素上進行輕敲動作,也可以在座標上進行輕敲動作。
業務場景:
- 進入設定。
- 點選“藍芽”選項。
程式碼實現:
"""
1.學習目標
掌握TouchAction類使用,
輕敲方法tap
2.操作步驟
2.1 匯入TouchAction類
2.2 使用tap方法---手指輕敲
tap(element=None,x=None,y=None)
element 元素
x 座標
y 座標
使用方式:
TouchAction(driver).tap(element,x,y).perform()
3.需求
使用tap方法點選設定首頁藍芽
"""
# 1.匯入appium和TouchAction
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
# 2.建立Desired capabilities物件,新增啟動引數
desired_caps = {
"platformName": "Android", # 系統名稱
"platformVersion": "7.1.2", # 系統版本
"deviceName": "127.0.0.1:21503", # 裝置名稱
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP啟動名
}
# 3.啟動APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
time.sleep(2)
# 4.操作APP
# 使用TouchAction中的tap方法點選藍芽
# 4.1 敲擊元素,傳入元素
# 先定位到元素
blue_tooth = driver.find_element_by_android_uiautomator('new UiSelector().text("藍芽")')
# 輕敲藍芽按鈕
TouchAction(driver).tap(blue_tooth).perform()
# 注意:
# 現在不是用click()方法進行點選元素的,
# 而是用TouchAction類中的tap方法進行的點選元素操作。
# 4.2 進入到藍芽介面,傳入開啟\關閉按鈕的座標,實現開啟\關閉藍芽的操作
# 可以通過uiautomatorviewer定位工具獲得元素按鈕的座標
# 開啟\關閉元素的座標為:[108,138][624,185]
# 也就是該元素x軸座標為108到624,y軸座標138到185
# 點選“關閉”按鈕關閉藍芽
time.sleep(2)
TouchAction(driver).tap(x=120, y=200).perform()
# 點選“開啟”按鈕開啟藍芽
time.sleep(2)
TouchAction(driver).tap(x=120, y=200).perform()
# 5.關閉APP
time.sleep(5)
driver.quit()
擴充:
如果呼叫tap()
方法時,同時元素和座標都傳入引數,到底會怎樣執行呢?
結論:
tap()
方法元素和座標引數同時傳入,使用元素引數進行操作。- 如果所傳的元素引數定位不到該元素,就會報錯。
所以,傳入元素引數就不用傳入座標引數了,二者選其一就行。
示例:
# 1.匯入appium和TouchAction
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
# 2.建立Desired capabilities物件,新增啟動引數
desired_caps = {
"platformName": "Android", # 系統名稱
"platformVersion": "7.1.2", # 系統版本
"deviceName": "127.0.0.1:21503", # 裝置名稱
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP啟動名
}
# 3.啟動APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
time.sleep(2)
# 4.操作APP
# 元素和座標都傳入
# 當元素和座標在同一個元素上的時候,兩個都傳入會正常執行。
# 當元素和座標所指的位置不同時,執行元素引數。
view = driver.find_element_by_android_uiautomator('new UiSelector().text("顯示")')
# 座標指向藍芽,座標為x=120, y=200
TouchAction(driver).tap(element=view, x=120, y=200).perform()
# 5.關閉APP
time.sleep(5)
driver.quit()
2、手指按下和抬起操作
一個點選螢幕的操作,可以分為按下和抬起兩個操作。
press()
方法:模擬手指按下螢幕的操作。
release()
方法:表示結束動作,手指離開螢幕
方法介紹:
# press()方法
press(el=None, x=None, y=None)
引數:
1.element:被定位到的元素
2.x:通常會使用元素的X軸座標
3.y:通常會使用元素的Y軸座標
# release()方法沒有引數,執行呼叫即可
# 呼叫方式
TouchAction(driver).press(el=None, x=None, y=None).release().perform()
業務場景:
- 進入設定。
- 點選藍芽選項。
程式碼實現:
"""
1.學習目標
掌握TouchAction類使用,
按下press()方法和抬起release()方法的操作
2.操作步驟
2.1 匯入TouchAction類
2.2 使用press()---按壓操作
press(el=None,x=None,y=None)
element 元素
x 座標
y 座標
release()方法---抬起操作
使用方式:
TouchAction(driver).press(el=None, x=None, y=None).release().perform()
3.需求
使用press()方法和抬起release()方法實現點選設定首頁藍芽按鈕
"""
# 1.匯入appium和TouchAction
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
# 2.建立Desired capabilities物件,新增啟動引數
desired_caps = {
"platformName": "Android", # 系統名稱
"platformVersion": "7.1.2", # 系統版本
"deviceName": "127.0.0.1:21503", # 裝置名稱
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP啟動名
}
# 3.啟動APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
time.sleep(2)
# 4.操作APP
# 使用press()方法按下藍芽按鈕,使用release()方法抬起
blue_tooth = driver.find_element_by_android_uiautomator('new UiSelector().text("藍芽")')
# 如果三個引數都傳入,按照元素引數執行,同tap()方法。
TouchAction(driver).press(blue_tooth).release().perform()
# 注意:如果想按住不鬆手,就單獨呼叫一個press()方法即可。
# 5.關閉APP
time.sleep(5)
driver.quit()
3、等待操作
wait()
方法相當於一個動作要持續多長時間。
方法介紹:
# wait()方法,引數單位:毫秒
wait(ms=0)
# 引數:
ms:暫停的毫秒數
# 呼叫方式
TouchAction(driver).press(el=None, x=None, y=None).wait(5000).perform()
業務場:
- 進入設定。
- 長按藍芽選項5秒。
程式碼實現:
"""
1.學習目標
掌握TouchAction類中等待操作使用
2.操作步驟
2.1 等待方法 wait(時間,單位ms)
2.2 呼叫方式
TouchAction(driver).press(el=None, x=None, y=None).wait(5000).perform()
3.需求
在設定app首頁長按藍芽選項5秒
"""
# 1.匯入appium和TouchAction
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
# 2.建立Desired capabilities物件,新增啟動引數
desired_caps = {
"platformName": "Android", # 系統名稱
"platformVersion": "7.1.2", # 系統版本
"deviceName": "127.0.0.1:21503", # 裝置名稱
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP啟動名
}
# 3.啟動APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
time.sleep(2)
# 4.操作APP
# 在設定app首頁長按藍芽選項5秒
# 定位藍芽元素
blue_tooth = driver.find_element_by_android_uiautomator('new UiSelector().text("藍芽")')
# 長按藍芽選項5秒
TouchAction(driver).press(blue_tooth).wait(5000).perform()
# 也可以長安藍芽選項5秒之後把手抬起操作,如下呼叫方式:
# TouchAction(driver).press(blue_tooth).wait(5000).release().perform()
# 5.關閉APP
time.sleep(5)
driver.quit()
4、手指長按操作
long_press()
模擬手機按下螢幕一段時間。
方法介紹:
# long_press()方法
long_press(el=None, x=None, y=None, duration=1000)
引數:
1.element:被定位到的元素。
2.x:通常會使用元素的X軸座標。
3.y:通常會使用元素的Y軸座標。
4.duration:持續時間,預設為1000ms。
# 呼叫方式
TouchAction(driver).long_press(el=None, x=None, y=None, duration=1000).release().perform()
業務場景:
- 進入設定。
- 長按藍芽選項。
程式碼實現:
"""
1.學習目標
掌握TouchAction類長按操作使用
2.操作步驟
2.1 長按 long_press(el=None, x=None, y=None, duration=1000)
引數:
1.element:被定位到的元素。
2.x:通X軸座標。
3.y:Y軸座標。
4.duration:持續時間,預設為1000ms。
3.需求
在設定app首頁長按藍芽選項
"""
# 1.匯入appium和TouchAction
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
# 2.建立Desired capabilities物件,新增啟動引數
desired_caps = {
"platformName": "Android", # 系統名稱
"platformVersion": "7.1.2", # 系統版本
"deviceName": "127.0.0.1:21503", # 裝置名稱
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP啟動名
}
# 3.啟動APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
time.sleep(2)
# 4.操作APP
# 在設定app首頁長按藍芽選項
blue_tooth = driver.find_element_by_android_uiautomator('new UiSelector().text("藍芽")')
TouchAction(driver).long_press(el=blue_tooth, duration=5000).release().perform()
# 5.關閉APP
time.sleep(5)
driver.quit()
說明:long_press()
方法就相當於press()
方法和wait()
方法的封裝。
5、手指移動操作
move_to()
方法:模擬手機的滑動操作。
方法介紹:
# move_to()方法
move_to(el=None, x=None, y=None)
引數:
1.el:定位的元素
2.x:滑動到元素的X軸座標
3.y:滑動到元素的Y軸座標
# 呼叫方式
TouchAction(driver).press(save).move_to(el=None, x=None, y=None).release().perform()
業務場景:
- 進入設定APP。
- 在設定APP首頁從儲存滑動到藍芽。
程式碼實現:
"""
1.學習目標
掌握TouchAction類中手指移動使用
2.操作步驟
移動 move_to(元素)
3.需求
在設定app首頁從儲存滑動到藍芽
"""
# 1.匯入appium和TouchAction
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
# 2.建立Desired capabilities物件,新增啟動引數
desired_caps = {
"platformName": "Android", # 系統名稱
"platformVersion": "7.1.2", # 系統版本
"deviceName": "127.0.0.1:21503", # 裝置名稱
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP啟動名
}
# 3.啟動APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
time.sleep(2)
# 4.操作APP
# 在設定app首頁從儲存滑動到藍芽
save = driver.find_element_by_android_uiautomator('new UiSelector().text("儲存")')
blue_tooth = driver.find_element_by_android_uiautomator('new UiSelector().text("藍芽")')
# 滑動,相當於於向上滑動螢幕操作
TouchAction(driver).press(save).wait(5000).move_to(blue_tooth).release().perform()
# 5.關閉APP
time.sleep(5)
driver.quit()
6、綜合練習
業務場景:開啟設定APP,設定螢幕鎖定。
說明:
- 實現步驟:
開啟設定APP首頁,
需要向上滑動螢幕(手勢),到頁面顯示"安全"選項。
定位"安全"選項,並進入安全頁面。
在安全頁面中定位”螢幕鎖定“選項,並點選進入。
”螢幕鎖定“頁面定位”圖案“選項,並點選進入。
開始繪製z
字型圖案。 - 問題:
1,不能直接定位到9個黑點的位置。因為紅框內為一個元素,是一個整體,所以只能通過座標的方式來進行定位。
2,如何使用座標的方式定位黑點
方法很簡單,就在UI Automator Viewer
工具中,把滑鼠放在黑點的上方就可以了。如下圖:
(注意:需要把工具的介面拉大一些。)
程式碼實現:
# 1.匯入appium和TouchAction
import time
from appium import webdriver
from appium.webdriver.common.touch_action import TouchAction
# 2.建立Desired capabilities物件,新增啟動引數
desired_caps = {
"platformName": "Android", # 系統名稱
"platformVersion": "7.1.2", # 系統版本
"deviceName": "127.0.0.1:21503", # 裝置名稱
"appPackage": "com.android.settings", # APP包名
"appActivity": ".Settings" # APP啟動名
}
# 3.啟動APP
driver = webdriver.Remote("http://127.0.0.1:4723/wd/hub", desired_caps)
time.sleep(2)
# 4.操作APP
# 4.1 在設定app首頁從儲存滑動到藍芽
# 定位“儲存”和“滑動”元素
save = driver.find_element_by_android_uiautomator('new UiSelector().text("儲存")')
blue_tooth = driver.find_element_by_android_uiautomator('new UiSelector().text("藍芽")')
# 開始滑動螢幕
driver.scroll(save, blue_tooth, duration=4000)
time.sleep(2)
# 4.2 定位“安全”選項,並點選進入。
safe = driver.find_element_by_android_uiautomator('new UiSelector().text("安全")')
# 使用tap()方法,輕敲點選進入
TouchAction(driver).tap(safe).perform()
time.sleep(1)
# 4.3 定位“螢幕鎖定”選項,並點選進入。
# 定位“螢幕鎖定”選項
lock = driver.find_element_by_android_uiautomator('new UiSelector().text("螢幕鎖定")')
# 使用按下和抬起操作,點選進入
TouchAction(driver).press(lock).wait(3000).release().perform()
time.sleep(1)
# 4.4 定位“圖案”選項,並點選進入。
# 定位“圖案”選項
design = driver.find_element_by_android_uiautomator('new UiSelector().text("圖案")')
# 使用長按操作,點選進入
TouchAction(driver).long_press(el=design, duration=3000).release().perform()
time.sleep(1)
# 5.開始繪圖
TouchAction(driver).press(x=145, y=615).move_to(x=575, y=620).wait(3000) \
.move_to(x=145, y=1050).wait(3000) \
.move_to(x=575, y=1050).release().perform()
# 之後可以點選確定等繼續操作
# 6.關閉APP
time.sleep(5)
driver.quit()