UiAutomator(2)--UiDevice API
一、UiDevice介紹
1.UiDevice代表設備狀態,爲單例模式。UiDevice的功能包括:
(1)獲取設備信息:屏幕分辨率,旋轉狀態,亮滅屏狀態等
(2)操作:案件,座標操作,滑動,拖拽,滅屏喚醒屏幕,截圖等
(3)監聽器功能
2.UiDevice寫法有兩種,推薦第一種方式,第二種可能會引起某些問題而導致無法運行:
(1)UiDevice.getInstance().pressHome();
(2)getUiDevice().pressHome();
二、API使用
1. 按鍵相關的API,常用的按鍵包括HOME,MENU,BACK,VOLUME_UP,VOLUME_DOWN,RecentApps,POWER等
(1)pressBack():模擬短按返回back鍵
(2)pressEnter():模擬短按回車鍵
(3)pressDelete():模擬短按刪除delete按鍵
(4)pressHome():模擬短按HOME鍵
(5)PressMenu():模擬短按menu鍵
(6)pressRecentApps():模擬斷案最近使用程序
(7)pressSearch():模擬短按搜索鍵
(8)pressKeyCode(int keycode,int metaState):模擬短按鍵盤代碼keycode
pressKeyCode(int keyCode):模擬短按鍵盤代碼keycode
KEYCODE,鍵盤映射碼,具體見鏈接:KeyCode。
KeyEvent,爲按鍵事件,具體見鏈接:Keyevent。
metaState爲META key的狀態。META key是輔助功能鍵,即ALT、SHIFT、CAPS_LOCK。
metaState有四種狀態,分別如下:
2.獲取座標與座標點擊相關API
(1)click(int x,int y):使用座標點擊屏幕
(2)getDisplayHeight():返回值爲int,獲取屏幕高度
(3)getDisplayWidth():返回值爲int,獲取屏幕寬度
(4)getDisplaySizeDp():返回值爲Point,獲取顯示尺寸返回大小(設備獨立像素,屏幕旋轉返回的顯示大小調整) DP:設備獨立像素,例如,320像素顯示到640像素上要拉昇一倍
3.拖拽與滑動相關API
(1)drag(int startX,int startY,int endX,int endY,int steps):拖動對象從一個座標拖拽到另一個座標
(2)swipe(Point[] segments,int segmentSteps):在點陣列中滑動,5ms一步
(3)swipe(int startX,int startY,int endX,int endY,int steps):通過座標滑動屏幕
4.旋轉屏幕API
(1)setOrinentationLeft():通過禁用傳感器,然後模擬設備向左轉,並且固定位置
(2)setOrientationNatural():通過禁用傳感器,然後模擬設備轉到其自然默認方向,並且固定位置
(3)setOrienttationRight():通過禁用傳感器,然後模擬設備向右轉,並且固定位置
(4)unfreezeRotation():重新啓用傳感器和允許物理旋轉
(5)isNaturalOrientation():檢測設置是否處於默認旋轉狀態
(6)getDisplayRotation():返回值爲int,返回當前的顯示旋轉,0度,90度,180度,270度,值分別爲:0、1、2、3.
(7)freezeRotation():禁用傳感器和凍結裝置物理旋轉在其當前旋轉狀態
5.滅屏與喚醒屏幕API
(1)wakeUp():模擬按電源鍵,如果屏幕是喚醒的沒有任何作用
(2)sleep():模擬按電源鍵,如果屏幕已經是關閉的則沒有任何作用
(3)isScreenOn():檢查屏幕是否亮屏
6.截圖與等待空閒API
(1)takeScreenshot(File storePath):把當親啊窗口截圖並將其存儲爲png默認1.0f的規模(原尺寸)和90%質量,參數爲file類的文件路徑
(2)takeScreenshot(File storePath,float scale,int quality):把當前窗口截圖爲png格式圖片,可以自定義縮放比例與圖片質量
storePath:存儲路徑,必須爲png格式
Scale:縮放比例,1.0爲原圖
Quality:圖片壓縮質量,範圍爲0-100
(3)waitForIdle(lonog timeout):自定義超時等待當前應用處於空閒狀態
(4)waitForIdle():等待當前應用處於空閒狀態,默認等待10s
(5)waitForWindowUpdate(String packageName,long timeout):等待窗口內容更新事件的發生
7.獲取包名&開啓通知欄&快速設置&獲取佈局文件相關API
(1)getCurrentPackageName():獲取當前界面的包名
(2)dumpWindowHierarchy(String fileName):獲取當前界面的佈局文件,保存在/data/local/tmp/目錄下
(3)openNotification():打開通知欄
(4)openQuickSettings():打開快速設置
三、以自己公司的app爲實例
package cn.microinvestment.weitou;
import java.io.File;import java.io.IOException;import android.os.RemoteException;import android.view.KeyEvent;import com.android.uiautomator.core.UiDevice;import com.android.uiautomator.core.UiObject;import com.android.uiautomator.core.UiObjectNotFoundException;import com.android.uiautomator.core.UiSelector;import com.android.uiautomator.testrunner.UiAutomatorTestCase;public class UiDeviceDemo extends UiAutomatorTestCase { public static void main(String[] args) throws IOException { Runtime.getRuntime().exec("adb shell am start -n " + "cn.microinvestment.weitou/cn.microinvestment.weitou.activity.WTLoginControllerActivity"); new UiAutomatorHelper("uiobject", "cn.microinvestment.weitou.UiDeviceDemo", "test", "4"); } public void test() throws UiObjectNotFoundException, RemoteException{ //登錄按enter鍵(密碼用kecode,123456)-獲取屏幕高度和寬度-從下往上滑動資訊列表-判斷屏幕是否亮,是就滅屏,不是就喚醒 //-截圖-獲取包名-獲取當前界面的佈局文件-打開通知欄 UiObject loginbtn=new UiObject(new UiSelector().text("登錄"));
UiObject username=new UiObject(new UiSelector().resourceId("cn.microinvestment.weitou:id/login_phone")); UiObject password=new UiObject(new UiSelector().resourceId("cn.microinvestment.weitou:id/login_password")); if(loginbtn.exists()){ loginbtn.clickAndWaitForNewWindow(); //輸入登錄帳號 username.setText("14900765791"); //點擊密碼框 password.click(); //用keycode輸入123456 UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_1); UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_2); UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_3); UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_4); UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_5); UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_6); UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_ENTER); UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_ENTER); UiDevice.getInstance().waitForIdle(); //用keycode按enter鍵 UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_ENTER); UiDevice.getInstance().pressKeyCode(KeyEvent.KEYCODE_ENTER); //默認等待10s UiDevice.getInstance().waitForIdle(); } //獲取屏幕的寬和高 int x=UiDevice.getInstance().getDisplayWidth(); int y=UiDevice.getInstance().getDisplayHeight(); //從下向上滑動 UiDevice.getInstance().swipe(x/2, y-200, x/2, 200, 100); UiDevice.getInstance().waitForIdle(20000); //判斷屏幕是否亮 if(!UiDevice.getInstance().isScreenOn()){ UiDevice.getInstance().wakeUp(); } UiDevice.getInstance().waitForIdle(5000); //截圖 UiDevice.getInstance().takeScreenshot(new File("/sdcard/test.png")); //獲取當前的包名 System.out.println(UiDevice.getInstance().getCurrentPackageName()); //獲取當前的佈局 UiDevice.getInstance().dumpWindowHierarchy("1.xml"); //打開通知欄 UiDevice.getInstance().openNotification(); }}