monkey是隻皮猴子,是安卓中的一個UI壓力測試工具,重在測試穩定性。但是在運用monkey測試app,深受其亂點的煩惱,雖然在指定app的情況下,依然會隨機點到app外面,然後再也回不來了,大大降低了其作用。
查閱了網上不少文章,在看這篇文章的時候,突然有了點啓發https://blog.csdn.net/liyu520131414/article/details/6935777
這篇文章的思路就是在monkey在執行時候,另外開啓一個程序對其進行輪詢,如果不在指定的頁面,就隨機將它拉到app裏指定的頁面。
當然java我不太懂,只是大致看了下,在執行的時候也沒有達到理想的效果,也許是我執行的方式不對,因此參照他的思路,用python寫了個輪詢腳本,當然功能上也比他寫的縮減了不少,暫時只是對連接在電腦上一臺手機進行此操作,詳細優化步驟如下。
1.monkey腳本
先來看下原先我們執行的腳本
adb shell monkey -p cn.citytag.mapgo -s 2333 --pct-touch 70 --pct-motion 30 --ignore-crashes --ignore-timeouts --monitor-native-crashes --throttle 200 -v -v 500000 >E:\logs\monkey0903.txt
monkey命令的含義就不細說了,網上有超多文章進行了詳細解釋,綠色--pct-touch 70 --pct-motion 30這兩個命令是後面增加的,一個代表點擊,一個代表滑動,兩個加起來是100,代表不會進行其他事件操作,如軌跡事件,導航事件等等,指定這兩種操作後,就極大的降低了monkey點到被測app外面的概率
另外還是會有在執行向下滑動的命令時,打開了通知欄,然後又開始了瞎點的操作。這時可在執行monkey命令之前,先執行禁用通知欄的命令
adb shell settings put global policy_control immersive.full=*
解禁命令:adb shell settings put global policy_control null
2.python腳本
在完善了monkey腳本之後,還是會出現monkey點出去之後回不來的情況,那就寫腳本吧。
首先再一次明確目標,就是在monkey亂點點出了被測app後將其拉回來。
直接先把代碼丟上來。之前參照的文章裏面利用xml作爲配置文件,感覺挺簡單的,也就直接用了。
配置文件:config.xml
<?xml version="1.0" encoding="utf-8"?>
<config>
<!-- 包名-->
<packagename>com.alashow.live</packagename>
<!-- 主activity-->
<mainactivity>.MainActivity</mainactivity>
<!-- 白名單activity-->
<whiteactivity>
/.MainActivity,
/cn.citytag.live.view.activity.LivePlayerActivity,
/user.maopao.com.user.view.activity.mine.OthersHomePageActivity,
/cn.citytag.live.view.activity.LiveFinishActivity,
/cn.citytag.live.view.activity.LiveSearchActivity,
/cn.citytag.live.view.activity.LiveRankingActivity,
/cn.citytag.live.view.activity.LiveSubHomeActivity,
/cn.citytag.live.view.activity.family.FamilyDetailActivity,
/cn.citytag.live.view.activity.family.FamilyInformActivity,
/cn.citytag.live.view.activity.family.FamilySettingActivity,
/cn.citytag.live.view.activity.family.FamilyNoticeActivity,
/cn.citytag.live.view.activity.tribe.TribeHomeActivity,
/cn.citytag.live.view.activity.tribe.TribeWelfareActivity,
/cn.citytag.live.view.activity.tribe.TribeShopActivity,
/cn.citytag.live.view.activity.tribe.TribePackageActivity,
/user.maopao.com.user.view.activity.bill.MyIncomeTotalDetailActivity,
/cn.citytag.live.view.activity.LivePrepareActivity,
/cn.citytag.live.view.activity.LiveSongEditActivity,
/cn.citytag.live.view.activity.LiveNoticeActivity,
/cn.citytag.base.widget.pictureselector.lib.PictureSelectorActivity
</whiteactivity>
<!-- 檢查時間秒-->
<interval>30</interval>
<!-- 檢查次數-->
<count>10</count>
</config>
說明:沒什麼好說明的,都註釋出來了,就是字面意思。
python腳本:
import os
import re
import xml.dom.minidom as xmldom
import time
class Mtest():
def __init__(self):
dom = xmldom.parse('config.xml')
root = dom.documentElement
self.packagename = root.getElementsByTagName('packagename')[0].firstChild.data
self.mainactivity = root.getElementsByTagName('mainactivity')[0].firstChild.data
self.interval = int(root.getElementsByTagName('interval')[0].firstChild.data)
self.count = int(root.getElementsByTagName('count')[0].firstChild.data)
self.whiteactivity = root.getElementsByTagName('whiteactivity')[0].firstChild.data.replace('\n','').replace(' ','').split(',')
def get_now_activity(self):
os.system("adb devices")
content = os.popen('adb shell dumpsys activity |findstr "mResumedActivity" ').read() #讀取當前頁面
pattern = re.compile(r'/[a-zA-Z0-9\.]+')
alist = pattern.findall(content)
macitivity = self.packagename + '/' + self.mainactivity
excuteshell = 'adb shell am start -n'+ macitivity
if alist[0] not in self.whiteactivity:
print('當前activity:'+alist[0])
print('--------------開始返回主activity----------------')
os.system(excuteshell) #可拉回主頁面
else:
print('當前activity:'+alist[0]+'不需要返回')
def check(self):
for _ in range(self.count):
time.sleep(self.interval)
self.get_now_activity()
if __name__ == '__main__':
test = Mtest()
test.check()
python腳本這裏就要稍微說明下了:
1.這裏造了一個類,類的初始化裏將config.xml裏的內容讀取過來運用了xml的一個庫
2.get_now_activity函數的作用是獲取當前所在activity,判斷其是否在白名單裏,如果在就做操作,如果不在就拉回主頁面(當然你可以設置拉回任何頁面,甚至隨機)
os.system("adb devices") 這句不寫也沒關係,其實是獲取當前連接的手機設備信息
adb shell dumpsys activity |findstr "mResumedActivity" 這條adb命令就是獲取當前所在activity。如果你查看app的activity也很簡單,你手機連着執行這條命令就可以了,這條命令執行後大致是這樣的結果:
是不是數據不夠單純,與config.xml裏的白名單數據相比是不是多了很多東西。
pattern = re.compile(r'/[a-zA-Z0-9\.]+')
alist = pattern.findall(content)
這時候可以用正則表達式將其取出輸出alist[0],大致是這樣的:
頁面取出來之後就可以對其進行對比了,就是那個if判斷
接下來就是在判斷到activity不在白名單裏面之後,啓動指定activity 利用這個命令'adb shell am start -n'
3.最後一個函數就是利用config.xml裏的配置,設置多長時間去輪詢一次,然後一共輪詢多少次。如30s輪詢一次,那麼一個小時就能輪詢120次,假設你的monkey執行10個小時,那麼你的輪詢次數就要設置1200次。
說了這麼多,如何執行呢?
1.先執行adb monkey的命令,將monkey跑起來
2.執行python腳本
3.仔細觀察是不是就算monkey亂點也能拉回去了呢,<(* ̄▽ ̄*)/