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