• UiWatcher类说明:
  • UiWatcher用于处理脚本执行过程中遇到非预想的步骤
  • UiWatcher使用场景
    * 测试过程可能还会有一个闹钟
    * 来了一条短信等突发事件
    * 出现非预想的步骤
  • 当在测试过程中发生突发事件,UiWatcher会处理异常,比如停止闹钟 继续完成测试用例
  • 中断监听检查条件:
  • public boolean checkForCondition();
  • 说明:
  • 在测试框架无法找到一个匹配时,使用uiselector测试框架自动调用此处理方法。在超时未找到匹配项时,框架调用checkforCondition()方法查找设备上的所有已注册的监听检查条件。可以使用此方法来处理中断问题保证测试用例正常运行
  • 例如:如果出现一个对话框,可以检查是否是运营商发来的服务信息而不是测试异常
  • 监听器必须写在所有用例之前,监听器在用例之前启动,启动之后,用例才能执行,执行过程中出现异常才能调用监听器,过程中有很多监听条件,考虑过程中各种可能的情况将其处理掉。
  • 监听器操作:

返回值

API

说明

void

registerAwtcher(String name, UiWatcher watcher)

注册一个监听器,当UiSelector无法匹配到对象的时候,触发监听器

void

removeWatcher(String name)

取消之前注册的指定监听器

void

resetWatcherTriggers()

重置已触发过的UiWatcher,重置后相当于没运行过

void

runWatchers()

强制运行所有的监听器

  • 检查监听器

返回值

API

说明

boolean

hanAnyWatcherTriggered()

检查是否有监听器触发过

boolean

hasWatcherTriggered(String watcherName)

检查某个特定的监听器是否触发过

public class UiWatchers extends TestCase {
public void testWatcher() throws UiObjectNotFoundException {
//先要注册监听器
UiDevice uiDevice = UiDevice.getInstance(InstrumentationRegistry.getInstrumentation());
uiDevice.registerWatcher("phone", new UiWatcher() {
@Override
public boolean checkForCondition() {


//挂断电话
UiObject call = new UiObject(new UiSelector().text("来电"));
UiObject view = new UiObject(new UiSelector().className("android.view.View"));
if (call.exists()) {
System.out.println("触发监听器");
try {
view.swipeLeft(20);
} catch (UiObjectNotFoundException e) {
e.printStackTrace();
}
return true;
}
return false;
}
});
uiDevice.registerWatcher("msm", new UiWatcher() {
@Override
public boolean checkForCondition() {
System.out.println("短信监听器");
//如果return false但是最后没有被触发,只是相当于过滤器的作用,如果没有短信的业务,他还是会调用一下进行匹配但是不会被触发
return false;
}
});

//执行用例步骤
try {
UiObject vol = new UiObject(new UiSelector().className("android.widget.LinearLayout").index(3)).getChild(new UiSelector().text("声音和通知"));
UiObject back = new UiObject(new UiSelector().description("声音和通知:向上导航"));
for(int i = 0;i<1;i++) {
vol.clickAndWaitForNewWindow();
back.clickAndWaitForNewWindow();
if(i == 1){
uiDevice.removeWatcher("phone");
}
}
} catch (UiObjectNotFoundException e) {
e.printStackTrace();
}
System.out.println("短信监听器触发"+uiDevice.hasAnyWatcherTriggered());
System.out.println("短信监听器触发"+uiDevice.hasWatcherTriggered("msm"));
}
}