一、背景
对于一切系统级别弹框,如果能有自动监听并点击处理机制,会大幅提升case的稳定性,估开始研究系统级别弹框监听。
二、思路与实施步骤
第一回合:appium自带监听类
通过各种查找,了解到appium API自带以下监听接口
- `io.appium.java_client.events.api.Listener` 基本的接口
- `io.appium.java_client.events.api.general.AlertEventListener` 监听弹窗事件
- `io.appium.java_client.events.api.general.ElementEventListener` 监听与控件相关的一些操作(如:点击、发送文本)
- `io.appium.java_client.events.api.general.JavaScriptEventListener` 用来监听JavaScript的执行
- `io.appium.java_client.events.api.general.ListensToException` 用来监听异常的抛出
- `io.appium.java_client.events.api.general.NavigationEventListener`用来监听导航事件
- `io.appium.java_client.events.api.general.SearchingEventListener`用来监听搜索事件
- `io.appium.java_client.events.api.general.WindowEventListener`用来监听窗口操作事件
- `io.appium.java_client.events.api.mobile.ContextEventListener`用来监听上下文切换事件(如:Native_APP、Webview_APP)
- `io.appium.java_client.events.api.mobile.RotationEventListener` 监听屏幕旋转
- `io.appium.java_client.events.api.general.AppiumWebDriverEventListener` 添加是为了提供实现 `org.openqa.selenium.support.events.WebDriverEventListener`. 的兼容,也扩充一些上面的接口
发现其中 io.appium.java_client.events.api.general.AlertEventListener 接口有极大的可能性可以满足我的需要,于是开始干活。。。
新建监听类,实现其接口方法。
很意外的发现,当有系统弹框时,并没有触发监听,反复确认代码逻辑,监听器是否注册等一些列排查发现代码无问题。于是我把appium所有支持的监听类全部实现了一遍,结果发现当有系统弹框时,未触发任何监听,实在是想不通。。肯定是某个环节出了问题,能力有限实在不知道如何排查。
使用appium自带监听失败。
虽然未能成功实现此功能,但在各种调试、实验的过程中,发现appium自带的监听器功能还是很强大的,比如点击、查找、异常等等都可以监听到,这里面其实可以做很多事情(比如:断言)。
------------------------------------------------------------------------------------------------------------------------------------分割线----------------------------
第二回合:UiAutomator处理监听
使用UiWatcher监听器来处理系统弹框。
UiWatcher API解释:
在测试框架无法找到一个匹配时,使用UiSelector测试框架将自动调用此处理程序方法。在超时未找到匹配项时,框架调用checkForCondition()方法查找设备上的所有已注册的监听检查条件。可以使用此方法来处理中断问题保证测试用例正常运行。
处理系统弹框实现:
集成进UI自动化框架后发现,程序主线程被占住,不会被释放出来,从而导致一直在监听系统弹框而不再往下执行自动化case(到这里问题其实已经暴露了,只不过没有细想问题的原因)。
既然主线程被占,那就把监听系统弹框逻辑写到子线程。
实现Runnable接口:
在自动化case运行前,启动子线程。
运行工程后发现UiAutomator报错:
关键报错信息:
总结下就是同一端口号下,不能同时存在2个UiAutomator的服务。
使用UiAutomator监听系统弹框失败。
------------------------------------------------------------------------------------------------------------------------------------分割线----------------------------
第三回合:自定义bootstrap
方案:自定义bootstrap
最终还是选择改造bootstrap.jar来支持系统弹框的自动点击。
下载源码:
https://github.com/appium-boneyard/appium-android-bootstrap (源码git)
导入IDE后,工程结构如图:
注意:导入进工程后会报错,必须要导入依赖包:android.jar、uiautomator.jar
改造思路:
appium本身支持ANR与CRASH的监听,也就是bootstrap.jar已经实现了对ANR与CRASH的监听操作,这样的话,就在监听ANR与CRASH时多监听一步,监听系统弹框。
添加逻辑如下:
重新build工程,生成AppiumBootstrap.jar,替换appium底层AppiumBootstrap.jar,运行现有UI自动化,发现实际效果与想要的结果一致,至此完成本功能的实现。
自定义bootstrap成功。
当现有UI自动化框架不能满足需要时,可根据需求自制AppiumBootstrap.jar来实现。
android系统UI自动化自动处理系统级别弹框
最新推荐文章于 2024-06-25 14:52:29 发布