Uiautomator入門(初學者用)


   最近在看Uiautomator的東西,對於寫慣了robotium的我來說,還是一種全新的體驗,之前一直想過要嘗試一下,不過一直沒有抽出空,不廢話不廢話,寫博客是給自己留一個備忘,當然也是為了給更多希望接觸到這方面知識的同學們做一個引導,so,大神可以直接右上角叉叉了,這個博客里是沒有干貨噠~

   言歸正傳,那么uiautomator和現在業界里主流的一些android自動化測試框架或者技術相比有什么優缺點么?

優點:1.可以對所有操作進行自動化,操作簡單;

     2.不需要對被測程序進行重簽名,且,可以測試所有設備上的程序,比如~某APP,比如~撥號,比如~發信息等等

     3.對於控件定位,要比robotium簡單一點點

 

缺點:1.uiautomator需要android level 16以上才可以使用,因為在level 16及以上的API里面才帶有uiautomator工具

     2.如果想要使用resource-id定位控件,則需要level 18及以上才可以

     3.對中文支持不好(不代表不支持,第三方jar可以實現)

     4.個人感覺,控件定位不如robotium那樣層級分明,僅僅個人感覺,用戶行為注入還是和插樁有點點區別的

 

正題!正題!正題!(重要的事情說三遍)

第一步、環境准備:

1.JDK(是的,你沒看錯,基礎的android開發環境必備),以及對應的環境變量配置,不會的可以自己百度下下

2.eclispse(IDE尊崇個人意願)

3.android SDK以及配置

4.ANT(主要用於build我們的腳本,生成jar包)

ant的搭建主要分幾步:1.下載ant安裝文件並且解壓安裝;

                              2.新建系統環境變量ANT_HOME,參數值是你的ant安裝目錄;

                              3.在Path環境變量中添加ant安裝目錄的bin文件夾,比如我的就是C:\cod\apache-ant-1.9.6\bin

                              4.配置完以后,測試一下,在命令行下輸入ant -version,如果顯示你所安裝的ant版本信息,證明環境變量配置成功

 

第二步、建立我們的測試工程:

一、使用Eclipse新建Java Project

二、添加junit jar(百度可以下到),在測試工程上右鍵-properties-Java Build Path-add external JARs

       添加android.jar,依然使用添加junit.jar一樣的步驟,選擇SDK目錄下的Android-sdk\platforms\android-17\下面的android.jar和uiautomator.jar添加進來

三、在測試工程src文件夾中add package,然后添加一個class文件,命名隨意

文件內容是這樣滴:

 

具體方法,以及一些API,后面給大家介紹

四、CMD進入\Android-sdk\tools\目錄下,運行命令 android list,查看對應android版本的SDK的ID值

五、仍然在\Android-sdk\tools\目錄下,運行命令:android create uitest-project -n <name> -t <android-sdk-ID> -p <project_path>
    比如:
    android create uitest-project -n Checker -t 6 -p C:\eclipse_coding\CmTest
    上面的name就是將來生成的jar包的名字,可以自己定義;android-sdk-ID就是上面看到的對應android版本的SDK id;path是Eclipse里剛才建立的測試工程的路徑;運行命令后,將會在工程的根目錄下生成build.xml文件。如果沒生成,檢查上面的步驟。

六、CMD進入測試工程目錄,然后運行ant build,將使用ant編譯生成jar,成功將會提示:


成功后,會在工程bin目錄下生成對應名稱的jar包

七、將jar包push到手機data/local/tmp目錄下,對應的命令是:

adb push <jar文件路徑> data/local/tmp

然后使用命令行啟動我們已經push進去的uiautomator腳本

adb shell uiautomator runtest <jar文件名> -c <工程中的類名(包含包名)>

例:adb shell uiautomator runtest check.jar -c com.ct.uiTest.CheckSize

完成這一步后,手機會執行uiautomator腳本並且開始進行操作,關於uiautomator的對應api,由於今天太晚了,明天我們接着嘮

 

---------------------------------------------------我是華麗的分割線--------------------------------------------------------------

uiautomator的基礎對象:

UiDevice

代表設備狀態。在測試中,可以通過UiDevice實例來檢測設備的各種屬性,例如當前的屏幕方向以及屏幕尺寸。同時還可以通過UiDevice實例來執行設備級別的操作,例如 把設備設置為橫屏或者豎屏、按下Home按鍵等。

例:getUiDevice().pressHome();      //模擬按下home鍵操作

 

UiSelector

代表一個搜索UI控件的條件。如果發現多個滿足條件的控件則會返回第一個控件。返回的結果為UiObject對象。在構造UiSelector的時候可以 組合使用多個屬性來定位具體的控件。如果沒有找到控件則會拋出 UiAutomatorObjectNotFoundException 異常

 

UiObject

代表一個UI控件。通過UiSelector來查找UiObject。

 

UiCollection

代表控件的集合。獲取UiCollection的方式和UiObject一樣,通過 UiSelector查找。 UiCollection對應Android系統中的ViewGroup以及子控件。比如界面中有多個check時,我們要使用classname獲取當前界面中所有的checkbox,就可以使用UICollection來接收獲取到的控件集合

 

UiScrollable

代表可滾動的控件。可以用UiScrollable來模擬水平或者垂直滾動的UI元素。如果需要操作的元素在屏幕外需要滾動屏幕才能看到的情況下需要使用UiScrollable

其他API參考uiautomator api文檔

 

分享一下我所知道的一些uiautomator API

一、控件定位類:

控件定位屬於android自動化中比較常用的,uiautomator可以使用resource-id,文本,index,classname(控件類型),偽xpath

通過文本定位:

UISelector().text方法

例:textview = new UiObject(new UiSelector().text("user info"));

該方法通過直接查找當前界面上所有的控件來比較每個控件的text屬性是否如參數值來定位控件,挺好理解的,所以就沒有必要細說了。


UISelector.textContains方法

例:addNote = new UiObject(new UiSelector().textStartsWith("user"));

此方法跟以上方法類似,但是不需要輸入控件的全部text信息

 

 

 

通過resource-id定位:

UISelector().resourceId方法

例:UiObject lb=new UiObject(new UiSelector().resourceId("com.cleanmaster.mguard:id/relativeLayoutBtns"));

resource-id可以通過android_sdk tools目錄下的uiautomatorviewer工具查看

 

 

通過classname定位:

UiSelector().classname方法

 例:UiCollection list=new UiObject(new UiSelector().className("android.widget.CheckBox"));

 

 

通過偽xpath定位:

 UISelector類提供了一些方法根據控件在界面的XML布局中的層級關系來進行定位,但是UIAutomator又沒有真正的提供類似Appium的findElementWithXpath相關的方法,所以這個位置我們叫它偽xpath,其實就是通過層級一層一層去定位控件,通常用於Listview中定位id相同的控件

 

UiSelector.fromParent或UiObject.getFromParent方法

例:UiObject uio=new UiObject(new UiSelector().text("Cache junk").fromParent(new UiSelector().className("android.widget.CheckBox")));

 

上面這段代碼是一個場景

 

這是一個android里面常見的listview,它里面有很多的layout,可是如果我只想獲取到cache junk這一條目中的checkbox,又沒有id,index又不固定的情況下,怎么辦呢,就使用上面那段代碼,以下是UI和層級關系

 

那段代碼的思路是,使用text定位cache junk這個UI中的唯一性控件,然后.fromParent定位到cache junk控件的父控件,就是index為1的那個RelativeLayout控件,再在RelativeLayout控件中通過classname定位這個layout中的唯一一個checkbox控件,大家可以想一下這個思路,你小兒子踢足球把我家玻璃打碎了,逃逸了,我認識你大兒子,我通過你大兒子找到你爸爸,再通過你爸爸找到小兒子,揍一頓~

 

通過UiSelector.childSelector或UiObject.getChild方法

剛才是一個通過孩子找父親再找兄弟的思路,那么這個方法就是我知道你爸爸是誰,我直接通過你爸爸找到兒子

例:UiObject parentView = new UiObject(new UiSelector().className("android.view.View"));

      save = parentView.getChild(new UiSelector().text("Save"));

以上就是一些比較常用的,定位控件的方法,下面是一些零散的操作類方法

·喚醒手機:getUiDevice().wakeUp();

·點擊控件:UiObject huancun=new UiObject(new UiSelector().text("Cache junk"));
              huancun.click();

·滑動:getUiDevice().swipe(startX, startY, endX, endY, steps)

在手機上滑動,從(startX,startY)到(endX,endY)。steps表示滑動的這個距離分為幾步完成,數目越少,滑動幅度越大

·點擊並等待窗口刷新:UiObject huancun=new UiObject(new UiSelector().text("Cache junk"));
              huancun..clickAndWaitForNewWindow()

·長按:UiObject huancun=new UiObject(new UiSelector().text("Cache junk"));
        huancun.longclick();

 

 

以上就是我所知道並且經常使用的一些方法,讀完這篇博文,可能並不會讓你馬上寫出一個非常牛逼,功能非常全面的腳本,但是初學者可以在一個點擊的完成,或者成功定位到一個很復雜的控件后,多一點點成就感,以此來培養這方面的興趣,相信將來,你終究也會是大神

 

 

 

 

 

 

 

 

       


免責聲明!

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



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