前端测试 对 UIAutomator2 中 watcher (观察者) 的实际操作总结

ThickBull · 2019年06月07日 · 最后由 秃头修炼者 回复于 2020年09月06日 · 3868 次阅读

一、watcher 是什么
watcher 是一个观察者,它可以检测到设备页面中的变化,比如某个文本/描述/类名等的出现或者改变,然后进行下一步的点击/按钮操作

二、watcher 怎么用
Step.1 注册一个 watcher
d.watcher("WATCHER_NAME").when(text="确认").click(text="确认")
//Same as
d.watcher("WATCHER_NAME").when(text="确认").click()
这句话表示:注册一个名字为 “WATCHER_NAME” 的 watcher,当存在 UiSelector 满足 “text='确认'” 的时候,执行点击操作

d.watcher("WATCHER_NAME2").when(text="OK").when(text="Wait").press("back", "home")
下面这句则表示:注册一个名字为 “WATCHER_NAME2” 的 watcher,当满足两个条件时,依次按 back 与 home 键

Step.2 watcher 注册了,并不代表已经生效,需要手动开启它
开启方法(1)
//enable auto trigger watchers
d.watcher("WATCHER_NAME").watched = True
d.watchers.watched = True
使用这种方法,则会启动所有的观察者,并一直运行在手机后台,在你不想使用它的时候,需要使用 d.watchers.watched = False 手动关闭;
当然,你也可以使用下方的 remove 方法移除某个 watcher,如此它便不会再生效

开启方法(2)
//force to run all registered watchers
d.watcher("WATCHER_NAME").run()
d.watchers.run()
使用 d.watchers.run(),则与方法(1)不同,它是在这条命令执行后启动一次,watcher 结束后便不会再触发

三,总结

  1. 查看当前所有 watcher
    d.watchers
    //a list of all registered watchers

  2. 从已注册的 watchers 移除某个/全部观察者
    //remove the named watcher
    d.watcher("watcher_name").remove()

//or this way
d.watchers.remove("watcher_name")

//remove all registered watchers
d.watchers.remove()

  1. 判断 某个/所有观察者中的某个 是否已经被触发过 d.watcher("watcher_name").triggered //true in case of the specified watcher triggered, else false

d.watchers.triggered
//true in case of any watcher triggered
如果一个 watcher 被触发过,这个信息是被存储在手机后台的,判断当前 watcher 或 watchers 是否触发成功时,需要对上一个存储在后台的监听
使用 d.watcher("watcher_name").reset() 或 d.watchers.reset() 进行状态重置,才能准确获取当前 watcher 或 watchers 的状态

//reset all triggered watchers, after that, d.watchers.triggered will be false.
d.watcher("watcher_name").reset()
d.watchers.reset()

如果你想要这个 watcher 失效,需要执行 d.watchers.watched=False,或者移除 d.watcher("DECLINE").remove()

尊重原著,Watcher 官方文档内容如下:(源自:https://github.com/openatx/uiautomator2

共收到 1 条回复 时间 点赞

2.10.0 版本 没有 text 的属性 怎么办呀

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