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方法。
-
publicstatic UiAutomatorResult takeSnapshot(IDevice device, IProgressMonitor monitor)
- {
- UiAutomatorModel model;
- String msg;
- RawImage rawImage;
- if (monitor == null) {
- monitor = new NullProgressMonitor();
- }
- monitor.subTask("Checking if device support UI Automator");
- if (!(supportsUiAutomator(device))) {
- String msg = "UI Automator requires a device with API Level 16";
- thrownew com.android.uiautomator.UiAutomatorHelper.UiAutomatorException(msg, null);
- }
- monitor.subTask("Creating temporary files for uiautomator results.");
- File tmpDir = null;
- File xmlDumpFile = null;
- File screenshotFile = null;
- try {
- tmpDir = File.createTempFile("uiautomatorviewer_", "");
- tmpDir.delete();
- if (!(tmpDir.mkdirs()))
- thrownew IOException("Failed to mkdir");
- xmlDumpFile = File.createTempFile("dump_", ".uix", tmpDir);
- screenshotFile = File.createTempFile("screenshot_", ".png", tmpDir);
- } catch (Exception e) {
- msg = "Error while creating temporary file to save snapshot: " + e.getMessage();
- thrownew com.android.uiautomator.UiAutomatorHelper.UiAutomatorException(msg, e);
- }
- tmpDir.deleteOnExit();
- xmlDumpFile.deleteOnExit();
- screenshotFile.deleteOnExit();
- monitor.subTask("Obtaining UI hierarchy");
- try {
- <span style="color:#ff0000;">getUiHierarchyFile(device, xmlDumpFile, monitor);
- </span> } catch (Exception e) {
- msg = "Error while obtaining UI hierarchy XML file: " + e.getMessage();
- thrownew com.android.uiautomator.UiAutomatorHelper.UiAutomatorException(msg, e);
- }
剛開始的時候沒明白為什麼有好多定義檔案的程式碼,然後就沒管,往下看的時候發現了一個getUiHierarchyFile方法,既然在這個方法裡沒找到獲取控制元件資訊的方式,那麼我就試著去getUiherarchyFile方法中看看(其實我之前研究hierarchyviewer的時候,這個工具也用過這個getHierarchy方法,只不過叫parseHierarchy,它就是獲取控制元件樹的,所以我心中一喜,有戲) 。讓我們進入getUiHerarchyFile中看看,看能否發現我們真正需要的。
- privatestaticvoid getUiHierarchyFile(IDevice device, File dst, IProgressMonitor monitor) {
- if (monitor == null) {
- monitor = new NullProgressMonitor();
- }
- monitor.subTask("Deleting old UI XML snapshot ...");
- String command = "rm /data/local/tmp/uidump.xml";
- try
- {
- commandCompleteLatch = new CountDownLatch(1);
- device.executeShellCommand(command, new CollectingOutputReceiver(commandCompleteLatch));
- commandCompleteLatch.await(5L, TimeUnit.SECONDS);
- }
- catch (Exception e1)
- {
- }
- monitor.subTask("Taking UI XML snapshot...");
- command = String.format("%s %s %s", new Object[] { "/system/bin/uiautomator", "dump", "/data/local/tmp/uidump.xml" });
- CountDownLatch commandCompleteLatch = new CountDownLatch(1);
- try
- {
- device.executeShellCommand(command, new CollectingOutputReceiver(commandCompleteLatch), 40000);
- commandCompleteLatch.await(40L, TimeUnit.SECONDS);
- monitor.subTask("Pull UI XML snapshot from device...");
- device.getSyncService().pullFile("/data/local/tmp/uidump.xml", dst.getAbsolutePath(), SyncService.getNullProgressMonitor());
- }
- catch (Exception e) {
- thrownew RuntimeException(e);
- }
- }
- </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方法:
- publicstatic ViewNode parseViewHierarchy(BufferedReader in, Window window) {
- ViewNode currentNode = null;
- int currentDepth = -1;
- try
- {
- while ((line = in.readLine()) != null) {
-
相關推薦
android自動化測試中hierarchyviewer和uiautomatorviewer獲取控制元件資訊的方式比對
android自動化新人一個,目前研究PC端獲取android裝置的控制元件資訊有哪些方式。多多指教! android的目錄tools下有2個自帶的工具hierarchyviewer和uiautomatorviewer,開啟後,如下所示:
android自動化測試中hierarchyviewer和uiautomatorviewer獲取控制元件資訊的方式比對(2)
在上一篇我簡單的瞭解了一下hierarchyviewer和uiautomatorviewer,如需訪問,點選以下連結: 通過對hierarchyview的原始碼分析,我嘗試用java寫了一個測試工具,該測試工具簡單的實現了連線ViewServe
android自動化測試中實現長按並拖動
android應用自動化過程中,會遇見需要長按並拖動的場景,例如類似UC瀏覽器中,長按某個導航中的圖示,使其處於可移動狀態,然後再將其移動到另一個地方,與其它導航圖示換個位置,在robotium中有個drag(float fromX, float toX, float f
getMeasureHeight和getHeight獲取控制元件的寬和高
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測試中iOS和Android的區別
安卓 mar 魅族 有一個 物體 mage 分享 卡頓 進行 一、常識性區別 二、導航方式 iOS:Tab放在頁面底部,不能通過滑動來切換,只能點擊。也有放在上面的,也不能滑動,但有些Tab本身可以滑動,比如天貓的。還有新聞類的應用。 Android:一般放在頁面頂端
自動化測試中獲取頁面元素
到目前為止也只做了幾個月測試,自動化測試指令碼寫了不超過十個。但是藉助公司原有的框架,感覺還是學到很多東西,有必要整理記錄。 1.普通的html標籤: 通過id, xpath即可得到。 2.偽元素:即緊跟在標籤之後的:before, :after 等元素,有時候某些驗
關於Android自動化測試Monkey和MonkeyRunner不能正常執行的說明
前言: 哈嘍,感謝一直關注和支援我的人,好久沒更新部落格了,今天逛了一下發現多了很多關注。所以寫篇部落格壓(填)壓(下)驚(坑)! 前段時間看了一本騰訊出的自動化測試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團隊開發的一個簡單易上