九、UiWatcher API 詳細介紹

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章