首先感謝網易的各位大神,從 ATX 到 Airtest 識訓頗多
在手游中,一般新手指引都是固定的強制步驟,所以我們可以用自動點擊的方式直接跑完整個新手
現行方案
- 基于坐標(相對位置)
- 直接點擊每個步驟對應的坐標位置,每個步驟量一下坐標
- 更換不同解析度的手機,只需要計算一下,改成點擊螢屏的相對位置就行了
- 點擊坐標程序中如果遇到彈框(斷線)之類的阻礙時,沒辦法跳過
- 基于圖片
- 在當前界面搜索圖片,點擊改圖片的中心(但是圖片識別存在匹配度的問題,可能會識別的相似的圖片)
- 更換不同解析度的手機,每種解析度都需要截圖,作業量比較大(airtest 有提供縮放的方法,可以只截一種解析度)
- 點擊坐標程序中如果遇到彈框(斷線)之類的阻礙時,只需要提前截圖,在點擊程序中增加判斷
- 基于 UI
- 在當前場景內搜索 UI 物件,點擊改物件的位置(要注意條件,可能搜索條件并不是唯一;搜索到的UI也有可能并沒有顯示在螢屏內)
- 更換不同解析度的手機,不需要做其他操作
- 點擊坐標程序中如果遇到彈框(斷線)之類的阻礙時,只需要增加判斷就可以了
以上三種方法,在撰寫測驗代碼的時候都需要手動跑至少一遍新手測驗
坐標的話,需要測量計算
圖片的話,主要的作業量在截圖
UI 物件的話,只需要測需要的 UI 就可以了(可能并不需要手動跑完整個新手)
對比下來,UI 的作業量是最小的;而且以上三種方法可以結合使用
而且使用 UI 物件有個最大的優勢,可以取到游戲內的文本,可以進行更復雜的邏輯操作
代碼示例
學 ATX 時寫的基于圖片操作,完全寫死的步驟
# -*- encoding: utf-8 -*- import atx from atx.ext.report import Report # report lib import time game_name = u"xxx" 隱藏了 device_name = u"84B7N16620000490" package_name = u"xxxxx" 隱藏了 activity_name = u"xxxxx" 隱藏了 pic_url = u"C:\\Users\\HBoPRC\\xxx\\" d = atx.connect(device_name) rp = Report(d, save_dir = pic_url + "Report\\") rp.patch_uiautomator() # for android UI test record (optional) rp.info(u"Test started") d.click_image(pic_url + '[email protected]') time.sleep(2) ......省略 #關閉隊伍界面 d.click_image(pic_url + '[email protected]', offset = (1, -0.5), safe = False) time.sleep(2) #一段對話 d.click(0.5, 0.5) time.sleep(3) #點擊前往挑戰 d.click_image(pic_url + '[email protected]', offset = (-1.5, -1), safe = False) time.sleep(5) #停止指引 d.click(0.5, 0.5) rp.close()
這段代碼中,詳細列舉了新手的每一步操作,搜索圖片,然后點擊對應的位置
因為代碼中所寫的步驟都是固定的,所以面臨兩個問題
-
引導修改
如果游戲迭代程序中,對新手指引的步驟進行了修改,代碼也需要同步修改 -
中斷
如果代碼執行程序中斷了,繼續執行的話,需要刪減部分代碼
如果游戲內出現阻礙新手的彈框、提示之類的,也無法進行判斷
所以我們需要一個更好的辦法來解決通用和中斷的問題
部分資料
Python 基礎:http://www.runoob.com/python3/python3-tutorial.html
Poco 檔案:http://poco.readthedocs.io/zh_CN/latest/
Poco 示例:http://poco.readthedocs.io/zh_CN/latest/source/README.html#tutorials-and-examples
修改程序
接下來的程序以另一個游戲為例,使用基于 UI 的方式來執行新手指引的程序
這里需要提前集成 Poco-SDK
我們先分析下整個新手程序中的通用部分,我們主要是把整個新手拆分成不同的UI,方便我們進行不同的操作
- 開場戰斗
- 角色創建
- 存在指引手指的指引步驟
- 劇情對話
- 各類提示框
有了大致的 UI 后,我們可以考慮直接使用回圈點擊指引手指指引的位置,程序中存在其它界面時,就執行對應的操作,大致結構如下:
while(true): if 指引手指.exists(): 點擊手指位置 elif 劇情對話.exists(): 點擊劇情對話 elif 其他界面.exists(): 點擊界面位置
上面的代碼就不需要和最初那樣,考慮新手指引的步驟;因為一直在檢查當前界面顯示的 UI,所以也不用考慮執行中斷后重哪里繼續
但是游戲程序中需要考慮到一個問題,在網路中斷的時候,彈框會和指引手指或者其它界面一起出現;雖然其它 UI 會被提示框遮擋,但是 UI 還是存在于當前界面的;所以在判斷的時候,需要考慮下撰寫的順序
優化程序
在 Poco 的示例中有一個等待 UI 出現的方法
https://poco-chinese.readthedocs.io/zh_CN/latest/source/poco.pocofw.html#poco.pocofw.Poco.wait_for_any
在超時前回傳等到的第一個 UI 代理物件,等不到 UI 時會報錯
所以上面的代碼可以改一下:
while(true): ui = poco.wait_for_any([指引手指,劇情對話,其他界面]) if ui is 指引手指: 點擊手指位置 elif ui is 劇情對話: 點擊劇情對話 elif ui is 其他界面: 點擊界面位置
但是在等待程序中,一直沒有找到 UI 時,會報錯,我們可以在報錯的時候做一些處理,比如停止回圈
while(true): try: ui = poco.wait_for_any([指引手指,劇情對話,其他界面]) except: break if ui is 指引手指: 點擊手指位置 elif ui is 劇情對話: 點擊劇情對話 elif ui is 其他界面: 點擊界面位置
最終代碼
最終使用 Poco 跑新手流程的完整代碼
# -*- encoding=utf8 -*- __author__ = "HBoPRC" from airtest.core.api import * from poco.drivers.unity3d import UnityPoco # 連接設備 connect_device("Android:///") # 初始化poco poco = UnityPoco() # 定義一個變數來判斷是否還在新手階段 isGuide = True while (isGuide): # 每次需要重新獲取各個界面,以保證取到最新的資訊 # 劇情對話界面 talkV = poco("劇情對話") # loading界面,這里主要是進出戰斗耗時比較長,單獨列出來 loadW = poco("loading") # 創建界面 roleS = poco("角色創建") # 指引手指 finger = poco("指引手指") # 獲得獎勵界面,因為有戰斗,結算界面沒有手指,需要單獨處理 getA = poco("獎勵界面") # 各類提示框,主要是斷線那部分彈框 popWin = poco("提示框") try: # 等待出現上面的界面,設定120s超時,默認就是120s,可以按實際情況修改 # 這里寫UI引數的時候需要注意下先后順序,因為常見的情況:指引的時候可能會斷線重連,彈出提示框,此時會同時存在指引手指和提示框,需要先處理提示框 guideV = poco.wait_for_any([popWin, talkV, loadW, roleS, country, getA, finger], timeout = 120) except: # 沒找到上面的界面,設定不在新手階段,跳出回圈 isGuide = False break # 判斷,根據出現的界面進行相關的操作 if guideV is popWin: # 因為提示框的層級最高,我們需要優先判斷處理,因為主要是考慮的斷線重連情況,這里可以加一個休眠,保證跳過連接程序;或者是再單獨判斷一個轉圈的UI elif guideV is talkV: # 如果是對話框,點擊關閉 elif guideV is loadW: # 這里單獨處理loading是因為考慮到進入副本戰斗的時候,loading過了,還需要先戰斗一段時間才會進行指引提示;其實也可以把wait方法里的超時設長點 elif guideV is roleS: # 角色創建界面,進行選擇頭像,性別,姓名之類的操作 elif (guideV is getA): # 這里關閉掉結算獎勵界面 elif guideV is finger: # 指引手指,點擊對應的位置就行了
完成以上步驟后,我們已經可以運行一個完整的新手流程了
接下來可以使用命令直接運行寫好的 .air 腳本
http://airtest.readthedocs.io/zh_CN/latest/README_MORE.html#run-test-case
將命令保存為不同的批處理檔案后,批量打開,就可以做到最簡單的多臺機器同時運行了,需要注意,如果使用命令的話,需要將腳本內連接設備的代碼刪掉
python -m airtest run xinshou.air --device Android://127.0.0.1:5037/手機序列號 --log \log\nexus4 python -m airtest report xinshou.air --log_root \log\nexus4 --outfile \log\nexus4\log.html --lang zh pause
作者:啵板
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/135948.html
標籤:其他
下一篇:如何測驗資料?
