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

 

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

关注微信公众号即可在手机上查阅,并可接收更多测试分享~

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