• 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

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

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

  • 相关阅读:
    数据库系统理论概念
    SQL常用函数
    Android中几种常见的定时刷新方式
    Android Resource介绍和使用
    Android 使用Loader示例
    Android框架浅析之锁屏(Keyguard)机制原理
    Android Power Management
    Android中蓝牙的基本使用
    分组ListView使用技巧
    使用CursorLoader异步加载数据
  • 原文地址:https://www.cnblogs.com/songzhenhua/p/16156503.html
Copyright © 2020-2023  润新知