一、按鍵使用
返回值 |
方法名 |
說明 |
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 | 重置一個監聽器 | |
void | 強制運行所有的監聽器 | |
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來了封短信,彈窗短信,直接打斷我的腳本步驟,如果我沒有做預先的處理則,這條用例最終就執行失敗。另外監聽器需要寫在腳本的開頭。