1. 程式人生 > >android自動化測試中hierarchyviewer和uiautomatorviewer獲取控制元件資訊的方式比對

android自動化測試中hierarchyviewer和uiautomatorviewer獲取控制元件資訊的方式比對

android自動化新人一個,目前研究PC端獲取android裝置的控制元件資訊有哪些方式。多多指教!

        android的目錄tools下有2個自帶的工具hierarchyviewer和uiautomatorviewer,開啟後,如下所示:

        分別來介紹它們怎麼使用的:

   UiAutoMatorViewer

 點選左上角的手機圖樣的小圖示,出現彈出框,此時正在獲取資訊:

         完成獲取後得到了當前的手機介面:

        然後你可以點選主面板中的圖片,右面的屬性面板會顯示你所點選的區域的控制元件屬性。(需要注意到是,你的手機裝置或模擬器的api要在16以上,也就是android版本得是4.1以上,因為這個工具是google在4.以後推出來的,只適用於4.1以後的版本)。

        到這一步,我瞭解瞭如何使用這個工具,但是並不是我要研究的東西。我要知道他是如何和手機裝置通訊,然後獲取控制元件資訊的,所以我反編譯了uiautomatorviewer.jar,以便從原始碼瞭解它的原理。

        在tools/lib下找到uiautomatorviewer.jar。反編譯後項目結構如下所示:

        首先檢視UiAutomatorViewer.class,開啟後明顯看出這是一個java.swt的主介面類,那我們只需要找到工具欄中的按鈕的定義。我們就能追蹤到點選它是怎麼得到裝置控制元件資訊的。

        找到這個按鈕的定義後,我們按ctrl鍵 點選滑鼠跟蹤進去,發現該類中有一個進度條對話方塊,這正是我們先前點選按鈕出現的對話方塊,這裡面肯定定義資訊獲取的方式。

        檢視上面的程式碼分析得到,UiAutoMatorHelper的子類UiAutoMatorResult和物件result,它得到了UiAutomatorHelper方法和takeSnapShot返回的結果,那麼我就去這個方法一探究竟。進入UiAutomatorHelper中,找到takeSnapshot方法。

  1. publicstatic UiAutomatorResult takeSnapshot(IDevice device, IProgressMonitor monitor) 
    throws com.android.uiautomator.UiAutomatorHelper.UiAutomatorException  
  2.   {  
  3.     UiAutomatorModel model;  
  4.     String msg;  
  5.     RawImage rawImage;  
  6.     if (monitor == null) {  
  7.       monitor = new NullProgressMonitor();  
  8.     }  
  9.     monitor.subTask("Checking if device support UI Automator");  
  10.     if (!(supportsUiAutomator(device))) {  
  11.       String msg = "UI Automator requires a device with API Level 16";  
  12.       thrownew com.android.uiautomator.UiAutomatorHelper.UiAutomatorException(msg, null);  
  13.     }  
  14.     monitor.subTask("Creating temporary files for uiautomator results.");  
  15.     File tmpDir = null;  
  16.     File xmlDumpFile = null;  
  17.     File screenshotFile = null;  
  18.     try {  
  19.       tmpDir = File.createTempFile("uiautomatorviewer_""");  
  20.       tmpDir.delete();  
  21.       if (!(tmpDir.mkdirs()))  
  22.         thrownew IOException("Failed to mkdir");  
  23.       xmlDumpFile = File.createTempFile("dump_"".uix", tmpDir);  
  24.       screenshotFile = File.createTempFile("screenshot_"".png", tmpDir);  
  25.     } catch (Exception e) {  
  26.       msg = "Error while creating temporary file to save snapshot: " + e.getMessage();  
  27.       thrownew com.android.uiautomator.UiAutomatorHelper.UiAutomatorException(msg, e);  
  28.     }  
  29.     tmpDir.deleteOnExit();  
  30.     xmlDumpFile.deleteOnExit();  
  31.     screenshotFile.deleteOnExit();  
  32.     monitor.subTask("Obtaining UI hierarchy");  
  33.     try {  
  34.       <span style="color:#ff0000;">getUiHierarchyFile(device, xmlDumpFile, monitor);  
  35. </span>    } catch (Exception e) {  
  36.       msg = "Error while obtaining UI hierarchy XML file: " + e.getMessage();  
  37.       thrownew com.android.uiautomator.UiAutomatorHelper.UiAutomatorException(msg, e);  
  38.     }  


        剛開始的時候沒明白為什麼有好多定義檔案的程式碼,然後就沒管,往下看的時候發現了一個getUiHierarchyFile方法,既然在這個方法裡沒找到獲取控制元件資訊的方式,那麼我就試著去getUiherarchyFile方法中看看(其實我之前研究hierarchyviewer的時候,這個工具也用過這個getHierarchy方法,只不過叫parseHierarchy,它就是獲取控制元件樹的,所以我心中一喜,有戲) 。讓我們進入getUiHerarchyFile中看看,看能否發現我們真正需要的。

  1. privatestaticvoid getUiHierarchyFile(IDevice device, File dst, IProgressMonitor monitor) {  
  2.     if (monitor == null) {  
  3.       monitor = new NullProgressMonitor();  
  4.     }  
  5.     monitor.subTask("Deleting old UI XML snapshot ...");  
  6.     String command = "rm /data/local/tmp/uidump.xml";  
  7.     try
  8.     {  
  9.       commandCompleteLatch = new CountDownLatch(1);  
  10.       device.executeShellCommand(command, new CollectingOutputReceiver(commandCompleteLatch));  
  11.       commandCompleteLatch.await(5L, TimeUnit.SECONDS);  
  12.     }  
  13.     catch (Exception e1)  
  14.     {  
  15.     }  
  16.     monitor.subTask("Taking UI XML snapshot...");  
  17.     command = String.format("%s %s %s"new Object[] { "/system/bin/uiautomator""dump""/data/local/tmp/uidump.xml" });  
  18.     CountDownLatch commandCompleteLatch = new CountDownLatch(1);  
  19.     try
  20.     {  
  21.       device.executeShellCommand(command, new CollectingOutputReceiver(commandCompleteLatch), 40000);  
  22.       commandCompleteLatch.await(40L, TimeUnit.SECONDS);  
  23.       monitor.subTask("Pull UI XML snapshot from device...");  
  24.       device.getSyncService().pullFile("/data/local/tmp/uidump.xml", dst.getAbsolutePath(), SyncService.getNullProgressMonitor());  
  25.     }  
  26.     catch (Exception e) {  
  27.       thrownew RuntimeException(e);  
  28.     }  
  29.   }  
  1. </pre><precode_snippet_id="250249"snippet_file_name="blog_20140322_3_2829642"class="html"name="code">

        我原本以為這裡面也應該有個socke啥的,跟手機端通訊獲取資料的。進來這裡面沒發現socket,但是仔細一分析,原來UiAutomatorviewer並不是通過socket來獲取資訊的。它是傳送dump命令,讓存放在手機裝置中/system/bin/uiautomator下的指令碼執行,獲得一個uidump.xml的檔案,然後將這個檔案抓到本地。本地讀取xml檔案就可以了。這才恍然大悟為什麼之前takeSnapshot方法中有定義檔案的操作,原來它是通過獲取xml檔案存放在本地臨時檔案裡,太鬼了。

        那剩下的就是讀取xml檔案嘍。到這,我的uiautomatorviewer的瞭解就結束了,還算有點收穫。下面接著hierarchyviewer的使用。

   HierarchyViewer

        說到hierarchyviewer都是眼淚,花了3個禮拜研究,由於自己的死心眼,非要通過它實現自動化,非要用java寫。然後一直研究到它可以遍歷settings的所有介面;然後才發現被坑了,程式碼太長了;if/else寫了一大堆,又是dumpsys命令獲取window資訊和activity資訊,又是圖片比對確定點選跳轉的圖片,然後滿心歡喜的拿給經理看,經理直接給否決了---效率太低;hierarchyviewer獲取資料確實慢,但是總算有的基礎版本的嘛;其實我發現經理心裡算盤打著好著呢,她只是讓我們一步一步的瞭解,她知道哪種方式最適合,就是還不告訴我們,就讓我們自己研究,而我呢,剛來又著急展示一下,根基沒打穩就像往大的方向走,都開始實現開啦;然後被經理給拽回來, 開始研究哪些實現獲取控制元件的方式,以及優缺點,這才有了上面的uiautomator的研究;哎,不著急,一步一步來吧。

        說到hierarchyviewer,研究起來真的是小孩學步啊。經理只丟了一個命題:多語自動化測試,你們研究吧。我ca類,我還傻不垃圾的問了一句:什麼是多語。旁邊的測試人員給我回答了,多國語言測試。汗!好吧,我低端。。。。。。開始吧。

        首先選擇是手機端直接測試,還是連上PC端測試?然後發現了monkey,再到monkeyrunner,然後在monkeyrunner裡有touch方法點選,然後卻不知道一個按鈕的座標怎麼確定,在一個犄角旮旯的地方發現有人說通過hierarchyviewer可以獲取座標。然後就開始一個座標一個座標的找啊,編寫指令碼啊。總算實現了一點:喚醒--解鎖--點--點--點;然後開討論會的時候,讓經理否決了,說是這麼多控制元件,要一個一個找,得多長時間啊。要做到連上手機,不管哪個畫面,它自己獲得,然後點選。確實高階大氣上檔次!but你倒是告訴我從那塊搞起啊。哎,在百般糾結於無奈中,柳暗花明啦,hierarchyviewer上的東西不就是人家從客戶端獲取的麼。得到這個訊息後,我找到了一個知平軟體寫的,然後根據他的研究,一步一步瞭解了hierarchyviewer,在此感謝這個前輩,放出連線,新手同學可以研究下。

        通過讀這四篇文章,我對hierarchyviewer有了一定了解,對於這位前輩沒給出的一些疑惑我做了一些深入的研究和總結。

        總結:

        1.hierarchyviewer是通過socket連線android裝置的ViewServer,通過4939埠建立通訊。

        2.通過adb  -s <device>  forward  tcp:localpott  tcp:4939將埠對映到本地埠上

        3.通過該本地埠,客戶端啟動socket連線ViewServer,傳送"dump -1"命令獲取控制元件資訊。這些資訊一行代表一個控制元件,然後存放在ViewNode中。

        以上通過上面四篇文章你都能瞭解到。下面是自己的疑問:

        1.資訊是如何從一行一行的字串轉變為viewnode物件的。

        2.是怎麼深度遍歷樹的。

       帶著這些疑問我又暴力了,反編譯hierarchyviewer2lib.jar檔案,尋找到了DeviceBridge的parseHierarchy方法:

  1. publicstatic ViewNode parseViewHierarchy(BufferedReader in, Window window) {  
  2.     ViewNode currentNode = null;  
  3.     int currentDepth = -1;  
  4.     try
  5.     {  
  6.       while ((line = in.readLine()) != null) {  
  7. 相關推薦

    android自動化測試hierarchyvieweruiautomatorviewer獲取控制元件資訊方式

    android自動化新人一個,目前研究PC端獲取android裝置的控制元件資訊有哪些方式。多多指教!         android的目錄tools下有2個自帶的工具hierarchyviewer和uiautomatorviewer,開啟後,如下所示:

    android自動化測試hierarchyvieweruiautomatorviewer獲取控制元件資訊方式(2)

           在上一篇我簡單的瞭解了一下hierarchyviewer和uiautomatorviewer,如需訪問,點選以下連結:        通過對hierarchyview的原始碼分析,我嘗試用java寫了一個測試工具,該測試工具簡單的實現了連線ViewServe

    android自動化測試實現長按並拖動

    android應用自動化過程中,會遇見需要長按並拖動的場景,例如類似UC瀏覽器中,長按某個導航中的圖示,使其處於可移動狀態,然後再將其移動到另一個地方,與其它導航圖示換個位置,在robotium中有個drag(float fromX, float toX, float f

    getMeasureHeightgetHeight獲取控制元件的寬

    int mHeight = main_iv_showPic.getMeasuredHeight(); int mWidth = main_iv_showPic.getMeasuredWidth(); int width = main_iv_showPic.getWidth()

    報表:JS獲取控制元件資訊時,各控制元件變數名梳理

    前面分享了在報表中需要獲取控制元件所在行號,以用來獲取所在行上的資料資訊的業務需求,在前面分享的是用按鈕控制元件用來獲取當前所在行的,當實際應用中,我們還有可能用到其他多種控制元件,如:文字控制元件、數字控制元件、密碼控制元件、下拉框控制元件、下拉複選框控制元件、單選複選框控制元件、複選框組控制元件

    【Appnium+C#+Winform自動化測試系列】一、獲取本機連接的設備、啟動多個Appnium獲取本機啟動的Appnium

    net 系列 () 定向 目的 res listening toa 路徑     本系列內容,準備根據所完成的項目為基線,一步一步的把整個設計和實現過程梳理。 先從基本的一些環境問題入手,梳理清楚關於手機設備和Appnium。因為我們在後面的建立Appnium連接時,需要

    Android單元測試AndroidJUnit4獲取context

    在AndroidJUnit4直接通過getContext()獲取到的context並不是當前APP的context,而是instrumentation的context,應使用以下方法來獲取context。 InstrumentationRegistry.getInstrum

    如何找到自動化測試的思路理解自動化測試過程的問題

        要找到自動化測試的思路,首先得明確自動化測試的本質。對自動化測試的本質的理解不同,導致了在進行自動化測試過程中對於組建團隊、制定目標計劃等的不同,決定了最終自動化測試的實施和效果的不同。所以必須先把自動化測試的本質說明白。     談本質的問題,每個人的理解是不盡相

    android在OnCreate獲取控制元件的寬度高度

    在Android中,有時需要對控制元件進行測量,得到的控制元件寬度和高度可以用來做一些計算。在需要自適應螢幕的情況下,這種計算就顯得特別重要。另一方便,由於需求的原因,希望一進入介面後,就能得到控制元件的寬度和高度。 可惜的是,根據我的驗證,利用網上轉載的那些方法在OnCr

    APP測試iOSAndroid的區別

    安卓 mar 魅族 有一個 物體 mage 分享 卡頓 進行 一、常識性區別 二、導航方式 iOS:Tab放在頁面底部,不能通過滑動來切換,只能點擊。也有放在上面的,也不能滑動,但有些Tab本身可以滑動,比如天貓的。還有新聞類的應用。 Android:一般放在頁面頂端

    自動化測試獲取頁面元素

    到目前為止也只做了幾個月測試,自動化測試指令碼寫了不超過十個。但是藉助公司原有的框架,感覺還是學到很多東西,有必要整理記錄。 1.普通的html標籤: 通過id, xpath即可得到。 2.偽元素:即緊跟在標籤之後的:before, :after 等元素,有時候某些驗

    關於Android自動化測試MonkeyMonkeyRunner不能正常執行的說明

    前言: 哈嘍,感謝一直關注和支援我的人,好久沒更新部落格了,今天逛了一下發現多了很多關注。所以寫篇部落格壓(填)壓(下)驚(坑)! 前段時間看了一本騰訊出的自動化測試Android的書籍,至於為什麼會看書,因為最近窮。古人云:“書中自有黃金屋”。看完後還是窮,不知道是不是看

    學習android自動化測試遇見的問題及解決辦法總彙

    一、如何在eclipse匯入ApiDemos程式呢? 網上關於android自動化測試中大部分涉及的例子為ApiDemos程式,所以也想執行一下ApiDemos看看效果。一開始都不知道ApiDemos在哪,經過百度才知道在sdk目錄下的sample目錄下,有了原始碼後,第二

    Android自動化測試探索(三)Android SDK tools安裝、aapt配置以及使用aapt獲取apk包名

    Android SDK tools安裝 下載連線: https://www.androiddevtools.cn 找到對應mac的版本下載安裝即可   AAPT配置 #1. 進入根目錄 cd ~  #2. 開啟.bash_profile,  如

    Android自動化測試遇到的問題及解決方法(1)

    粘貼 png family 學習 再次 jmeter log 初始 mage 編者按:本文是小小小提姆在使用自動化測試工具TestWriter時的一點使用心得~我叫小小小提姆,是一名在IT行業的洪流中力爭上遊的軟件測試員,個人軟件測試擅長方向:1、功能測試(熟悉Fiddle

    Android 自動化測試

    unicode lac 回調 工作 info 部分 字段 結束 itl Python +Android +uiautomator test 在init中定義的方法 uiautomator 該模塊是android的一個python包裝uiautoma

    android 自動化測試案例之 MonkeyScript

    時間 運行 nbsp speed sources patch html 搜索功能 net #文件名 MonkeyScript.mks #功能: 使用monkey script測試app,此案例是測試搜索功能(輸入關鍵字,然後點擊搜索按鈕)#參考: http://blog.

    性能測試TPS並發用戶數

    lr並發用戶數:是指現實系統中操作業務的用戶,在性能測試工具中,一般稱為虛擬用戶數(Virutal User)。並發用戶數和註冊用戶數、在線用戶數的概念不同,1、並發用戶數一定會對服務器產生壓力的,2、而在線用戶數只是 ”掛” 在系統上,對服務器不產生壓力,3、註冊用戶數一般指的是數據庫中存在的用戶數。TPS

    Android自動化測試-UiAutomator環境搭建

    ini runner 代碼 imp event before image lap interrupt Android自動化測試-UiAutomator環境搭建 一、環境準備   1. 安裝android sdk,並配置環境變量   2. 安裝android studio,國

    Android 自動化測試 Emmagee

    指定 hub .com 開始 加載 cpu使用率 性能測試 流量 and Emmagee 是一個性能測試小工具 用來監控指定被測應用在使用過程中占用機器的CPU, 內存,流量資源的性能小工具 Emmagee 介紹 Emmagee是網易杭州研究院QA團隊開發的一個簡單易上