Monkey-如何讓monkey不要亂點?

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亂點也能拉回去了呢,<(* ̄▽ ̄*)/

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章