Airtest airtest 增加了观察者函数

在路上 · 2019年09月09日 · 最后由 在路上 回复于 2020年12月11日 · 4199 次阅读

一直困扰于 Airtest 没有观察者函数,所以自己实现了一个,原理简单,python 子线程实现

利用子线程的方式实现:

def loop_watcher(find_element, timeout):
    """
    每隔一秒,循环查找元素是否存在.
    如果元素存在,click操作
    :param find_element: 要查找元素,需要是poco对象
    :param timeout: 超时时间,单位:秒
    :return:
    """
    log('thread %s is running...' % threading.current_thread().name)
    start_time = time.time()
    while True:
        if find_element.exists():
            find_element.click()
            log("观察者线程发现")
            break
        elif (time.time() - start_time) < timeout:
            log("观察者线程等待1秒")
            time.sleep(1)
        else:
            log("观察者线程超时未发现")
            break
    log('thread %s ended.' % threading.current_thread().name)


def watcher(text=None, textMatches=None, timeout=5, poco=None):
    """
    观察者函数: 根据text或textMatches定位元素,用守护线程的方式,增加子线程循环查找元素,直到超时
    :param text: 元素的text
    :param textMatches: 元素的textMatches,正则表达式
    :param timeout: 超时时间
    :param poco: poco实例
    :return:
    """
    # 目标元素
    find_element = None
    if poco is None:
        raise Exception("poco is None")
    if text or textMatches:
        if text:
            find_element = poco(text=text)
        elif textMatches:
            find_element = poco(textMatches=textMatches)

    # 定义子线程: 循环查找目标元素
    t = threading.Thread(target=loop_watcher, name='LoopWatcherThread', args=(find_element, timeout))
    # 增加守护线程,主线程结束,子线程也结束
    t.setDaemon(True)
    t.start()
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
共收到 23 条回复 时间 点赞

先收藏,
苦于此久矣

watchman 表人啊

hellohell 回复

什么意思啊?没看懂

有个问题啊,如果元素没找到,timeout 就减一秒。这里是不是没考虑找元素 find element 方法执行的耗时?

Jerry li 回复

是的,这个时间没有考虑,严格来看应该要考虑,我优化一下,多谢

你会不会出现两条线程同时写 log 文件,最后生成的报告会有点乱的情况

直南瓜 回复

不会,这边每次生成的报告,都生成到了指定文件内,递增的顺序

第一个没搞懂为啥要子进程做循环,我感觉只要特定的时间去做一下是否存在的判断就好了,返回 true 和 false~这个功能我记得原来就有

zlp 回复

特定时间做是否存在的判断:
1、不灵活,也不稳定,特定时间本来就是一个不确定的事情;
2、特定时间去做判断,有时间差,务必需要用循环,每隔一段时间就判断一次,耗时太多,影响主线程的用例执行
3、兼容性,并不需要所有的设备都会触发某些场景,所以不需要每个设备上运行的用例都在主线程中做判断

匿名 #10 · 2019年09月17日

可以考虑直接到 github 上面提一个 pr 呀,测试没问题的话就会被 merge 到代码主干上面,以后大家就能直接用了

嗯嗯,已提建议,多谢

timeout 要设置的时间应该要大于所有用例都执行完?

Wei Chuang 回复

根据实际需求来,如果是未知的不定时广告弹窗,可以设置时间到单用例结束;
如果是进入某个功能时,会有未知的不定时弹窗,可以把时间设置到覆盖该功能;

14楼 已删除
仅楼主可见
C-carrot 回复

不会,有更多的报错信息吗?

仅楼主可见
仅楼主可见
仅楼主可见
仅楼主可见
C-carrot 回复

应该可以吧,原理上可以的,不过需要试试

请教一下,怎么用啊。调了半天,没起作用

Daa盛 回复

watcher(text=None, textMatches=None, timeout=5, poco=None)
用这个方法就行,text 和 textMatches 输入一个就成,poco 输入 poco 对象

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册