快學UiAutomator UiDevice API 詳解


一、按鍵使用

返回值

方法名

說明

boolean pressBack() 模擬短按返回back鍵
boolean pressDPadCenter() 模擬按軌跡球中點按鍵
boolean pressSPadDown() 模擬軌跡球向下按鍵
boolean pressDPadLeft() 模擬軌跡球向左按鍵

boolean

pressDPadRight() 模擬軌跡球向右按鍵
boolean pressDPadUp() 模擬軌跡球向上按鍵
boolean pressDelete() 模擬短按刪除delete按鍵
boolean pressEnter() 模擬短按回車enter鍵
boolean pressHome() 模擬短按home鍵
boolean pressKeyCode(int keyCode,int metaState) 模擬短按鍵盤代碼keycode
boolean pressKetCode(int keyCode) 模擬短按鍵盤代碼keycode
boolean pressMenu() 模擬短按menu鍵
boolean pressRecentApps() 模擬短按最近使用程序
boolean pressSearch() 模擬短按搜索鍵

按鍵主要為模擬設備的物理按鍵,如home鍵,menu鍵,back鍵,音量鍵等

例子:

按home鍵:UiDevice.getInstance().pressHome();

按menu鍵:UiDevice.getInstance().pressMenu();

按back鍵:UiDevice.getInstance().pressBack();

 keycode使用

meta_key未被激活 0
shift或caps_lock被激活時 1
alt被激活 2
alt,shift或caps_lock同時被激活時 3


對於 pressKeyCode(int keyCode) 模擬短按鍵盤代碼。鍵盤代碼為何物呢,其實我們鍵盤上的每個按鍵都對應一個整數的代碼,比如說delete鍵為67。 具體鍵盤代碼請到谷歌官網查詢,附上網址,需要查什么按鍵只需搜索相應的英文就可以了。 http://developer.android.com/reference/android/view/KeyEvent.html 例子: 如按字母A,打開上面網頁Ctrl+f 打開搜索 KEYCODE_A 查到代碼為29 int KEYCODE_A=29; UiDevice.getInstance().pressKeyCode(KEYCODE_A);
UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_A);//輸入小寫a 

UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_A,1);//輸入大寫a

二、獲取坐標與坐標點擊

返回值

方法名

說明

boolean click(int x,int y) 使用坐標點擊屏幕(在任意坐標指定的坐標執行一個點擊)
int getDisplayHeight() 獲取屏幕高度
point grtDisplaySizeDp() 獲取顯示尺寸返回顯示大小(設備獨立像素)
int getDisplayWidth() 獲得屏幕寬度

實例:

int w=UiDevice.getInstance().getDisplayWidth();//獲取屏幕寬度

int h=UiDevice.getInstance().getDisplayHeight();//獲取屏幕高度

UiDevice.getInstance().click(h/2, w/2);//點擊屏幕中心點

UiDevice.getInstance().click(300, 300);//點擊坐標點(300,300)
或  getUiDevice().click(300, 300);

推薦使用上面的UiDevice.getInstance()進行書寫,如果使用下面的書寫,在同一個類中沒問題,如果要在其他類中的方法使用了getUiDevice,調用到本類中不會有語法錯誤,但是執行的時候會出錯。以下也是如此,不再寫getUiDevice。

三、旋轉

返回值 方法名 描述
void setOrientationLeft() 通過禁用傳感器,然后模擬設備向左旋轉並且固定位置
void setOrientationNatural() 通過禁用傳感器,然后模擬設備轉到其自然默認的方向,並且固定位置
void setOrientationRight() 通過禁用傳感器,然后模擬設備向又旋轉並且固定位置
void unfreezeRotation() 重新啟用傳感器和允許物理旋轉
boolean isNaturalOrientation() 檢測設置是否處於默認旋轉狀態
int getDisplayRotation() 返回當前的顯示旋轉,0度,90度,180度,270度值分別為:0,1,2,3
void freezeRotation() 禁用傳感器和凍結裝置物理旋轉在其當前旋轉狀態

實例1:

public void testOrientation() throws RemoteException{

    //1.模擬設備向左向右旋轉

    UiDevice.getInstance().setOrientationLeft();    //設備向左旋轉
    UiDevice.getInstance().setOrientationRight();   //設備向右旋轉

    //2.如果設備處於默認旋轉狀態,就向左旋轉

    if (UiDevice.getInstance().isNaturalOrientation()){ 

        UiDevice.getInstance().setOrientationLeft();

    }

    //3.變量a獲取當前新鮮事旋轉度數,然后進行相應if判斷

    int a=UiDevice.getInstance().getDisplayRotation();

    if (a==Surface.ROTATION_0){

        UiDevice.getInstance().setOrientationLeft();

    }

    if (a==Surface.ROTATION_90){

        UiDevice.getInstance().setOrientationLeft();

    }

    if (a==Surface.ROTATION_180){

        UiDevice.getInstance().setOrientationLeft();

    }

    if (a==Surface.ROTATION_270){

        UiDevice.getInstance().setOrientationLeft();

    }
}

實例2:

UiDevice.getInstance().freezeRotation();

當前手機狀態為豎屏,鎖定當前手機為豎屏,不讓手機跟隨着手機物理旋轉而旋轉。

四、鎖屏和喚屏

返回值

方法名

描述

void wakeUp() 模擬按電源鍵,如果屏幕是喚醒的沒有任何作用
void sleep() 模擬按電源鍵,如果屏幕已經是關閉的則沒有任何作用
boolean isScreenOn() 檢查屏幕是否亮屏

實例:

public void testScreenOn() throws RemoteException{
  //檢查屏幕是否喚醒,如果不是則喚醒
    //如果屏幕是亮屏,則關閉屏幕

    if (UiDevice.getInstance().isScreenOn()){

        UiDevice.getInstance().sleep();     //滅屏操作

    }

    //如果屏幕是滅屏狀態則轉為亮屏狀態

    if (!UiDevice.getInstance().isScreenOn()){

        UiDevice.getInstance().wakeUp();    //亮屏操作

    }

}

五、等待對象

返回值

方法名

描述

void waitForIdle(long timeuot) 自定義超時等待當前應用處於空閑狀態
void waitForIdle() 等待當前應用處於空閑狀態,默認等待10s
boolean waitForWindowUpdate(Steing packageName,long timeout) 等待窗口內容更新時間的發生窗口更新事

實例:

public void testIdle(){
    //通過坐標點擊界面上的,一個應用,點開應用后點擊界面上的“搜索”按鈕

   UiDevice.getInstance().click(580, 654);

   //等待500000,如果界面還沒有打開則,超時異常
    UiDevice.getInstance().waitForIdle(500000);

    UiObject searchObject=new UiObject(new UiSelector().text("搜索"));
		
    searchObject.click();

    //超時等待等待時間為0到500000,如果在這個時間內,界面載入完成則算成功。
    
    //[0,417][64,480]這個是瀏覽器坐標

    UiDevice.getInstance().click(32, (480-417)/2+417);//點擊瀏覽器

    UiDevice.getInstance().waitForIdle(20000);//超時等待20s

    
} 
等待當前應用處於空閑狀態,如打開應用程序,打開載入的動作一直在進行,當前完全載入程序,處於應用主界面,而沒有去操作他,此時的狀態就是空閑狀態。
窗口更新事件,如點擊一個按鈕這個按鈕會跳轉到其他的activity中,則點擊這個按鈕就發生了窗口更新事件。

六:截圖

返回值

方法名

描述

boolean takeScreenshot(FilestorePath) 把當前窗口截圖並將其存儲為png默認的1.0f的規格(原尺寸)和90%質量,參數為file類的文件路徑
boolean takeScreenshot(File storePath,float scale,int quality) 把當前窗口截圖為png格式圖片,可以自

參數說明:

參數 說明
storePath 存儲路徑,必須為png格式
Scale 縮放比例,1.0為原圖
Quality 圖片壓縮質量,范圍為0-100
   
返回     說明
True 截圖成功
False 截圖失敗

實例:

//把當前窗口截圖並將其存儲為png默認的1.0f的規格(原尺寸)和90%質量,參數為file類的文件路徑為"sdcard/test1.png"

public void testScreen(){

    UiDevice.getInstance().takeScreenshot(new File("sdcard/test1.png"));

}

//參數為File類,注意參數的使用形式,請參照以下例子
//截圖保存到sd卡更目錄中,圖片文件名為test1

UiDevice.getInstance().takeScreenshot(new File("/sdcard/test1.png"));

七:拖拽與滑動

返回值 方法名 說明
boolean

swipe(Point[] segments, int segmentSteps)

在點陣列中滑動,5ms一步
boolean

swipe(int startX, int startY, int endX, int endY, int steps)

通過坐標滑動屏幕
boolean

drag(int startX, int startY, int endX, int endY, int steps)

從一個坐標到另一個坐標進行拖拽

 

拖拽:將一個組件從一個坐標移動到另一個坐標處
滑動:從一個坐標點移動到另一個坐標點
步長:從一點滑動到另一點使用的時間(1步長=5毫秒,1秒=1000毫秒);步長越長,即兩點之間移動越慢

  

參數說明:

參數 說明
segments

Poing[]點陣列,可以多個點

segmentSteps 滑動步長
StartX-StartY 具體坐標值
   
返回     說明
True 滑動成功
False 滑動失敗

實例:

//1.拖動對象從一個坐標移動到另一個坐標

public void testDrag(){

    //[64,417][128,480] 找到坐標位置先

    int startX, startY, endX, endY, steps;                          

    startX=(128-64)/2+64;                                           

    startY=(480-417)/2+417;

    endX=startX=(128-64)/2+64;

    endY=startY-200;

    steps=30;

    UiDevice.getInstance().drag(startX, startY, endX, endY, steps);

}
//2.通過坐標滑動屏幕

public void testSwipe(){

    int h=UiDevice.getInstance().getDisplayHeight();        //獲取屏幕高度

    int w=UiDevice.getInstance().getDisplayWidth();         //獲取屏幕寬度

    UiDevice.getInstance().swipe(w-10, h/2, 10, h/2, 30);   //從左往右進行滑動

}
//3.在點陣列中滑動(例子中為畫了一個不規則矩形)

public void testSwipe2(){

//227,318  746,335  784,814  221,840  矩形的四個定點,比如隨意畫手勢,滾動,滑動等都會用到這個

    Point p1=new Point();

    Point p2=new Point();

    Point p3=new Point();

    Point p4=new Point();

    p1.x=227;p1.y=318;

    p2.x=746;p1.y=335;

    p3.x=784;p1.y=814;

    p4.x=221;p1.y=840;

    Point[] pp={p1,p2,p3,p4};

    UiDevice.getInstance().swipe(pp, 50);

}

八:獲取包名&開啟通知欄&快速設置&獲取布局文件

返回值 方法名 描述
void getCurrentPackageName() 獲取當前界面的包名
void dumpWindowHierarchy(String fileName) 獲取當前界面的布局文件,保存在/data.local/tmp/目錄下
boolean openNotification() 打開通知欄
boolean openQuickSettings() 打開快速設置
void

setCompressedLayoutHeirarchy(boolean compressed)

啟用或禁用布局層次壓縮。

實例:

//1.獲取並輸出包名

public void testGet(){

    String packageName=UiDevice.getInstance().getCurrentPackageName();  //獲取包名

    System.out.print("瀏覽器的包名為:"+packageName);   //在控制台輸出包名

    UiDevice.getInstance().openNotification();  //打開通知欄

    UiDevice.getInstance().openQuickSettings(); //打開快速設置欄

    UiDevice.getInstance().dumpWindowHierarchy("n.xml");//獲取當前界面的布局文件並命名為n

        //對於該文件可以使用命令"adb pull /data/local/tmp/n.xml F:\"命令將該文件導出來

}

九:監聽器

返回值  方法名 說明
void

registerWatcher(String name, UiWatcher watcher)

注冊一個監聽器,當前運行指定步驟被打斷的時候,處理中斷異常
void

removeWatcher(String name)

移除之前注冊的監聽器
void

resetWatcherTriggers()

重置一個監聽器
void

runWatchers()

強制運行所有的監聽器
boolean hasAnyWatcherTriggered() 檢查是否有監聽器觸發過
boolean

hasWatcherTriggered(String watcherName)

檢查某個特定的監聽器是否觸發過

實例:

//在循環打開百度關閉百度應用過程中來電話,使用監聽器掛斷電話,讓腳本繼續執行 
//注冊監聽器,處理來電 UiDevice.getInstance().registerWatcher("hangUpThePhone", new UiWatcher() { @Override public boolean checkForCondition() { // TODO Auto-generated method stub UiObject text=new UiObject(new UiSelector().text("來電")); UiObject call=new UiObject(new UiSelector().className("")); if(text.exists()){ try { call.swipeRight(10); } catch (UiObjectNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } return true; }else{ return false; } } }); //測試腳本 UiObject baiduObject=new UiObject(new UiSelector().text("百度")); for(int i=0;i<100;i++){ baiduObject.clickAndWaitForNewWindow(); sleep(2000); UiDevice.getInstance().pressHome(); sleep(1000); }
監聽器用於處理中斷,當腳本其他未知情況打斷執行的時候,如果有監聽器則會跳轉到監聽器中執行,我們可以使用監聽器做一些特殊的測試如,來電,來鬧鍾日常等測試。還可以處理異常中斷,如我最先設計的測試步驟,中途突然10086來了封短信,彈窗短信,直接打斷我的腳本步驟,如果我沒有做預先的處理則,這條用例最終就執行失敗。另外監聽器需要寫在腳本的開頭。

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM