-
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"));
}
}