UI Watcher 解决不定时弹窗问题
缘来是你:
在基于UI谷歌库的测试系统对第三方APK测试例,存在不定时弹窗问题,对测试例的健壮性和稳定性产生了很大影响。
为了解决这个问题,谷歌开源了UIwatcher 类来解决此问题。
附谷歌官网类解析地址:http://developer-android.ir/tools/help/uiautomator/UiWatcher.html#checkForCondition%28%29
问问你是谁:
Public Methods | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
abstract boolean | checkForCondition()
The testing framework calls this handler method automatically when the framework is unable to find a match using the
UiSelector . |
即: 在UiSelector 方法找不到匹配的时候,便调用uiwatcher类的此方法。
使用方法:
首先要定义一个类对象:示例如下
UiWatcher okCancelDialogWatcher = new UiWatcher() {
@Override //重写此方法
public boolean checkForCondition() {
UiObject okCancelDialog = new UiObject(new UiSelector().textStartsWith("Lorem ipsum"));
if(okCancelDialog.exists()){
Log.w(LOG_TAG, "Found the example OK/Cancel dialog");
UiObject okButton = new UiObject(new UiSelector().className("android.widget.Button").text("OK"));
try {
okButton.click();
} catch (UiObjectNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return (okCancelDialog.waitUntilGone(25000));
}
return false;
}
};
其次若想其发挥作用,必须先要注册然后在应用之前调用,其相关函数:
public void registerWatcher (String name, UiWatcher watcher)
Registers a UiWatcher
to run automatically when the testing framework is unable to find a match using a UiSelector
. See runWatchers()
Parameters name to register the UIWatcher
watcher uiwatcher
Removes a previously registered UiWatcher
. See registerWatcher(String, UiWatcher)
Parameters name used to register the UIWatcher
public void resetWatcherTriggers ()
UiWatcher
that has been triggered. If a UiWatcher runs and its checkForCondition()
call returned true
, then the UiWatcher is considered triggered. See egisterWatcher(String, UiWatcher)
registerWatcher(String, UiWatcher)
public boolean hasAnyWatcherTriggered ()
UiWatcher
have triggered. See registerWatcher(String, UiWatcher)
See hasWatcherTriggered(String)
public boolean hasWatcherTriggered (String watcherName) Checks if a specific registered UiWatcher
has triggered. See registerWatcher(String, UiWatcher)
. If a UiWatcher runs and its checkForCondition()
call returned true
, then the UiWatcher is considered triggered. This is helpful if a watcher is detecting errors from ANR or crash dialogs and the test needs to know if a UiWatcher has been triggered.
Returns true if triggered else false
实际应用Demo:
测试代码:
public void SendMessage(UiDevice dut, Bundle bundle) throws UiObjectNotFoundException, RemoteException, InterruptedException,UIAException{
int x=dut.getDisplayWidth();
int y=dut.getDisplayHeight();
Thread.sleep(3000);
UiObject SetNum = new UiObject(new UiSelector().packageName("com.p1.chompsms").resourceId("com.p1.chompsms:id/recipients_field")); //此为控件1号,刚开始是找不见的。
Thread.sleep(10000);
String phone=bundle.getString("phoneNum");
if(SetNum.exists())
SetNum.setText(phone); Thread.sleep(1000);
uiwatcher代码:
public void Game_uiwatcher(UiDevice dut, Bundle bundle) throws UiObjectNotFoundException, UIAException, InterruptedException
{
//定义
UiWatcher okCancelDialogWatcher = new UiWatcher() {
@Override
public boolean checkForCondition() { System.out.println("uiwatcher run ing....."); UiObject SetTend= new UiObject(new UiSelector().className("oandroid.widget.LinearLayout").index(1).childSelector(new UiSelector().className("android.widget.TextView").index(0))); System.out.println("uiwatcher run ing.....");
if(SetTend.exists()){ try {
SetTend.click();
} catch (UiObjectNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} return (SetTend.waitUntilGone(25000));
}
return false;
}
};
//注册
UiDevice.getInstance().registerWatcher(MYOKCANCELDIALOGWATCHER_STRING, okCancelDialogWatcher);
}
uiwatcher需要在调用前注册并启用过程:
Game_uiwatcher()方法注册并调用
然后测试函数SendMessage()运行时方才起作用。
UI Watcher 解决不定时弹窗问题的更多相关文章
- JavaScript的案例(数据校验,js轮播图,页面定时弹窗)
1.数据校验 步骤 1.确定事件(onsubmit)并绑定一个函数 2.书写这个函数,获取数据,并绑定id 3. ...
- 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题
原文 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题 虽然微软宣称 Windows 10 将是最后一个 Windows 版本,但由于年代跨越 ...
- ubuntu下定时弹窗记录工作日志
背景 记录工作日志,是一个很好的习惯,但不容易坚持,本来打算每天记录,但经常拖延,拖着拖着,有一些事情就忘记了. 等到写周报或月报的时候,才会开始翻邮件,聊天记录,各个仓库的提交log等,回忆都干了些 ...
- android4.0以上访问网络不能在主线程中进行以及在线程中操作UI的解决方法
MONO 调用一个线程操作UI 然后报Only the original thread that created a view hierarchy can touch its views.错误 goo ...
- Android 之UI自适应解决方式
1.概况 作为Android开发者,最头疼的莫过于让自己开发的程序在不同终端上面的显示效果看起来尽量一致(当然.假设要充分利用大屏幕的优势另当别论).在全球范围内来讲.android有着数以亿计的设备 ...
- Selenium UI自动化解决iframe定位问题
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6735116.html 一个阴雨霏霏 ...
- 自动化测试系列:Selenium UI自动化解决iframe定位问题
更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6735116.html 一个阴雨霏霏 ...
- selenium UI自动化解决验证码的五种方法
TesseractPy3.py #coding=utf-8 import os import subprocess import traceback import logging from PIL i ...
- webapi+Quartz.NET解决若干定时程序同时运行的问题
项目现状: 有若干定时程序需要自启动运行,为了简便程序部署等问题,采取这种办法把定时程序集中管理到webapi中跟随api发布 代码架构介绍: 新建一个类库,类库引用Quartz(Quartz.2.3 ...
随机推荐
- python面向对象进阶(下)
一.item系列:就是把字典模拟成一个字典去操作(操作字典就用item的方式) obj[‘属性’]的方式去操作属性时触发的方法 __getitem__:obj['属性'] 时触发 __setitem_ ...
- Redis缓存Mysql模拟用户登录Java实现实例[www]
Redis缓存Mysql模拟用户登录Java实现实例 https://jingyan.baidu.com/article/09ea3ede1dd0f0c0aede3938.html redis+mys ...
- 安装icephp 记
下面开始安装: 一:yum 安装 首先需要添加一个yum源. # vi /etc/yum.repos.d/zeroc-ice-amzn.repo写入: [zeroc-ice]name=Ice 5 fo ...
- c json实战引擎五 , 优化重构
引言 scjson是一个小巧的纯c跨平台小巧引擎. 适用于替换老的cJSON引擎的场景. 数据结构和代码布局做了大量改进.优势体现在以下几个方面: 1) 跨平台 (window 10 + VS2017 ...
- FineReport——自定义控件实现填报提交事件和校验
在报表内部或者在引用报表的HTML页面,定义一个按钮标签,通过FR提供的方法实现提交功能. <button onclick="_g('${sessionID}').writeRepor ...
- Struts2学习笔记01 之 简介及配置
一.Struts简介 * 是轻量级的MVC框架,主要解决了请求分发的问题,重心在控制层和表现层.运用ASOP的思想,使用拦截器来扩展业务控制器 二.使用步骤: 1.引入Sturts2的相关JAR包 2 ...
- redis使用教程
一.redis 的安装 官方就是个坑:只说make一下即可用,确实可以用,我以为装好了,结果好多问题: 安装步骤:make => make test => make install 1 ...
- linux命令(27):cat命令
实例一:把 log2012.log 的文件内容加上行号后输入 log2013.log 这个文件里 cat -n log2012.log log2013.log 实例二:把 log2012.log 和 ...
- HDU-5335
Walk Out Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Su ...
- 小程序 image跟view标签上下会有空隙
解决方案 就是可以在image那里设置vertical-align:top/bottom/text-top/text-bottom 原因:图片文字等inline元素默许是跟父级元素的baseline对 ...