Tip:
1.监听器不是完能的,所以若用例需要设置监听器防止用例被打断,最好把延迟时间调高一点
2.UiDevice是不会触发监听功能的
3.监听器在方法体或者循环体中是程序还是会被打断的
4.监听器要在防止中断用例前执行
一、UiWatcher类介绍与中断监听检查条件
1.UiWatcher类说明
1)UiWatcher用于处理脚本执行过程中遇到的非想象的步骤
2)UiWatcher使用场景
测试过程中来了个电话
测试过程中收到个短信
测试过程中闹钟响了
……
2.中断监听检查条件
API: |
说明: |
public boolean checkForCondition(); | 在测试框架无法找到一个匹配时,使用uiselector测试框架将自动调用此处理程序的方法。在超时找到匹配项时,框架调用checkForCondition()方法检查设备上的所有已注册的监听检查条件。 |
例如:
- 如果出现一个对话框,您可以检查是否是运营商发来的服务信息而不是出现测试异常。
二、监听器操作及检查
1.相关API
返回值 |
API |
说明 |
void | registerWatcher(String name,UiWatcher watcher) | 注册一个监听器,当UiSelector无法匹配到对象的时候,触发监听器 |
void | removeWatcher(String name) | 取消之前注册的指定监听器 |
void | resetWatcherTriggers() | 重置已触发过的UiWatcher,重置后相当于没运行过 |
void | runWatchers() | 强制运行所有的监听器 |
boolean | hasAnyWatcherTriggered() | 检查是否有监听器触发过 |
boolean | hasWatcherTriggered(String watcherName) | 检查某个特定监听器是否触发过 |
例如:
public void testDemo2() throws UiObjectNotFoundException{ //1.先注册监听器(registerWatcher(String name,UiWatcher watcher)) UiDevice.getInstance().registerWatcher("Phone", new UiWatcher(){ public boolean checkForCondition() { //1.挂断电话 UiObject call=new UiObject(new UiSelector().text("来电")); UiObject view=new UiObject(new UiSelector().className("android.view.View")); if (call.exists()){ System.out.print("电话监听器被触发了"); try{ view.swipeLeft(20); return true; } catch (UiObjectNotFoundException e){ e.printStackTrace(); } } return false; } }); //1.再注册一个监听器 UiDevice.getInstance().registerWatcher("Massage", new UiWatcher(){ public boolean checkForCondition() { System.out.print("短信监控被触发了"); return false; } }); //2.执行用例步骤 //使用index+classNmae定位父类+text定位子类最终定位到对象[声音按钮] UiObject vol =new UiObject(new UiSelector() .className("android.widget.LinearLayout").index(6)) .getChild(new UiSelector().text("声音")); //获取下一级界面的返回按钮 UiObject Back=new UiObject(new UiSelector().description("声音:向上导航")); // //使用for循环监听器不会起作用 // for(int i=0;i<10;i++){ // //输出循环次数: // System.out.println("当前循环"+(i+1)+"次;"); // //点击对象并等到新窗口出现 // vol.clickAndWaitForNewWindow(); // sleep(2000); // //点击返回按钮 // Back.clickAndWaitForNewWindow(); // sleep(2000); // } //可以在下面五次操作过程中打入电话进行调试 //第一次点击对象并等到新窗口出现 vol.clickAndWaitForNewWindow(); sleep(2000); //点击返回按钮 Back.clickAndWaitForNewWindow(); sleep(2000); //第二次 vol.clickAndWaitForNewWindow(); sleep(2000); Back.clickAndWaitForNewWindow(); sleep(2000); //第三次 vol.clickAndWaitForNewWindow(); sleep(2000); Back.clickAndWaitForNewWindow(); sleep(2000); //第四次 vol.clickAndWaitForNewWindow(); sleep(2000); Back.clickAndWaitForNewWindow(); sleep(2000); //第五次 vol.clickAndWaitForNewWindow(); sleep(2000); Back.clickAndWaitForNewWindow(); sleep(2000); //在第五次返回后关闭指定监听器(removeWatcher(String name))这样以后就不会被触发了 UiDevice.getInstance().removeWatcher("Phone"); //然后再强制运行所有监控器 UiDevice.getInstance().runWatchers(); //第六次 vol.clickAndWaitForNewWindow(); sleep(2000); Back.clickAndWaitForNewWindow(); sleep(2000); //在第五次返回后检查并输出监听器是否被触发过 //检查是否有监听器被触发过 boolean B=UiDevice.getInstance().hasAnyWatcherTriggered(); //检测是否有特定监听器被触发过 boolean Phone1=UiDevice.getInstance().hasWatcherTriggered("Phone"); boolean Massage1=UiDevice.getInstance().hasWatcherTriggered("Massage"); System.out.println("是否有监听器被触发过"+B); System.out.println("电话监听器是否被触发过"+Phone1); System.out.println("短信监听器是否被触发过"+Massage1); //逻辑判断然后进行重置和强制运行操作 if(B==true){ //重置被运行过的监听器 UiDevice.getInstance().resetWatcherTriggers(); } }
时间: 2024-10-12 14:34:56