日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > Android >内容正文

Android

使用Monkeyrunner进行Android自动化的总结

發(fā)布時間:2023/12/20 Android 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用Monkeyrunner进行Android自动化的总结 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

使用Android自動化的方式,不僅可以用來對Android APP進行自動化測試,同樣可以用來進行一些其他非常有意思的自動化任務(wù).常用的自動化工具有Monkeyrunner, Robotium, Appium等.Monkeyrunner是Android自帶的自動化測試工具,允許用戶對Android設(shè)備的UI界面進行元素提取,執(zhí)行touch和drag等操作,配合HierarchyViewer等模塊可以非常方便地進行自動化操作.

首先,用戶需要安裝好Android開發(fā)環(huán)境,同時運行Monkeyrunner腳本需要安裝Jython環(huán)境.Jython允許使用Python的語法格式來編寫自動化測試代碼,因此對于Python開發(fā)者而言非常有優(yōu)勢.Python中的一些個別模塊不能直接用于Jython中,這時就需要安裝適用于Jython版本的,具體方法可參考

?

http://stackoverflow.com/questions/3256135/importing-python-modules-in-jython. 如安裝bottle模塊, jython ez_setup.py bottle,然后在使用時導(dǎo)入該模塊即可.

?

?

import sys sys.path.append('/home/jython2.5.3/Lib/site-packages/bottle-0.12.7-py2.5.egg') from bottle import Bottle, run, request, response, get, post 使用Monkeyrunner進行Android自動化大概可以分為以下幾種類型的操作:設(shè)備及UI界面操作,UI界面元素提取,截圖對比等.

?

1, 設(shè)備及UI界面操作

其實,涉及到Android設(shè)備的操作,使用開發(fā)環(huán)境自帶的adb已經(jīng)足夠了,而Monkeyrunner也是將adb操作封裝了以下而已.常見adb操作如下:

?

adb install xxx.apk 安裝apk文件adb shell am start -an com.xxx.xxx/.MainActivity 啟動APPadb shell am force-stop com.xxx.xxx 停止該APPadb shell input keyevent KEYCODE_HOME 模擬Android的HOME按鍵adb -s emulator-5554 shell input text test_to_input 針對特定的一個模擬器進行操作adb shell input tap x y 模擬屏幕touch操作adb shell input swipe x1 y1 x2 y2 模擬屏幕滑動操作adb devices 查看所有在線的Android設(shè)備.

?

詳細(xì)的adb命令,可以通過adb -h來查詢.而Monkeyrunner中對設(shè)備的操作如下:

?

from com.android.monkeyrunner import MonkeyRunner,MonkeyDevicedevice = MonkeyRunner.waitForConnection(5,"emulator-5554")device.shell("am start -an com.xxx.xxx/.MainActivity")device.touch(250, 450, 'DOWN_AND_UP')device.drag((1080/2, 1700),(1080/2, 400),0.5,1)device.type("text to type")device.shell("input text" + "text to input")device.press("KEYCODE_HOME")# 另外,也可以通過id來進行touch操作,此時可以引入By模塊,可以非常方便通過id尋找對應(yīng)的元素.from com.android.monkeyrunner.easy import EasyMonkeyDevice, Byeasy_device = EasyMonkeyDevice(device)easy_device.touch(By.id('id/button1'), easy_device.DOWN_AND_UP) 以上方式其實與adb shell的操作是一致的,只是方便用戶在Jython腳本文件中調(diào)用而已.

?

2, UI界面元素提取

Monkeyrunner可以通過HierarchyViewer來對UI界面的元素進行解析,解析的結(jié)果與DDMS及Android Studio中的Android Device Monitor保持一致.

首先需要先對UI界面進行解析,然后即可通過元素id和其他的屬性來提取該元素,并對其所有屬性進行解析.

?

from com.android.monkeyrunner import MonkeyRunner, MonkeyDevicefrom com.android.chimpchat.hierarchyviewer import HierarchyViewerdevice = MonkeyRunner.waitForConnection(5,"emulator-5554")hViewer = device.getHierarchyViewer() # 對當(dāng)前UI視圖進行解析content = hViewer.findViewById('id/content') # 通過id查找對應(yīng)元素memberView = content.children[0]text = memberView.namedProperties.get('text:mText').value.encode('utf8')desc = memberView.namedProperties.get('accessibility:getContentDescription()').value.encode('utf8')mleft = memberView.namedProperties.get('layout:mLeft').value.encode('utf8')height = memberView.height

?

使用HierarchyViewer來解析界面的層級關(guān)系,并根據(jù)id來查找特定元素是我們常用的做法.然而,Android APP中,會有很多元素是沒有對應(yīng)的id的(這一點,可以通過DDMS或者AVD中解析結(jié)果看出來),那么此時,我們?nèi)绻珳?zhǔn)地找到一個特定元素,就只能通過進一步解析某個元素的children來實現(xiàn),會比較麻煩,但往往是非常精準(zhǔn)的.

需要注意的是,使用HierarchyViewer并通過id來查找元素偶爾會出錯,提示找不到對應(yīng)的元素.如果遇到實在難以解析出來的元素,可以考慮使用另一個模塊AndroidViewClient進行解析.原理也很類似.甚至有時候,寫法比HierarchyViewer簡潔得多.

?

vc = ViewClient(device=device, serialno="emulator-5554")content = vc.findViewById('id/content')memberView = content.children[0]text = memberView.getText()x = memberView.getX()y = memberView.getY()height = memberView.getHeight()

?

AndroidViewClient的項目地址是https://github.com/dtmilano/AndroidViewClient.使用時候有個注意事項,我們先將AndroidViewClient寫入環(huán)境變量中,然后要先導(dǎo)入AndroidViewClient的模塊,之后再導(dǎo)入Monkeyrunner及相應(yīng)地其他模塊,否則會出現(xiàn)找不到AndroidViewClient的錯誤.至于為什么,大家可以自己嘗試一下就明白了.

?

import sysreload(sys)sys.setdefaultencoding("utf-8")ANDROID_VIEW_CLIENT_HOME = os.environ['ANDROID_VIEW_CLIENT_HOME']sys.path.append(ANDROID_VIEW_CLIENT_HOME + '/src')from com.dtmilano.android.viewclient import ViewClient, Viewfrom com.android.monkeyrunner import MonkeyRunner, MonkeyDevicefrom com.android.monkeyrunner.easy import EasyMonkeyDevice, Byfrom com.android.chimpchat.hierarchyviewer import HierarchyViewer

?

不過以上兩種方式,都有可能出現(xiàn)UI元素解析失敗的情況,原因可能是Android相應(yīng)工具自身的不完善導(dǎo)致的.因為DDMS和AVD也會經(jīng)常出現(xiàn)無法解析某個UI界面的情況.

具體的應(yīng)用場景大家自己斟酌吧,總之,能夠完美獲取到所需元素即可.

3, 截圖對比

這是Monkeyrunner非常有特色的一種方式,常用于通過設(shè)備屏幕前后的對比來獲取對執(zhí)行結(jié)果的判斷.

?

path = "/tmp/images"image = device.takeSnapshot() # 截圖image.writeToFile(path+"主頁面".decode('utf-8')+now+'.png','png')#下面就開始對之前的截圖進行對比了#去文件中找到我們要對比的圖片,與該截圖image1進行對比result = MonkeyRunner.loadImageFromFile('/tmp/images/result.png')#判斷圖片相識度是否是為90%if(image.sameAs(result,0.9)):log.write("圖片對比成功……\n")else:log.write("主頁面圖片對比失敗……\n") 以上,就是通過Monkeyrunner進行Android自動化的一些基本內(nèi)容.

?

?

下邊,將大家容易遇到的一些坑記錄下來,造福廣大人民群眾.

Monkeyrunner容易遇到的一些坑:

1, 中文輸入的問題

Monkeyrunner默認(rèn)只支持Ascii編碼,所以遇到中文,目前是不能通過adb的input和type進行輸入的.那么可以采用復(fù)制到PC剪貼板,然后到Android模擬器里邊進行粘貼的方式.

但需要注意的是,Android模擬器里邊的剪貼板的內(nèi)容是當(dāng)前PC的焦點從PC桌面環(huán)境切換到模擬器界面瞬間時的剪貼板內(nèi)容.常見情況是,通過Monkeyrunner腳本文件將PC環(huán)境中剪貼板內(nèi)容向Android模擬器粘貼時,往往會出現(xiàn)粘貼不上我們想要的內(nèi)容.此時,出于調(diào)試目的,我們會檢查在當(dāng)前PC環(huán)境的剪貼板中,是否是我們需要的內(nèi)容.然后將鼠標(biāo)焦點移入模擬器中,常常發(fā)現(xiàn)能夠粘貼上所需的正確內(nèi)容.,然而,這其實是一個時間差的原因,即PC中的剪貼板內(nèi)容正確,然后切換到模擬器界面,剪貼板內(nèi)容是從PC環(huán)境帶過來的,當(dāng)然是正確的了.相反,我們在Monkeyrunner腳本執(zhí)行后,在剪貼板操作之前即將當(dāng)前PC的焦點切換到模擬器中,會發(fā)現(xiàn)剪貼板內(nèi)容是不正確的.說得有點亂,大家可以好好琢磨,自己實踐一下.

github上有位同學(xué)寫了一個小的工具,可以非常方便地執(zhí)行Android模擬器中的剪貼板操作,https://github.com/bingwei/inputchineseviaadb.非常好用,大家可以試一試.當(dāng)然,遇到一些特殊字符,還是需要做一些簡單地轉(zhuǎn)義等操作的.

2, Monkeyrunner腳本中各個操作的耗時問題

在Monkeyrunner腳本執(zhí)行過程中,使用HierarchyViewer以及AndroidViewClient進行界面元素解析時,會發(fā)現(xiàn)findViewById操作的時間消耗很大.尤其是該UI界面上元素非常多的時候,耗時非常明顯.然而,涉及到界面切換時,我們常常會根據(jù)當(dāng)前界面中是否包含某個id的元素來判斷界面是否切換成功.那么,在大多數(shù)情況下,我們沒有必要根據(jù)id來判斷當(dāng)前界面,通過windowName = device.getHierarchyViewer().focusedWindowName()這種方式,已經(jīng)足夠我們進行絕大多數(shù)的UI界面判斷了,并且在效率上絕對不是一個數(shù)量級的提升.

3, 涉及到UI界面之間切換的算法問題

我們常常會遇到,明明就在幾個特定的UI界面之間相互切換,但由于Android自動化環(huán)境及工具自身的不穩(wěn)定性,經(jīng)常導(dǎo)致屏幕切換延遲,點擊或切換不成功,APP卡住甚至閃退等一些非常苦惱的問題.那么這就是考驗編碼能力和算法功底的時候.在這一點上,非常感謝教授同學(xué)的幫助,贊一個.

我們可以預(yù)先定義一個所有常見界面的focusdWindowName及屏幕切換所需的操作行為的結(jié)構(gòu)體,如

?

SCREEN_SWITCH_ACTION = {'Activity1': {'Activity1': None,'Activity2': ('LEFT_DOWN', 'Activity1'), # 如,從Activity2切換到Activity1需要做LEFT_DOWN的操作.'Activity3': ('LEFT_DOWN', 'Activity1'),},'Activity2': {'Activity1': ('MID_DOWN', 'Activity2'),'Activity2': None,'Activity3': ('MID_DOWN', 'Activity2'),},'Activity3': {'Activity1': ('RIGHT_DOWN', 'Activity3'),'Activity2': ('RIGHT_DOWN', 'Activity3'), 'Activity3': None,},} 如上,該字典中key是目標(biāo)屏幕,其value值即代表了從當(dāng)前屏幕切換到目標(biāo)屏幕所需的操作行為.其中,LEFT_DOWN等可以是簡單地touch一個button,也可以寫出一個負(fù)責(zé)的根據(jù)界面及元素來決定操作行為的負(fù)責(zé)操作的集合.有了如上的這種結(jié)構(gòu)體,我們只需要寫一個對應(yīng)的算法,在屏幕切換時從該結(jié)構(gòu)體中解析操作并執(zhí)行即可.諸如屏幕等待,失敗重試之類的容錯機制,都可以隨意添加了.

?

其實,涉及到這個算法層面的問題,研究和改進的空間實在是太大了.有興趣的同學(xué)可以更深入的討論,歡迎指教.

當(dāng)然,除了Monkeyrunner, Robotium和Appium等工具也都是使用率非常高的,各有優(yōu)劣吧.
以上這些,就是本次Monkeyrunner自動化的一些總結(jié),寫的比較簡略,歡迎批評指正.

?

總結(jié)

以上是生活随笔為你收集整理的使用Monkeyrunner进行Android自动化的总结的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。