界面监视器¶
监视器用来实时监听当前显示器界面的变化并在满足预设条件时,执行预设的动作如点击元素、按键、亦或是记录发生次数,您可以将其理解为李跳跳或类似自动跳过广告的功能底层实现。由于此功能会自动进行点击或按键操作,当需要人工介入时可能会发生非预期的动作,所以请谨慎使用。
小技巧
正常情况下,监视器以及事件注册应该在脚本最开始的时候进行,执行过程中一般不会再进行。
启用监视器¶
以下接口将会启用界面监视器,默认情况下刚注册的监视器处于禁用/关闭状态。
注意
在启用监视器或监视事件之前,界面上发生的任何匹配监视条件的变化均不会被自动处理。
d.set_watcher_loop_enabled(True)
获取监视器是否启用¶
您可以使用以下接口获知当前界面监视器是否处于启用状态。
d.get_watcher_loop_enabled()
关闭监视器¶
关闭监视器循环后,将不再自动处理已注册的事件,例如自动点击等。
d.set_watcher_loop_enabled(False)
注意
注册过多的监视事件可能会影响系统性能或操作实时性。
移除所有监视器¶
移除所有已经应用的监视事件,这样可以清除之前运行的或异常中断的脚本所应用的规则。建议每次启动脚本前都执行一次,以防止上次运行或异常中断的脚本所注册的事件影响当前的正常处理流程。
d.remove_all_watchers()
获取所有监视器¶
获取所有已注册的监视器,包括所有状态(启用、未启用的监视器)
>>> d.get_watchers()
[name: "ClickAcceptWhenShowAggrement"
, name: "PressBackWhenHomePageShows"
enabled: true
, name: "RecordElementAppearTimes"
enabled: true
]
>>> d.get_watchers()[0].enabled
False
>>>
获取所有已启用的监视器¶
获取所有处在已启用状态的监视器。
>>> d.get_enabled_watchers( )
[name: "PressBackWhenHomePageShows"
enabled: true
, name: "RecordElementAppearTimes"
enabled: true
]
>>>
注册点击事件¶
点击事件将会在界面出现匹配的选择器时自动进行点击等操作,例如软件弹窗如使用协议、更新提示等的自动绕过,亦或是某些特定界面的自动点击等。
注意
在启用监视器或监视事件之前,界面上发生的任何匹配监视条件的变化均不会被自动处理。
d.register_click_target_selector_watcher("ClickAcceptWhenShowAggrement", [Selector(textContains="用户协议")], Selector(textContains="同意", clickable=True))
提示
第二个参数支持多个 Selector,表示所有 Selector 条件满足才会进行事件处理。
注册上述事件后,当界面中出现包含文字 "用户协议" 的元素时,将自动点击 "同意" 按钮。
注册按键事件¶
按键事件将会在界面出现匹配选择器时进行自动的按键操作,如自动返回等,可以自动避免进入某些界面,当然使用点击事件也可实现同样的操作。
注意
在启用监视器或监视事件之前,界面上发生的任何匹配监视条件的变化均不会被自动处理。
d.register_press_key_watcher("PressBackWhenHomePageShows", [Selector(textContains="个人中心")], Keys.KEY_HOME)
提示
第二个参数支持多个 Selector,表示所有 Selector 条件满足才会进行事件处理。
注册上述事件后,当界面中出现包含文字 "个人中心" 的元素时,将自动按下手机的 HOME 键。
注册计数事件¶
计数事件是在界面出现某些匹配选择器的操作时,将计数 + 1,当界面会出现一闪而过的重要信息时,可以使用此功能来统计是否出现过某些界面或者出现的次数。
注意
在启用监视器或监视事件之前,界面上发生的任何匹配监视条件的变化均不会被自动处理。
d.register_none_op_watcher("RecordElementAppearTimes", [Selector(textContains="好的")])
提示
第二个参数支持多个 Selector,表示所有 Selector 条件满足才会进行事件处理。
以上事件记录包含 "好的" 的界面的出现次数,使用如下接口来获取计数事件的触发次数。
d.get_watcher_triggered_count("RecordElementAppearTimes")
启用事件¶
事件注册后,需要启用才会将其加入到界面监视器循环,否则不会应用。
注意
在启用监视器或监视事件之前,界面上发生的任何匹配监视条件的变化均不会被自动处理。
d.set_watcher_enabled("RecordElementAppearTimes", True)
关闭事件¶
您可以调用如下接口来让界面监视器取消监视某个事件。
注意
在启用监视器或监视事件之前,界面上发生的任何匹配监视条件的变化均不会被自动处理。
d.set_watcher_enabled("RecordElementAppearTimes", False)
移除事件¶
从监视器中完全移除一个事件,同时将会从已注册事件中删除。
d.remove_watcher(name)
获取是否启用事件¶
调用如下接口来检查事件是否正确启用,防止注册但是没有启用的情况。
d.get_watcher_enabled(name)
高级选择器¶
除了简单选择器外,您也可以使用更复杂的选择器来进行元素匹配,以下示例展示了如何编写一个复杂的选择器。
d.register_press_key_watcher("PressBackWhenHomePageShows", [Selector(resourceId="com.android.market:id/v_app_item").child(index=3).sibling(index=2).child(index=2).child()], Keys.KEY_HOME)
示例完整代码¶
以下是一个示例的代码块,它启用了监视器循环并且注册了三种监视器事件。当界面中出现包含 "用户协议" 的文本时,自动点击“同意”;当界面中出现包含 "个人中心" 的文本时,立即返回桌面;当界面中出现包含 "好的" 的文本时,记录该界面出现的次数。
注意
在启用监视器或监视事件之前,界面上发生的任何匹配监视条件的变化均不会被自动处理。
d.remove_all_watchers()
d.set_watcher_loop_enabled(True)
d.register_click_target_selector_watcher("ClickAcceptWhenShowAggrement", [Selector(textContains="用户协议")],
Selector(textContains="同意", clickable=True))
d.register_press_key_watcher("PressBackWhenHomePageShows", [Selector(textContains="个人中心")], Keys.KEY_HOME)
d.register_none_op_watcher("RecordElementAppearTimes", [Selector(textContains="好的")])
d.set_watcher_enabled("ClickAcceptWhenShowAggrement", True)
d.set_watcher_enabled("PressBackWhenHomePageShows", True)
d.set_watcher_enabled("RecordElementAppearTimes", True)