『與善仁』Appium基礎 — 27、模擬手勢點選座標

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

1、模擬手勢點選座標

在定位元素的時候,你使出了十八班武藝還是定位不到,怎麼辦呢?(面試經常會問)
那就拿出絕招:點選元素所在位置的座標。(座標定位)

詳細說明:

如下圖定位"去看看"這個元素,除了座標屬性,其他沒有可用於定位的屬性資訊了。這個時候就需要用座標來進行定位點選了。

下圖中可以看到右側bonds屬性:[374,831][654,906],我的理解是第一個座標是紅框框長方形的左上角座標,第二個座標是紅框框長方形的右下角座標,所以如果我想要點選紅框框的內容,只要[374~654,831~906]之間的任意一個座標都可以用。

如下圖所示:

image

2、tap()用法

tap()方法並不是我們之前說過的TouchAction類中的tap()方法,該tap()方法是模擬手勢觸控的方法。

tap()方法介紹:

# 可模擬手指點選(最多五個手指),可設定按住時間長度(毫秒) :
tap(self, positions, duration=None)

引數Args:
    positions : list(列表)型別,裡面物件是元組,最多五個。
        如:[(100, 20), (100, 60)],
        元組中一個元素表示一個座標, 元組中最多可有5個座標。
    duration : 持續時間,單位毫秒,如:500

# 呼叫方式
driver.tap([(100, 20), (100, 60), (100, 100)], 500)

3、練習

"""
1.學習目標
    熟悉tap方法使用,當元素沒有任何明確屬性的時候,可以使用,來定位元素,
2.操作步驟
    2.1 熟悉tap方法:觸控,不同於TouchAction中的tap方法
    2.2 呼叫方式
        driver.tap(positions,duration=None)
    2.3 說明:
        driver.tap([座標,最多5個座標],持續時間)
        引數:
            --positions 座標 列表格式[(x,y),(x,y),(x,y)]
                列表中每個元組表示一個座標
            --duration 持續時間

3.需求
    設定app中使用tap方法點選"通知"選項
"""

# 1.匯入appium和TouchAction
import time
from appium import webdriver

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

# 4.操作APP
# 使用tap方法點選設定app頁面中"通知"選項,
# 通過元素定位工具UI Automator Viewer,可以知道"通知"的座標範圍[108,894][720,965]
# x軸 範圍  108--720
# y軸 範圍  894--965
# 頁面等待
driver.wait_activity(".Settings", 10)

# 點選"通知"選項
driver.tap([(120, 900)], 3000)

# 注:持續時間有和沒有,在效果上區別不是很大。

# 5.關閉APP
time.sleep(3)
driver.quit()

提示:

因為之前一直用的click()方法進行點選,click()方法是定位元素後才進行點選操作的。

而頁面中的座標資訊是一直存在的,所以tap()方法會直接執行,所以指令碼執行的時候,沒有點選效果,是因為執行座標定位點選操作的時候,元素還沒有出現。

因此tap()觸控方法前面務必加上延時或者判斷!!!

4、弊端

通過座標定位是元素定位的下下策,實在沒辦法才用這個,另外如果換了其他手機,解析度就會不一樣,這個座標就不能寫死了,得算出所在螢幕的比例。

注意:

不到萬不得已不要用tap()觸控方法,因為不同手機解析度不同,同樣的元素在不同手機的位置不同。

相關文章