1. android-sdk
下載地址:http://www.android-doc.com/sdk/index.html
下載完成后,只需要解壓就可以(注意解壓的路徑不可以有中文和空格),但是android-sdk的運行需要java虛擬機的支持及JDK,所以在使用android-sdk時需要先安裝JDK,JDK是否有安裝可以在自己電腦C:\ProgramFiles\Java 路徑下查看是否有jdk和jre兩個文件夾,如果有就代表已經安裝好了(有可能安裝在其它文件夾),JDK的安裝請自行下載並安裝。
2. 配置python環境
python用於支持Monkeyrunner運行,使用python腳本編寫用例會大大簡化Monkeyrunner用例的編寫,且會幫助擴展monkeyrunner的自動化功能,Python請自行下載並安裝。
(1)配置Eclipse的python插件
下載1(最新版):http://pan.baidu.com/s/1c0ivWFQ
下載2:http://sourceforge.net/projects/pydev/files/pydev/
官方:http://pydev.org/download.html
目前最新版本:https://sourceforge.net/projects/pydev/files/pydev/PyDev%203.9.0/PyDev%203.9.0.zip/download?use_mirror=jaist&r=&use_mirror=jaist
然后覆蓋將plugins目錄和features目錄下所有文件挪到Eclipse的相應目錄下,
或者點擊Eclipse環境,點擊help->Install New Software, 在彈出界面中選擇add按鈕:Name隨便起, http://pydev.org/updates或者http://pydev.org/nightly
(2)下載python編輯器:
下載地址:https://www.python.org/或者http://pan.baidu.com/s/1hqIL9sC
下載完python-3.4.2.amd64.msi安裝,默認地址不修改
檢驗python是否安裝配置成功,打開cmd,輸入python,如果出現以下界面,則說 明你的python安裝成功了,見(圖3)
(3)配置 PyDev
安裝好 PyDev 之后,需要配置 Python/Jython 解釋器,配置過程很簡單。
在 Eclipse 菜單欄中,選擇 Window > Preferences > Pydev > Interpreter - (Python/Jython),在這里配置 Python/Jython 解釋器,下面以 Python 為例介紹如何配置。
首先需要添加已安裝的解釋器。這里,Python 安裝在 C:\Python25 路徑下。單擊 New,選擇 Python 解釋器 python.exe,打開后顯示出一個包含很多復選框的窗口,選擇需要加入系統 PYTHONPATH 的路徑,單擊 Ok。
或者點擊Auto Config,自動搜索Python,配置完成如(圖9),點擊OK。
接下來,檢查一下配置的結果是否正確。
在 System PYTHONPATH 里,檢查是否包含配置過程中加入的那些路徑。這里列出了所有的系統所需的庫文件夾。
另外,在 Forced builtin libs 里,列出了 Python 的內置庫。對於 Python 而言,這樣的內置庫大約有50個,而對於 Jython 來說,則有30個左右。
這樣,Python 解釋器就配置好了。
- print("hello world!")
KeyError: 'sitecustomize'
hello world!”
3. 設置環境變量
在用戶變量里面新建一個PATH,把android-sdk、jdk、python的安裝路徑添加進去;
比如:
C:\android-sdk\tools;C:\androidsdk\platform-tools; C:\Python33;C:\ProgramFiles\Java\jdk1.7.0_10\bin
4.環境檢查
安裝完成后在cmd窗口下面分別輸入java –version、python和monkeyrunner檢查是否正確安裝,如下圖所示:
轉自:http://blog.csdn.net/shy871265996/article/details/9420819
二、什么是monkeyrunner
monkeyrunner工具提供了一個API,使用此API寫出的程序可以在Android代碼之外控制Android設備和模擬器。通過monkeyrunner,您可以寫出一個Python程序去安裝一個Android應用程序或測試包,運行它,向它發送模擬擊鍵,截取它的用戶界面圖片,並將截圖存儲於工作站上。monkeyrunner工具的主要設計目的是用於測試功能/框架水平上的應用程序和設備,或用於運行單元測試套件,但您當然也可以將其用於其它目的。
三、monkeyrunner工具同Monkey工具的差別
Monkey:
Monkey工具直接運行在設備或模擬器的adb shell中,生成用戶或系統的偽隨機事件流。
monkeyrunner:
monkeyrunner工具則是在工作站上通過API定義的特定命令和事件控制設備或模擬器。
四、monkeyrunner的測試類型
1、多設備控制:monkeyrunner API可以跨多個設備或模擬器實施測試套件。您可以在同一時間接上所有的設備或一次啟動全部模擬器(或統統一起),依據程序依次連接到每一個,然后運行一個或多個測試。您也可以用程序啟動一個配置好的模擬器,運行一個或多個測試,然后關閉模擬器。
2、 功能測試: monkeyrunner可以為一個應用自動貫徹一次功能測試。您提供按鍵或觸摸事件的輸入數值,然后觀察輸出結果的截屏。
3、 回歸測試:monkeyrunner可以運行某個應用,並將其結果截屏與既定已知正確的結果截屏相比較,以此測試應用的穩定性。
4、 可擴展的自動化:由於monkeyrunner是一個API工具包,您可以基於Python模塊和程序開發一整套系統,以此來控制Android設備。除了使用monkeyrunner API之外,您還可以使用標准的Python os和subprocess模塊來調用Android Debug Bridge這樣的Android工具。
一、打開模擬器
運行monkeyrunner之前必須先運行相應的模擬器,不然monkeyrunner無法連接設備。
用Elipse打開Android模擬器或在CMD中用Android命令打開模擬器。這里重點講一下在CMD中用Android命令打開模擬器
命令:emulator -avd test (注意:test為虛擬設備的名稱——AVD的全稱為:Android Virtual Device,就是Android運行的虛擬設備,如下圖所示:)
上面命令中的test是模擬器名稱。使用時需要改成實際名字。(需要新建名字為test的虛擬器才能啟動成功)
如果正常,模擬器應該可以啟動起來了。
如果執行的結果出現以下錯誤內容:
- PANIC: Could not open: C:\Documents and Settings\sAdministrator\.android/avd/test.ini
如下圖所示:
原因在於你的環境變量缺少配置。請在“系統變量”中添加“ANDROID_SDK_HOME”,設置其值為“C:\Documents and Settings\Administrator”(注意:這里的值不能為C:\Documents and Settings\Administrator\.android),如下圖所示:
備注:環境變量
變量名:ANDROID_SDK_HOME
變量值:C:\Documents and Settings\Administrator
變量名:Path
變量值:%SystemRoot%\system32;%SystemRoot%;C:\Python27;C:\py;D:\android\android-sdk-windows\tools;D:\android\android-sdk-windows\platform-tools
確定后,關閉CMD窗口,重新打開CMD。執行以上命令。將會啟用模擬器。
模擬器啟動成功后,我們仍在CMD環境中操作。現在進入monkeyrunner的shell命令交互模式。
1.命令:monkeyrunner
輸入cmd,然后輸入“monkeyrunner”,
直接在shell命令下輸入:
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice 回車
OK,這步完成我們就可以利用monkeyrunner進行測試工作了。
這里有兩種方案,一是直接在shell命令下輸入以下命令;命令說明
多設備連接,device=MonkeyRunner.waitForConnection(5,"emulator-5556")
device.installPackage("C:/hao.apk")
(1)device=MonkeyRunner.waitForConnection() #連接手機設備
(2)device.installPackage("../samples/android-10/ApiDemos/bin/Apidemos.apk") #安裝apk包到手機設備。
(3)啟動其中的任意activity了,只要傳入package和activity名稱即可。命令如下:
device.startActivity(component="com.example.android.apis/com.example.android.apis.ApiDemos")
此時模擬器會自動打開ApiDemos這個應用程序的主頁。
(4)device.reboot() #手機設備重啟
(5)device.touch(300,300,'DOWN_AND_UP')
(6)MonkeyRunner.alert("hello")#在emulator上會彈出消息提示
(7)device.press('KEYCODE_HOME',MonkeyDevice.DOWN_AND_UP)
(8)device.type('hello')#向編輯區域輸入文本'hello'
2.是將以下命令寫到python文件里,例如test.py,然后我們再從命令行直接通過monkeyrunner運行它即可。
比如,我們還是用上面的例子,語法如下:monkeyrunner test.py 接下來monkeyrunner會自動調用test.py,並執行其中的語句,相當方便。
實例:test.py
- from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
- device=MonkeyRunner.waitForConnection()
- device.startActivity(component="your.www.com/your.www.com.TestActivity")
在CMD中執行
monkeyrunner test.py
可能出現錯誤“Can't open specified script file”,如下圖所示:
原因在於python腳本文件路徑不正確。你可以有以下解決辦法:
1、將test.py文件存放到monkeyrunner文件同一目錄中。可以執行:monkeyrunner test.py 調用
2、指定python文件位置。如果test.py文件在D盤根目錄下,可以這樣執行:monkeyrunner d:\test.py
3.monkey_recorder錄制monkeyrunner腳本
1. 在”D:\android\android\sdk\tools“目錄下, sdk的tools文件必須有一個monkeyrunner.bat
把腳本放在tool目錄下,monkey_recorder.py
#!/usr/bin/env monkeyrunner # Copyright 2010, The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. from com.android.monkeyrunner import MonkeyRunner as mr from com.android.monkeyrunner.recorder import MonkeyRecorder as recorder device = mr.waitForConnection(1,"emulator-5556") recorder.start(device) device.press('KEYCODE_HOME',MonkeyDevice.DOWN_AND_UP) device.press('KEYCODE_BACK',MonkeyDevice.DOWN_AND_UP) MonkeyRunner.alert("hello")
再新建一個monkey_playback.py,內容
#!/usr/bin/env monkeyrunner # Copyright 2010, The Android Open Source Project # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. import sys from com.android.monkeyrunner import MonkeyRunner from com.android.monkeyrunner import MonkeyRunner as mr # The format of the file we are parsing is very carfeully constructed. # Each line corresponds to a single command. The line is split into 2 # parts with a | character. Text to the left of the pipe denotes # which command to run. The text to the right of the pipe is a python # dictionary (it can be evaled into existence) that specifies the # arguments for the command. In most cases, this directly maps to the # keyword argument dictionary that could be passed to the underlying # command. # Lookup table to map command strings to functions that implement that # command. CMD_MAP = { 'TOUCH': lambda dev, arg: dev.touch(**arg), 'DRAG': lambda dev, arg: dev.drag(**arg), 'PRESS': lambda dev, arg: dev.press(**arg), 'TYPE': lambda dev, arg: dev.type(**arg), 'WAIT': lambda dev, arg: MonkeyRunner.sleep(**arg) } device= mr.waitForConnection(1,"emulator-5556") # Process a single file for the specified device. def process_file(fp, device): for line in fp: (cmd, rest) = line.split('|') try: # Parse the pydict rest = eval(rest) except: print 'unable to parse options' continue if cmd not in CMD_MAP: print 'unknown command: ' + cmd continue CMD_MAP[cmd](device, rest) def main(): file = sys.argv[1] fp = open(file, 'r') device = MonkeyRunner.waitForConnection() process_file(fp, device) fp.close(); if __name__ == '__main__': main()
然后執行命令:C:\Users\Administrator>monkeyrunner recorder.py
然后你需要點擊record上面的任何一個按鈕,右邊才會顯示你操作的步驟
選擇右邊列表里面的動作,點擊這里保存操作腳本
標准錄制回放腳本下載地址:http://pan.baidu.com/s/1sjHNr45
五 、MonkeyRunner語法
5.1 monkeyrunner
monkeyrunner工具提供了一個API,運用該API編寫的程序可以不用通過android代碼來直接控制android設備和模擬器,我們可以寫一個python程序對android應用程序或測試包進行安裝、運行、發送模擬擊鍵,對用戶界面進行截圖並將截圖存儲在workstation上等操作。monkeyrunner工具的主要設計目的是用於測試application/framework層上的應用程序和設備、或用於運行單元測試套件,也可以用於其它目的。
5.2 monkeyrunner為android測試提供了以下獨特的功能:
1、多設備控制:monkeyrunner API可以跨多個設備或模擬器實施測試套件。可以在同一時間接上所有設備或一次啟動全部模擬器,依據程序依次連接到每一個,然后運行一個或多個測試。也可以用程序啟動一個配置好的模擬器,運行一個或多個測試,然后關閉模擬器。
2、功能測試:monkeyrunner可以為一個應用自動貫徹一次功能測試。您提供按鍵或觸摸事件的輸入數值,然后觀察輸出結果的截屏。
4、回歸測試:monkeyrunner可以運行某個應用,並將其結果截屏與既定已知正確的結果截屏相比較,以此測試應用的穩定性。
4、可擴展的自動化:由於monkeyrunner是一個API工具包,我們可以開發基於python模塊和程式的一整套系統,以此來控制android設備。除了使用monkeyrunner API,我們還可以使用標准的python os和ubprocess模塊來調用android debug bridge這樣的android工具。如ADB這樣的android工具,也可以將自己寫的類添加到monkeyrunner API中。
5.3 運行monkeyrunner
可以直接使用一個代碼文件運行monkeyrunner,抑或在交互式對話中輸入monkeyrunner語句。不論使用哪種方式,你都需要調用SDK目錄的tools子目錄下的monkeyrunner命令。如果提供一個文件名作為運行參數,則monkeyrunner將視文件內容為python程序,並加以運行;否則,它將提供一個交互對話環境。
5.4 monkeyrunner命令語法
monkeyrunner -plugin <plugin_jar> <programe_filename> <programe_option>
5.5 monkeyrunner API
主要包括三個模塊
1、MonkeyRunner:這個類提供了用於連接monkeyrunner和設備或模擬器的方法,它還提供了用於創建用戶界面顯示提供了方法。
2、MonkeyDevice:代表一個設備或模擬器。這個類為安裝和卸載包、開啟Activity、發送按鍵和觸摸事件、運行測試包等提供了方法。
3、MonkeyImage:這個類提供了捕捉屏幕的方法。這個類為截圖、將位圖轉換成各種格式、對比兩個MonkeyImage對象、將image保存到文件等提供了方法。
5.6 導入需要的模塊
方式一:
import sys
from com.android.monkeyrunner import MonkeyRunner as mr
from com.android.monkeyrunner import MonkeyDevice as md
from com.android.monkeyrunner import MonkeyImage as mi
如果給導入的模塊起了別名,就應該使用別名,而不能使用原名,否則會出現錯誤。
比如連接設備或模擬器,起了以上別名后,命令應該如下:
device=mr.waitForConnection()
方式二:
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice,MonkeyImage
方式三:
import com.android.monkeyrunner
但是在使用時,就顯得特別麻煩
device=com.android.monkeyrunner.MonkeyRunner.waitForConnection()
方式四:
我們也可以給它一個別名
import com.android.monkeyrunner as cam
但是在使用時,就顯得特別麻煩
device=cam.MonkeyRunner.waitForConnection()
#等待連接到設備,與模擬器連接,返回monkeydevice對象,代表連接的設備。沒有報錯的話說明連接成功。
參數1:超時時間,單位秒,浮點數。默認是無限期地等待。
參數2:串deviceid,指定的設備名稱。默認為當前設備(手機優先,比如手機通過USB線連接到PC、其次為模擬器)。
默認連接:device=MonkeyRunner.waitForConnection()
參數連接:device = mr.waitForConnection(1.0,'emulator-5554')
5.7 向設備或模擬器安裝要測試的APK
device.installPackage('myproject/bin/MyApplication.apk') #參數是相對或絕對APK路徑
路徑級別用“/”,不能用“\”,比如d:\www\a.apk,而應該寫成d:/www/a.apk
安裝成功返回true,此時查看模擬器我們可以在IDLE界面上看到安裝的APK的圖標了。
5.8 從設備中刪除指定的軟件包,包括其相關的數據和調整緩存
device.removePackage('myproject/bin/MyApplication.apk')
刪除成功返回true。
5.9 啟動任意的Activity
device.startActivity(component="your.www.com/your.www.com.TestActivity")
或者
device.startActivity(component="your.www.com/.TestActivity")
此時可以向模擬器發送如按鍵、滾動、截圖、存儲等操作了。
執行一個adb shell命令,並返回結果,如果有的話
device.shell("...")
5.10 暫停目前正在運行的程序指定的秒數
MonkeyRunner.sleep(秒數,浮點數)
5.11 捕捉屏幕寫入文件
獲取設備的屏蔽緩沖區,產生了整個顯示器的屏蔽捕獲。(截圖)
result=device.takeSnapshot()
返回一個MonkeyImage對象(點陣圖包裝),我們可以用以下命令將圖保存到文件
result.writeToFile('takeSnapshot\\result1.png','png')
MonkeyImage.writeToFile(參數1:輸出文件名,也可以包括路徑,參數2:目標格式)
寫成功返回true,否則返回false
5.12 type
鍵盤上的類型指定的字符串,這相當於要求每個字符串中的字符按(鍵碼,DOWN_AND_UP).
字符串發送到鍵盤
device.type('字符串')
5.13 喚醒設備屏幕(在設備屏幕上喚醒)
device.wake()
5.14 重新引導到指定的引導程序指定的設備
device.reboot()
5.15 touch、press
在指定位置發送觸摸事件(x,y的單位為像素)
device.touch(x,y,TouchPressType-觸摸事件類型)
發送到指定鍵的一個關鍵事件
device.press(參數1:鍵碼,參數2:觸摸事件類型)
參數1:見android.view.KeyEvent
參數2,如有TouchPressType()返回的類型-觸摸事件類型,有三種。
1、DOWN 發送一個DOWN事件。指定DOWN事件類型發送到設備,對應的按一個鍵或觸摸屏幕上。
2、UP 發送一個UP事件。指定UP事件類型發送到設備,對應釋放一個鍵或從屏幕上抬起。
3、DOWN_AND_UP 發送一個DOWN事件,然后一個UP事件。對應於輸入鍵或點擊屏幕。
以上三種事件做為press()或touch()參數。原英文如下:
use this with the type argument of press() or touch() to send a down event.
為了模擬輸入鍵,發送DOWN_AND_UP。
參數1的部分具體內容邏輯:
按下HOME鍵 device.press('KEYCODE_HOME',MonkeyDevice.DOWN_AND_UP)
按下BACK鍵 device.press('KEYCODE_BACK',MonkeyDevice.DOWN_AND_UP)
按下下導航鍵 device.press('KEYCODE_DPAD_DOWN',MonkeyDevice.DOWN_AND_UP)
按下上導航鍵 device.press('KEYCODE_DPAD_UP',MonkeyDevice.DOWN_AND_UP)
按下OK鍵 device.press('KEYCODE_DPAD_CENTER',MonkeyDevice.DOWN_AND_UP)
device.press('KEYCODE_ENTER',MonkeyDevice.DOWN_AND_UP)#輸入回車
device.press('KEYCODE_BACK',MonkeyDevice.DOWN_AND_UP)#點擊返回
home鍵 KEYCODE_HOME
back鍵 KEYCODE_BACK
send鍵 KEYCODE_CALL
end鍵 KEYCODE_ENDCALL
上導航鍵 KEYCODE_DPAD_UP
下導航鍵 KEYCODE_DPAD_DOWN
左導航 KEYCODE_DPAD_LEFT
右導航鍵 KEYCODE_DPAD_RIGHT
ok鍵 KEYCODE_DPAD_CENTER
上音量鍵 KEYCODE_VOLUME_UP
下音量鍵 KEYCODE_VOLUME_DOWN
power鍵 KEYCODE_POWER
camera鍵 KEYCODE_CAMERA
menu鍵 KEYCODE_MENU
更多:http://developer.android.com/reference/android/view/KeyEvent.html