Poco API精講之focus()
上期回顧:Airtest和Poco座標詳解
以下基於
python3.8;airtestIDE1.2.13;airtest1.2.4;pocoui1.0.85
上期說元素相對座標(區域性座標系)時,有提到focus()方法,今天就來詳細看看。
先看下其原始碼:
原始碼地址:your_python_path/site-packages/poco/proxy.py
def focus(self, f):
ret = copy.copy(self)
ret._focus = f
return ret
很簡單,就是把目標元素物件複製了一份,然後修改內部_focus屬性為你傳入的座標點。
之前說元素相對座標時,只是提了一下座標是可以<0或>1的。我們再來溫習一下元素相對座標的概念,它以元素左上角為[0,0],元素長(向右)、寬(向下)各為單位一,橫軸是X軸,縱軸是Y軸,錨點預設為[0.5,0.5]
內部偏移
預設錨點是中心[0.5,0.5],如果你想點左上角就是[0.1,0.1],右下角就是[0.9,0.9]
# coding=utf-8
import time
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()
image = poco('fish').child(type='Image')
# 長按中心點,中心點[0.5,0.5]也可以用'center'代替
image.focus('center').long_click()
time.sleep(0.2)
# 長按左上角
image.focus([0.1, 0.1]).long_click()
time.sleep(0.2)
# 長按右下角
image.focus([0.9, 0.9]).long_click()
time.sleep(0.2)
# 長按正下位置
image.focus([0.5, 0.9]).long_click()
time.sleep(0.2)
外部偏移
前面說了座標是可以<0或>1的,所以可以定位到元素外面,比如下圖中的A,B,C,D點。
以A點為例,我們通過定位'balloonfish'文字元素,來偏移點選A點。A點X座標與錨點一樣,是中間0.5;Y座標是Y軸向1的相反方向,1代表元素的寬,-3代表反方向3倍的寬。
所以當一個元素不好定位時,我們可以通過另一個附近的元素通過外部偏移來間接操作。
# coding=utf-8
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()
balloonfish_image = poco(text='balloonfish').focus([0.5, -3])
balloonfish_image.long_click()
但是要注意,外部偏移不能無限的偏,當X或Y座標偏的超出螢幕時,就會有如下報錯InvalidOperationException(Click position out of screen.)
focus()的獨立性
根據原始碼我們也看到了,focus()其實是複製了一份元素物件,所以和原元素物件變數是獨立的個體,是兩個不同的元素物件,區別就是其內部屬性_focus(也就是錨點)不一樣。
# coding=utf-8
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()
# focus is immutable
fish = poco('fish').child(type='Image')
fish_right_edge = fish.focus([1, 0.5])
fish.long_click() # still click the center
time.sleep(0.2)
fish_right_edge.long_click() # will click the right edge
time.sleep(0.2)
可以看到,fish和fish_right_edge是兩個獨立的變數,互不影響。
focus()在滑動中的妙用
正常情況下drag_to()需要兩個元素;
基於focus()的複製特性,我們可以通過一個元素就實現滑動操作,比如一個文字列表從上拖到最下面
# coding=utf-8
import time
from poco.drivers.unity3d import UnityPoco
poco = UnityPoco()
listView = poco('Scroll View')
listView.focus([0.5, 0.8]).drag_to(listView.focus([0.5, 0.2]))
time.sleep(1)
以上示例來自於官方文件:
https://poco.readthedocs.io/zh_CN/latest/source/doc/poco-example/play_with_coordinate_system_and_local_positioning.html
---------------------------------------------------------------------------------
關注微信公眾號即可在手機上查閱,並可接收更多測試分享~