缘来是你:

  在基于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

         public void removeWatcher (String name) 

   Removes a previously registered UiWatcher. See registerWatcher(String, UiWatcher)

     Parameters     name                used to register the UIWatcher
     public void resetWatcherTriggers ()
     Resets a 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)
 
 
   public void runWatchers ()
     This method forces all registered watchers to run. See registerWatcher(String, UiWatcher)
 

public boolean hasAnyWatcherTriggered ()

     Checks if any registered 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 解决不定时弹窗问题的更多相关文章

  1. JavaScript的案例(数据校验,js轮播图,页面定时弹窗)

    1.数据校验            步骤            1.确定事件(onsubmit)并绑定一个函数            2.书写这个函数,获取数据,并绑定id            3. ...

  2. 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题

    原文 使用 Microsoft.UI.Xaml 解决 UWP 控件和对老版本 Windows 10 的兼容性问题 虽然微软宣称 Windows 10 将是最后一个 Windows 版本,但由于年代跨越 ...

  3. ubuntu下定时弹窗记录工作日志

    背景 记录工作日志,是一个很好的习惯,但不容易坚持,本来打算每天记录,但经常拖延,拖着拖着,有一些事情就忘记了. 等到写周报或月报的时候,才会开始翻邮件,聊天记录,各个仓库的提交log等,回忆都干了些 ...

  4. android4.0以上访问网络不能在主线程中进行以及在线程中操作UI的解决方法

    MONO 调用一个线程操作UI 然后报Only the original thread that created a view hierarchy can touch its views.错误 goo ...

  5. Android 之UI自适应解决方式

    1.概况 作为Android开发者,最头疼的莫过于让自己开发的程序在不同终端上面的显示效果看起来尽量一致(当然.假设要充分利用大屏幕的优势另当别论).在全球范围内来讲.android有着数以亿计的设备 ...

  6. Selenium UI自动化解决iframe定位问题

      更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6735116.html 一个阴雨霏霏 ...

  7. 自动化测试系列:Selenium UI自动化解决iframe定位问题

      更多原创测试技术文章同步更新到微信公众号 :三国测,敬请扫码关注个人的微信号,感谢! 原文链接:http://www.cnblogs.com/zishi/p/6735116.html 一个阴雨霏霏 ...

  8. selenium UI自动化解决验证码的五种方法

    TesseractPy3.py #coding=utf-8 import os import subprocess import traceback import logging from PIL i ...

  9. webapi+Quartz.NET解决若干定时程序同时运行的问题

    项目现状: 有若干定时程序需要自启动运行,为了简便程序部署等问题,采取这种办法把定时程序集中管理到webapi中跟随api发布 代码架构介绍: 新建一个类库,类库引用Quartz(Quartz.2.3 ...

随机推荐

  1. 用tkinter实现的gui小工具

    import tkinter import requests import json from tkinter import * class FindLocation(object): def __i ...

  2. python设计模式之单例模式(一)

    单例设计模式的概念: 单例设计模式即确保类有且只有一个特定类型的对象,并提供全局访问点.一般我们操作数据库的时候为了避免统一资源产生互相冲突,创建单例模式可以维护数据的唯一性. 单例模式的特性: 确保 ...

  3. 辨别苹果数据线真伪 苹果计算器 Dashboard 知识

    辨别苹果数据线真伪 苹果计算器 Dashboard 知识  苹果数据线真伪的最简单的辨别: 线质柔软 用数据线连接适配器(苹果自带的适配器)充电 连接手机 如果该手机数据线是假的, 在手机上会提示”该 ...

  4. maven使用备忘

    maven的所有功能本质上都是通过插件来实现的所有的功能.archetype插件就是根据项目类型创建项目的插件.执行archetype:generate命令就会list一系列的项目类型,可以选择一个合 ...

  5. python 基础习题

    1.8<<2等于? 8 ---> 1000 32 ---> 100000 -----------结果--- 32 2.通过内置函数计算5除以2的余数 print(dir()) ...

  6. git 查看远程分支 $ git branch -a

    查看远程分支 加上-a参数可以查看远程分支,远程分支会用红色表示出来(如果你开了颜色支持的话): 1 2 3 4 5 6 7 8 9 10 $ git branch -a master remote ...

  7. hdu 2768(建图,最大点独立集)

    Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total ...

  8. Restore IP Addresses——边界条件判定

    Given a string containing only digits, restore it by returning all possible valid IP address combina ...

  9. Linux磁盘的性能详细测试办法

    # 测试写入20Gb文件sync && time -p bash -c "(dd if=/dev/zero of=test.dd  bs=1000K count=20000; ...

  10. js解析与序列化json数据(一)json.stringify()的基本用法

    对象有两个方法:stringify()和parse().在最简单的情况下,这两个方法分别用于把JavaScript对象序列化为JSON字符串和把JSON字符串解析为原生JavaScript 早期的JS ...