『與善仁』Appium基礎 — 25、APP模擬手勢高階操作

繁華似錦Fighting發表於2021-12-19

APP模擬手勢的動作都被封裝在TouchAction類中,TouchActionAppiumDriver的輔助類,主要針對手勢操作,如滑動、按、拖動等,原理是將一系列的動作放在一個鏈條中傳送到伺服器,伺服器接受到該鏈條後,解析各個動作,逐個執行。 所有手勢都要通過執行函式才會執行。

提示:

我們之前學習的滑動操作,都是對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()

引數:

  1. element:被定位到的元素
  2. x:相對於元素左上⻆的座標,通常會使用元素的X軸座標
  3. y:通常會使用元素的Y軸座標

引數可以傳入元素,也可以傳入xy座標。也就是說可以在元素上進行輕敲動作,也可以在座標上進行輕敲動作。

業務場景:

  1. 進入設定。
  2. 點選“藍芽”選項。

程式碼實現:

"""
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. 進入設定。
  2. 點選藍芽選項。

程式碼實現:

"""
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()

業務場:

  1. 進入設定。
  2. 長按藍芽選項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. 進入設定。
  2. 長按藍芽選項。

程式碼實現:

"""
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()

業務場景:

  1. 進入設定APP。
  2. 在設定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個黑點的位置。因為紅框內為一個元素,是一個整體,所以只能通過座標的方式來進行定位。
    image
    2,如何使用座標的方式定位黑點
    方法很簡單,就在UI Automator Viewer工具中,把滑鼠放在黑點的上方就可以了。如下圖:
    (注意:需要把工具的介面拉大一些。)
    image

程式碼實現:

# 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()

相關文章