1. 程式人生 > >Android自動化測試之Monkeyrunner解決ID重複問題

Android自動化測試之Monkeyrunner解決ID重複問題

原文:

時光過得太快了,一晃離上一篇monkeyrunner系列的部落格已經一年多了。這一年多時間經歷了太多改變,一直沒時間好好去總結和分享。直到今天在微博上和朋友聊到monkeyrunner,才想起趁這個機會再總結一下之前所積累的一些經驗和技巧,在這裡再次和大家分享下,也算是將這個從零開始系列再進一步,呵呵。 

現在說起Android端的功能自動化測試工具,其實還是蠻多的了,像很早就風靡的Robotium,後起之秀Uiautomator,跨平臺的appium等,幾乎從工具這個層面還是可以滿足大家的要求了。MonkeyRunner作為其中的一員,其實並不能算是特別好用的一款,我平時用得就不多。因為畢竟從SL4A衍生出來,不是基於Android的直系血親Instrumentation,天生就有執行速度慢,容易出錯,可用的介面少等缺點,可謂是有點“先天不足”。當然優點還是有的,比如基於Jython語言來編寫,語法簡單易學,可以跨應用,可以直接以ID來操作測試,不需要簽名等其他工具不具有的一些特點,所以有時也有它的用武之地,大家

學習和掌握它之後應該也有一些機會是可以用到它的,緊急時候救救急啥的也還不錯。 

既然Monkeyrunner先天不足,如果想要讓它好用的話,那當然就只能後天補足了。前段時間在網上找到一個非常強大的monkeyrunner的第三方庫wrapEasyMonkey,是基於EasyMonkeyDevice來二次封裝的,並加入了自動異常處理、失敗重試、case管理、斷言、獲取控制元件上的文字等,大大增強了monkeyrunner本來的功能,使得monkeyrunner強大了不止一個級別。除了執行還是比較慢這個沒法解決之外,可以說其他的幾乎都有了較大的改善。說句實話,原生monkeyrunner幾乎沒法直接使用。所以建議選用monkeyrunner作為自己的測試工具的童鞋,都可以去找找這個包來用用,確實挺好用的。具體的用法我這裡就不囉嗦了,作者的教程還是寫得蠻細的,相信有一定python基礎的童鞋都應該看得懂。但在這裡,我想重點分享的還不止這個第三方包,還有我個人對這個包的一些改進的想法。在wrapEasyMonkey的作者提供的包裡,很多方法都是根據控制元件ID來操作的,比如getView(self,id)。但經常做Android自動化測試的朋友肯定都知道這裡有個問題,很多時候我們的app裡的控制元件要麼沒有ID,要麼ID值就是重複的。在這種情況下,根據ID肯定是無法獲取到這個控制元件的引用的。那麼怎麼辦呢?我當時也是為這個問題非常地苦惱,但後來我仔細研究了Hierarchy Viewer得到的控制元件樹形圖,其實我們完全可以基於每個控制元件所在的子節點的位置,結合python函式的不定引數的特性,去獲取任意已知ID的父節點的任意子節點的引用,然後再用這個引用作為引數去獲取其對應的文字、斷言等等,就方便多了,再也不會受到沒有ID或者是ID重複的限制了。當然,要達到這樣的功能需要修改原來那個包裡的部分函式。


這裡我舉個實際例子來說明一下吧。假如我們現在就來測試一下Android自帶的contact聯絡人那個app,假設我們先加上了一個聯絡人,現在我們用monkeyrunner來驗證一下我們加入的聯絡人的資訊是否正確。這裡實際上就涉及到幾個比較重要的操作:1. 獲取對應的控制元件 2. 判斷上面的文字是否和預期一致,也就是下面圖上三個紅色框所表示的部分。hierarchy viewer裡的完整的圖比較大,這裡顯示不了,所以大家可以自己通過這個hierarchy viewer來看看。



通過hierarchy viewer裡顯示的樹形結構來看,這裡顯示電話號碼158xxxxxxxx的控制元件和郵箱地址[email protected]
的控制元件ID都為text2,很明顯,重複了。所以沒法用原包裡的getView(self,id)方法來獲取這個view的引用。那是不是就沒辦法了呢?其實我們可以換個角度來看,即不從ID角度,而是從這個控制元件樹的節點角度來思考如何獲得控制元件的引用。我們可以看到在hierarchy viewer圖中的每個控制元件所對應的框形中,右下角都有一個數字,如下圖中紅色框中的0和1所示。





其實這個數字就是該控制元件在同級兄弟節點中的索引值,我們知道這個索引值後,就可以根據parentView.children[index]屬性來獲取任意父節點所對應的子節點的物件引用。其中的parentView可以是樹形圖中有有效ID的任意父節點,然後利用python函式的可變引數列表特性來傳入所需控制元件的索引列表即可構造出得到任意節點引用的字串,從而得到其引用。核心程式碼如下:

def getChildView(self, parentId, *childSeq):
    hierarchyViewer = self.device.getHierarchyViewer()
    str_getchildview="hierarchyViewer.findViewById('" + parentId +"')"   
    for index in childSeq:      
        str_getchildview+=('.children[' + str(index) + ']')        
    exec 'child_view=' + str_getchildview
    return child_view

現在我們來看看這段程式碼如何使用。比如我們剛剛那個聯絡人的詳細資訊介面的聯絡人號碼控制元件的hierarchy viewer截圖如下:



聯絡人號碼控制元件的物件引用可由這個語句獲得:phone_number=device.getChildView('id/contact_data', 0, 0, 1, 0)。其中“contact_data”這個是其父物件的ID,這個ID必須符合兩個條件,即有效和唯一。通過這個ID,我們就可以得到它的任意子孫節點的引用,0,0,1,0則是聯絡人控制元件在物件樹中的索引鏈上的位置,大家對照著圖應該很容易理解。有了這個引用之後,我們就比較好對所有以ID作為引數的方法來做改造了,你想改哪個就改哪個。這裡我舉個例子,比如原來wrapEasyMonkey包裡有個方法是用來取得控制元件上的文字的getTextById(self,id),這也是我們要驗證文字時所必須要用到的方法。但如上圖所示,其實聯絡人的控制元件的ID是有重複的(跟郵箱地址那個控制元件的ID重複),我們不可能用這個重複的ID去呼叫getTextById方法,所以我們就只能根據剛剛我寫的那個方法來先得到聯絡人控制元件的引用,再將獲取文字這個方法改成根據傳view的引用來獲取文字。核心程式碼如下:

def getText(self,view):
    if view != None:       
         return (view.namedProperties.get('mText').toString().split('=')[1]).encode('utf8')

這下就要靈活很多了,就算你要獲取那個物件沒有ID或者ID是重複的,都不影響你的操作,因為它在物件樹中的位置不可能重複,呵呵。 

好了,這次就說這麼多了吧。這裡我只是就我自己的一些想法和感受寫一些拋磚引玉的文字,有不對的地方歡迎各位指正,當然也歡迎各位看官提出更多的想法,一起來改進我們的工具,將Android平臺的自動化做得更好,呵呵。

相關推薦

Android自動化測試Monkeyrunner解決ID重複問題

原文: 時光過得太快了,一晃離上一篇monkeyrunner系列的部落格已經一年多了。這一年多時間經歷了太多改變,一直沒時間好好去總結和分享。直到今天在微博上和朋友聊到monkeyrunner,才想起趁這個機會再總結一下之前所積累的一些經驗和技巧,在這裡再次和大家分享下

Android自動化測試Monkeyrunner從零開始

控制 麻煩 關於 人員 bsp android開發 直接 記錄 自動 最近由於公司在組織一個Free CoDE的項目,也就是由大家自己選擇研究方向來做一些自己感興趣的研究。由於之前我學過一點點關於android的東西,並且目前android開發方興未艾如火如荼,但自動化測試

Android自動化測試——MonkeyRunner(1)

一、MonkeyRunner是什麼 MonkeyRunner是使用Jython(使用Java程式語言實現的Python)寫出來的,它提供了多個API,通過monkeyrunner API 可以寫一個Python的程式來模擬操作控制Android裝置app,測試其穩定性並通過截圖可以方便地記錄出現的問題。

Android自動化測試——MonkeyRunner(2)

一、MonkeyRunner API MonkeyRunner API包含了三個模組在com.android.monkeyruner包中: 1、MonkeyRunner 一類用於MonkeyRunner程式的實用方法。該類提供了一種將MonkeyRunner連線到裝置或模擬器的方法。它還提供了為monk

Android自動化測試——MonkeyRunner(3)

本文主要介紹MonkeyDevice的方法。 上文中,使用MonkeyRunner方法連線裝置並返回一個MonkeyDevice物件,使用該物件呼叫MonkeyDevice方法可實現對裝置的操作。主要包括:點選、拖拽、截圖、按鍵、輸入內容 一、常量 MonkeyDevice的touch()、press(

Android自動化測試Monkeyrunner 指令碼編寫

# File:   Test1.py# Vision: V1.0# Author: Findyou# 引入本程式所用到的模組from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage# 連線手機裝置device = 

Android-自動化測試MonkeyRunner教程(詳細)

# File:   Test1.py# Vision: V1.0# Author: Findyou# 引入本程式所用到的模組from com.android.monkeyrunner import MonkeyRunner, MonkeyDevice, MonkeyImage# 連線手機裝置device

Android自動化測試Monkeyrunner使用方法及例項

目前android SDK裡自帶的現成的測試工具有monkey 和 monkeyrunner兩個。大家別看這倆兄弟名字相像,但其實是完完全全不同的兩個工具,應用在不同的測試領域。總的來說,monkey主要應用在壓力和可靠性測試上,執行該命令可以隨機地向目標程式傳送各種模擬鍵

android自動化測試MonkeyRunner使用例項(三)

一、使用CMD命令開啟模擬器 執行monkeyrunner之前必須先執行相應的模擬器或連上裝置,不然monkeyrunner無法連線裝置。 1.1  用Elipse開啟Android模擬器或在CMD中用Android命令開啟模擬器。 1.2  這裡重點講一下在CMD

Android自動化測試Monkey使用

      Mokey是Android中的一個命令列工具,可以執行在模擬器裡或實際裝置中。它向系統傳送偽隨機的使用者事件流(如按鍵輸入、觸控式螢幕輸入、手勢輸入等),實現對正在開發的應用程式進行壓力

android自動化測試單元測試例項 .

這樣,在啟動程式的時候就會先啟動一個Application,然後在此Application執行過程中根據情況載入相應的 Activity,而Activity是需要一個介面的。但是Instrumentation並不是這樣的。你可以將Instrumentation理解為一種沒有圖形介面的,具有啟動能力的,用於監控

android 自動化測試Robotium 測試apk時遇到的問題

1.執行測試工程時提示:         Test run failed: Permission Denial: starting instrumentation ComponentInfo{com.example.androidcalculator.test/andro

Android自動測試monkeyrunner工具

monkeyrunner工具  前言: 最近開始研究Android自動化測試方法,對其中的一些工具、方法和框架做了一些簡單的整理,其中包括android測試框架、CTS、Monkey、Monkeyrunner、benchmark、其它test tool等等。因接觸時間

Android自動化測試工具MonkeyRunner

                                          monkeyrunner工具  前言: 最近開始研究Android自動化測試方法,對其中的一些工具、方法和框架做了一些簡單的整理,其中包括android測試框架、CTS、Monke

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

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

android 自動化測試案例 MonkeyScript

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

Android 測試 MonkeyRunner

The bsp 目的 基於 connect 結束 什麽 交互式 screen 一、什麽是MonkeyRunner monkeyrunner工具提供了一個API,使用此API寫出的程序可以在Android代碼之外控制Android設備和模擬器。通過monkeyrunner,您

Android自動化測試手段Monkey(adb shell monkey)

android monkey原始碼下載見:http://fanfq.iteye.com/blog/781694 Monkeyrunner在這裡:http://www.51testing.com/html/59/n-242759.html ================

Appium+Python 自動化測試二:啟動APP(Android篇)

android版本 inf 環境 哪些 aapt code div port ons 前一篇寫了環境安裝,這篇記錄是記錄如何啟動APP以及啟動APP之前要做哪些事。 Appium 啟動APP至少需要5個參數,分別是‘platformName‘,‘platformVersio

5.2Appium移動端自動化測試連線Android模擬器

這裡大家先去下載一個夜神模擬器 1.aapt 環境變數配置  D:\androidsdk\android-sdk-windows\build-tools\24.0.0 目錄下找到aapt.exe,將這個路徑設定環境變數,新增到 path 下 --- 開啟 cmd。輸入 aapt