# This Python file uses the following encoding: utf-8
from com.android.monkeyrunner import MonkeyRunner,MonkeyDevice
from com.android.monkeyrunner.easy import EasyMonkeyDevice #提供了根據ID進行訪問
from com.android.monkeyrunner.easy import By #根據ID返回PyObject的方法
device=MonkeyRunner.waitForConnection()
device.startActivity(component="com.example.android.apis/com.example.android.apis.ApiDemos")
easy_device=EasyMonkeyDevice(device)#必須在activity啟動之后
#登錄界面,點擊賬號輸入框
easy_device.touch(By.id('id/text1'),MonkeyDevice.DOWN_AND_UP)
轉載部分知識:
http://www.cnblogs.com/yanghj010/p/4670292.html
一:直接在shell命令下輸入以下命令;
命令說明
device=MonkeyRunner.waitForConnection() #連接手機設備
device.installPackage("../samples/android-10/ApiDemos/bin/Apidemos.apk") #安裝apk包到手機設備。
啟動其中的任意activity了,只要傳入package和activity名稱即可。命令如下:
device.startActivity(component="com.example.android.apis/com.example.android.apis.ApiDemos")
此時模擬器會自動打開ApiDemos這個應用程序的主頁。
device.reboot() #手機設備重啟
device.touch(300,300,'DOWN_AND_UP')
MonkeyRunner.alert("hello")#在emulator上會彈出消息提示
device.press('KEYCODE_HOME',MonkeyDevice.DOWN_AND_UP)
device.type('hello')#向編輯區域輸入文本'hello'
二:將以下命令寫到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
三 、MonkeyRunner語法
3.1 monkeyrunner
monkeyrunner工具提供了一個API,運用該API編寫的程序可以不用通過android代碼來直接控制android設備和模擬器,我們可以寫一個python程序對android應用程序或測試包進行安裝、運行、發送模擬擊鍵,對用戶界面進行截圖並將截圖存儲在workstation上等操作。monkeyrunner工具的主要設計目的是用於測試application/framework層上的應用程序和設備、或用於運行單元測試套件,也可以用於其它目的。
3.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中。
3.3 運行monkeyrunner
可以直接使用一個代碼文件運行monkeyrunner,抑或在交互式對話中輸入monkeyrunner語句。不論使用哪種方式,你都需要調用SDK目錄的tools子目錄下的monkeyrunner命令。如果提供一個文件名作為運行參數,則monkeyrunner將視文件內容為python程序,並加以運行;否則,它將提供一個交互對話環境。
3.4 monkeyrunner命令語法
monkeyrunner -plugin <plugin_jar> <programe_filename> <programe_option>
3.5 monkeyrunner API
主要包括三個模塊
1、MonkeyRunner:這個類提供了用於連接monkeyrunner和設備或模擬器的方法,它還提供了用於創建用戶界面顯示提供了方法。
2、MonkeyDevice:代表一個設備或模擬器。這個類為安裝和卸載包、開啟Activity、發送按鍵和觸摸事件、運行測試包等提供了方法。
3、MonkeyImage:這個類提供了捕捉屏幕的方法。這個類為截圖、將位圖轉換成各種格式、對比兩個MonkeyImage對象、將image保存到文件等提供了方法。
3.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')
3.7 向設備或模擬器安裝要測試的APK
device.installPackage('myproject/bin/MyApplication.apk') #參數是相對或絕對APK路徑
路徑級別用“/”,不能用“\”,比如d:\www\a.apk,而應該寫成d:/www/a.apk
安裝成功返回true,此時查看模擬器我們可以在IDLE界面上看到安裝的APK的圖標了。
3.8 從設備中刪除指定的軟件包,包括其相關的數據和調整緩存
device.removePackage('myproject/bin/MyApplication.apk')
刪除成功返回true。
3.9 啟動任意的Activity
device.startActivity(component="your.www.com/your.www.com.TestActivity")
或者
device.startActivity(component="your.www.com/.TestActivity")
此時可以向模擬器發送如按鍵、滾動、截圖、存儲等操作了。
執行一個adb shell命令,並返回結果,如果有的話
device.shell("...")
3.10 暫停目前正在運行的程序指定的秒數
MonkeyRunner.sleep(秒數,浮點數)
3.11 捕捉屏幕寫入文件
獲取設備的屏蔽緩沖區,產生了整個顯示器的屏蔽捕獲。(截圖)
result=device.takeSnapshot()
返回一個MonkeyImage對象(點陣圖包裝),我們可以用以下命令將圖保存到文件
result.writeToFile('takeSnapshot\\result1.png','png')
MonkeyImage.writeToFile(參數1:輸出文件名,也可以包括路徑,參數2:目標格式)
寫成功返回true,否則返回false
3.12 type
鍵盤上的類型指定的字符串,這相當於要求每個字符串中的字符按(鍵碼,DOWN_AND_UP).
字符串發送到鍵盤
device.type('字符串')
3.13 喚醒設備屏幕(在設備屏幕上喚醒)
device.wake()
3.14 重新引導到指定的引導程序指定的設備
device.reboot()
3.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