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

 

---------------------------------------------------------------------------------

關注微信公衆號即可在手機上查閱,並可接收更多測試分享~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章