1. 程式人生 > >UiAutomator筆記之UiDevice API(二)

UiAutomator筆記之UiDevice API(二)

一、UiDevice類簡介  

1、UiDevice代表裝置狀態。如螢幕的大小、旋轉方向、按壓各種按鍵等。

2、UiDevice為單例模式,可有2種方式獲取其例項。

(1)UiDevice.getInstance();--->推薦 (2)getUiDevice.pressHome();---->在類A中封裝方法,方法被類B呼叫的時候會出現空指標異常

3、主要功能 (1)獲取裝置資訊:螢幕解析度、選裝狀態、亮滅屏...... (2)操作:按鍵、座標操作、滑動、拖拽、截圖...... (3)監聽器功能  

二、按鍵與KEYCODE使用

1、點選按鍵 相關API

UiDevice例項呼叫以下方法即可實現點選按鍵操作。

返回值 方法名 描述
boolean pressBack() 模擬短按返回back鍵
boolean pressDPadCenter() 模擬按軌跡球中點按鍵
boolean pressDPadDown() 模擬軌跡球向下按鍵
boolean pressDPadLeft() 模擬軌跡球向左按鍵
boolean pressDPadRight() 模擬軌跡球向右按鍵
boolean pressDPadUp() 模擬軌跡球向上按鍵
boolean pressDelete() 模擬短按刪除delete按鍵
boolean pressEnter() 模擬短按回車鍵
boolean pressHome() 模擬短按HOME鍵
boolean pressKeyCode(int keyCode, int metaState) 模擬短按鍵盤程式碼keycode
boolean pressKeyCode(int keyCode) 模擬短按鍵盤程式碼keycode
boolean pressMenu() 模擬短按menu鍵
boolean pressRecentApps() 模擬短按最近使用程式
boolean pressSearch() 模擬短按搜尋鍵

2、KEYCODE 鍵盤對映碼

(1)KeyEvent:按鍵事件,每個鍵盤對映碼都儲存在keyEvent的常量中。

(2)META Key

<1>輔助功能鍵: ALT、SHIFT、CAPS_LOCK

<2>輔助功能鍵的狀態

啟用狀態 metaState
base META_key未被啟用 0
caps SHIFT或CAPS_LOCK被啟用時 1
fn ALT被啟用 2
caps_fn ALT,SHIFT或CAPS_LOCK同時被啟用時 3

<3>示例

UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_A);//點選輸入小寫字母a UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_A,1);//點選輸入大寫字母A  

三、獲取座標與座標點選

 1、座標相關知識

(1)手機螢幕座標:從左上角(0,0)開始到右下角(X,Y) (2)dp:裝置獨立畫素,例如,320畫素顯示到640畫素上要拉伸一倍 (3)Point:代表一個點(x,y)  

2、座標相關API

UiDevice例項呼叫以下方法即可實現獲取座標和點選操作。

返回值 方法名 描述
boolean click(int x, int y) 使用座標點選螢幕
int getDisplayHeight() 獲取螢幕高度
Point getDisplaySizeDp() 獲取顯示尺寸返回顯示大小(裝置獨立畫素);螢幕旋轉返回的顯示大小調整
int getDisplayWidth()

獲得螢幕寬度

3、Uiautomator Viewer

(1)功能:獲取螢幕快照,並通過快照獲取到控制元件的屬性。

(2)啟用方式

方式一、啟動路徑:adt/sdk/tools/UiautomatorViewer 

方式二、Eclipse/DDMS/Devices/UiautomatorViewer 

(3)螢幕快照引數之控制元件座標

 通過UiautomatorViewer獲取螢幕快照,選中目標控制元件,通過Node Detail / bounds[左上角頂點座標][右下角頂點座標] 可獲取到控制元件的位置。

4、示例

(1)

UiDevice.getInstance().click(399,355);//點選[399,355]座標點

(2) int h = UiDevice.getInstance().getDisplayHeight(); int w = UiDevice.getInstance().getDisplayWidth(); UiDevice.getInstance().click(w/2,h/2); //點選螢幕的中心點

(3)

UiObject object = new UiObject(new UiSelector.resoutceId("com.andr....控制元件Id"));//根據ID獲取控制元件

Rect r = object.getBounds();//獲取控制元件對應的矩形區域相關屬性 r.left; //矩形左上角頂點X座標 r.top; //矩形左上角頂點Y座標 r.right; //矩形右下角頂點X座標 r.bottom; //矩形右下角頂點Y座標 r.centerX(); //矩形的中心點X座標 r.centerY(); //矩形的中心點Y座標四、拖拽與滑動 1、相關概念 (1)拖拽:將一個元件從一個座標移動到另一個座標處。 (2)滑動:手指從一個座標點移動到另一個座標點。 (3)步長:從一點滑動到另一點使用的時間,步長越短說明移動越快。  

2、拖拽與滑動相關API

返回值 方法名 描述
boolean drag(int startX, int startY, int endX, int endY, int steps) 拖動物件從一個座標拖動到另一個座標,step表示拖拽過程使用的時間(ms)
boolean swipe(Point[] segments, int segmentSteps) 在點陣列中滑動,5ms一步
boolean swipe(int startX, int startY, int endX, int endY, int steps) 通過座標滑動螢幕

3、示例:按照一個矩形的路徑滑動  Point p1 = new Point();  Point p2 = new Point();  Point p3 = new Point();   Point p4 = new Point();  p1.x =277;  p1.y =318;   ...... //設定四個頂點的橫縱座標  Point[] pp = {p1,p2,p3,p4};  UiDevice.getInstance().swipe(pp,50); //每50毫秒走一步(從一個點滑動到下一個點)五、旋轉螢幕 1 、旋轉螢幕相關知識 (1)旋轉方向:4個方向,分別為 0度,90度,180度,270度 (2)重力感應器 (3)固定位置與物理旋轉 固定位置:螢幕的方向固定在0、90、180、270度; 物理旋轉:與重力感應器連線,關閉了物理旋轉就是關閉了重力感應器。  

2、螢幕旋轉相關API

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

六、滅屏與喚醒

滅屏與喚醒相關API

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

七、截圖與等待空閒

1 、截圖與等待空閒相關知識 (1)圖片縮放比例:如縮小1/2,即將100*100px的圖片長寬都縮小為原來的1/2,50*50px。 (2)圖片質量:一般是指圖片的大小,質量越高圖片越大。 (3)File 類:檔案或者資料夾。 (4)圖片格式 :截圖的格式都是PNG。 (5)空閒狀態:視窗沒有更新或介面無動作。 (6)視窗更新事件。  

2、截圖相關API

返回值 方法名 描述
boolean takeScreenshot(File storePath) 把當前視窗截圖並將其儲存為png預設1.0f的規模(原尺寸)和90%質量,引數為file類的檔案路徑。
boolean takeScreenshot(File storePath, float scale, int quality) 把當前視窗截圖為png格式圖片,可以自定義縮放比例與圖片質量。

引數說明: storePath:儲存路徑,必須為png格式。 scale:縮放比例,1.0為原圖。 quality:圖片壓縮質量,範圍為0-100。  

3、等待空閒相關API

返回值 方法名 描述
void waitForIdle(long timeout) 自定義超時等待當前應用處於空閒狀態
void waitForIdle() 等待當前應用處於空閒狀態,預設等待10s;即10s後還不處於空閒狀態則報錯,程式在該句程式碼處中斷;10s內程式處於空閒狀態,則該句程式碼執行完畢。
boolean waitForWindowUpdate(String packageName, long timeout) 等待視窗內容更新事件的發生

八、獲取包名&開啟通知欄&快速設定&獲取佈局檔案

1、相關知識 包名:應用的唯一標識。 通知欄:從手機頂部下滑,出現的下拉介面即通知欄。 快速設定:即通知欄中的快速設定控制元件,快速設定介面可設定網路、螢幕亮度、飛航模式等。 2、相關API

返回值 方法名 描述
void getCurrentPackageName() 獲取當前介面的包名,即目前處於手機前臺的應用的包名
void dumpWindowHierarchy(String fileName) 獲取當前介面的佈局檔案,fileName給佈局檔案命名如“layout.xml”,儲存在/data/local/tmp/目錄下
boolean openNotification() 開啟通知欄
boolean openQuickSettings() 開啟快速設定

--------------------- 本文來自 evaFT 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/yiwaChen/article/details/52566427?utm_source=copy