Airtest和Poco座標詳解
上期回顧:Poco框架原始碼目錄結構解析
以下基於
python3.8;airtestIDE1.2.13;airtest1.2.4;pocoui1.0.85
前兩期我們講了Poco API,會發現和Airtest API有很多同名,但是使用方法卻不一樣。導致不一樣的原因就是Airtest和Poco使用了不同的座標系,今天我們就來詳細看下兩者具體的不同。
Airtest是基於圖片識別的框架,講究所見即所得,所以其座標都是使用的螢幕絕對座標,如:
touch([500,500])
swipe([100,100],[500,500])
假如手機螢幕就是1000*1000,[500,500]就是螢幕的中心點,螢幕絕對座標很好理解,這裡就不多講了。
Poco是基於控制元件元素的框架,為了跨解析度適配,使用‘歸一化座標系’和‘區域性座標系’。
歸一化座標系(Normalized Coordinate System)
什麼是‘歸一化座標系’,就是將螢幕寬和高按照單位一來算,這樣UI在poco中的寬和高其實就是相對於螢幕的百分比大小了,好處就是不同解析度裝置之間,同一個UI的歸一化座標系下的位置和尺寸是一樣的,有助於程式碼跨解析度執行,舉個例子:
假如圖中左右是兩個手機螢幕,一個是100*100,一個是200*200。小手機左上有個按鈕,其中心點絕對座標是[25,25],那麼這個點相對於整個螢幕百分比大小就是[25/100,25/100]=[0.25,0.25]
同理,大手機左上按鈕的中心點絕對座標是[50,50],那麼這個點相對於整個螢幕百分比大小就是[50/200,50/200]=[0.25,0.25]
所以同一APP執行在這2個手機上,我們想利用座標點選左上的按鈕,如果用Airtest框架就要分別寫成
touch([25,25]) 和 touch([50,50])
而如果是用Poco框架,則只要寫成
from poco.drivers.unity3d import UnityPoco
auto_setup(__file__)
poco = UnityPoco()
poco.click([0.25,0.25])
以上只是舉例如何通過座標在兩個框架中點選,實際專案中我們還是儘量通過Airtest圖片識別和Poco元素定位的方式來點選。
但是我個人覺得‘歸一化座標系’這個名詞太生澀了,不能望文知義,所以在以後我的文章中,都統一叫‘螢幕相對座標’。所以以後看官方文件,提到的‘歸一化座標系’就是我這裡的‘螢幕相對座標’。
什麼時候會用到‘螢幕相對座標’,所有Poco例項API(Poco例項(全域性操作) API彙總)、以及部分Poco UI物件 API(Poco UI物件 API彙總),如swipe()
其實‘螢幕絕對座標’和‘螢幕相對座標’是可以相互換算的,已知螢幕長寬[100,100],絕對座標[10,10],那相對座標就是[10/100,10/100]=[0.1,0.1]
同理,已知螢幕長寬[100,100],相對座標[0.1,0.1],那絕對座標就是[100*0.1,100*0.1]=[10,10]
以下為程式碼中如何獲取這些資訊:
# -*- encoding=utf8 -*-
__author__ = "測試工程師小站"
from airtest.core.api import *
from poco.drivers.unity3d import UnityPoco
auto_setup(__file__)
poco = UnityPoco()
button = poco(text="測試工程師小站")
# 獲取元素的螢幕相對座標
pos = button.get_position()
picture = Template(r"tpl1635075246242.png", record_pos=(-0.369, -0.796), resolution=(1080, 2340))
# 獲取圖片的螢幕絕對座標
postion = wait(picture)
# 獲取螢幕解析度
width, height = device().get_current_resolution()
另外我們也可以通過AirtestIDE來快速獲取座標,詳細請看AirtestIDE基本功能(二) 中的選項部分。
區域性座標系(Local Coordinate System)
在講什麼是區域性座標系前,我們要先理解Poco中的一些基本概念。
我們用AirtestIDE定位標題這個元素
如圖高亮的長方形,官方叫包圍盒,包圍盒中心的紅點,官方叫anchorPoint,翻譯過來就是錨點。
區域性座標系以UI包圍盒左上角為原點,向右為x軸,向下為y軸,包圍盒寬和高均為單位一。區域性座標系可以更靈活地定位UI內或外的位置,例如(0.5, 0.5)就代表UI的正中央,也就是anchorPoint;超過1或小於0的座標值則表示UI的外面。
同理,我覺得區域性座標這個名稱合理但還差點,以後我的文章中都會以‘元素相對座標’代替。
大部分Poco UI物件API的操作點或起點都是錨點,即元素相對座標[0.5,0.5]。錨點是可以改變的,大部分Poco UI物件API都有一個引數focus,可以暫時改變錨點,如我們想點選上圖中左下角的五角星
qasite = poco("com.tencent.mm:id/a_g")
qasite.click(focus=[0.1,0.7])
上句只是在點選的時候暫時改變錨點,qasite變數的錨點依然是[0.5,0.5],想永久改變錨點,可以使用focus()方法
qasite = poco("com.tencent.mm:id/a_g").focus([0.1,0.7])
qasite.click()
這樣,qaiste的錨點就永遠是左下角了
螢幕絕對座標、螢幕相對座標、元素相對座標,理解起來有一定困難,可能今天懂了明天又忘了。沒關係,真正到用的時候,多除錯幾次,把座標print出來,能達到自己的目的就行。
---------------------------------------------------------------------------------
關注微信公眾號即可在手機上查閱,並可接收更多測試分享~