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