上期回顾: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
---------------------------------------------------------------------------------
关注微信公众号即可在手机上查阅,并可接收更多测试分享~