Poco API精讲之元素树冻结freeze()

上期回顾:Poco API精讲之自定义手势start_gesture()


以下基于
python3.8;airtestIDE1.2.13;airtest1.2.4;pocoui1.0.85

UI自动化的用例中,有时候需要频繁的操作UI,比如有20个复选框,你需要全部选中。如果你按正常的操作方法,可能需要20-40秒:

for item in poco('xxx'):
    item.click()

为什么会花费这么久,因为poco的所有操作几乎每次操作前,都要通过发送rpc请求把App的hierarchy(UI树)从手机拉到PC,如属性类操作attr()、各种等待、各种点击等,这将非常耗费时间。这么做的原因是Poco无法保证App界面有没有发生变化,所以每次操作前都要去获取实时的hierarchy(UI树)。

所以Poco提供了freeze()方法,它把hierarchy(UI树)拉取一次后,保存在PC内存中,以后再有交互操作时,不再去手机拉取,而是直接读取PC内存中保存的这份hierarchy(UI树)。这将极大提高操作效率从而节省UI自动化执行时间。

不过这种方法有一个缺点,就是在你这段操作时间内,UI不能有变化。比如当你点击第一个复选框后,在该复选框下面又多出来一行输入框,那么后面的复选框都要往下移。如果此时仍用保存在PC内存中的hierarchy(UI树),在你去点击第2个复选框时,实际是点到了新出现的输入框上面。

所以使用freeze()的场景,一定要确保期间UI不会发生变化。下面我们具体来看看吧:

freeze()
冻结UI,即将当前hierarchy(UI树)复制一份,不保证与手机实时屏幕一致,但操作非常快速。

返回:
新的poco实例

源码解析:

# 源码位置:your_python_path\site-packages\poco\proxy.py
    def freeze(this):
        class FrozenPoco(Poco):
            def __init__(self, **kwargs):
                hierarchy_dict = this.agent.hierarchy.dump()
                hierarchy = create_immutable_hierarchy(hierarchy_dict)
                agent_ = PocoAgent(hierarchy, this.agent.input, this.agent.screen)
                kwargs['action_interval'] = 0.01
                kwargs['pre_action_wait_for_appearance'] = 0
                super(FrozenPoco, self).__init__(agent_, **kwargs)
                self.this = this

            def __enter__(self):
                return self

            def __exit__(self, exc_type, exc_val, exc_tb):
                pass

            def __getattr__(self, item):
                return getattr(self.this, item)

        return FrozenPoco()

freeze()实际是返回了一个FrozenPoco类实例,FrozenPoco继承自Poco类,区别就是它已经提前dump()了hierarchy(UI树),且后面不会再去更新。

示例:
还是本文开头时的例子,点击几十个复选框

from airtest.core.api import *
from poco.drivers.unity3d import UnityPoco

auto_setup(__file__)

poco = UnityPoco()

# 通过冻结的方式,可以提高约10倍速度,操作的次数越多,提效越多
with poco.freeze() as frozen_poco:
    for item in frozen_poco('xxx'):
        item.click()

大家记得一定要以with方法去使用freeze(),这样在使用完毕后,Poco可以自行释放内存。
相关阅读:python的with用法

 

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

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

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