android系统UI自动化自动处理系统级别弹框

一、背景
  对于一切系统级别弹框,如果能有自动监听并点击处理机制,会大幅提升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来实现。
 

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值