上期回顧: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出來,能達到自己的目的就行。
---------------------------------------------------------------------------------
關注微信公眾號即可在手機上查閱,並可接收更多測試分享~