1、模擬手勢點選座標
在定位元素的時候,你使出了十八班武藝還是定位不到,怎麼辦呢?(面試經常會問)
那就拿出絕招:點選元素所在位置的座標。(座標定位)
詳細說明:
如下圖定位"去看看"這個元素,除了座標屬性,其他沒有可用於定位的屬性資訊了。這個時候就需要用座標來進行定位點選了。
下圖中可以看到右側bonds
屬性:[374,831][654,906]
,我的理解是第一個座標是紅框框長方形的左上角座標,第二個座標是紅框框長方形的右下角座標,所以如果我想要點選紅框框的內容,只要[374~654,831~906]
之間的任意一個座標都可以用。
如下圖所示:
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()
觸控方法,因為不同手機解析度不同,同樣的元素在不同手機的位置不同。