上期回顧:手機UI自動化之顯示點觸位置(觸摸軌跡)
以下基於 python3.8;airtestIDE1.2.10;airtest1.2.0;pocoui1.0.82
今天我們講一下airtest圖像識別中的一個最基本、最常用的一個類Template
首先我們先看一個非常簡單的腳本示例,在AirtestIDE中,顯示如圖:
在編輯器中點擊鼠標右鍵菜單的‘圖片/代碼模式切換’,切換到代碼模式,可以看到每一張圖就是一個Template()類實例。
所以本質上airtest腳本還是python代碼,只不過在AirtestIDE中經過特殊處理,顯示成了所見即所得的圖片模式。
比如下面這句,運行時會先去讀取這張圖片,然后在當前畫面中找到最符合這張圖片的坐標點,通過touch點擊返回的坐標點。
touch(Template(r"tpl1630325470097.png", record_pos=(0.02, -0.071), resolution=(2400, 1080)))
在開始講解Template類詳細使用之前,先看一下其初始化源碼:
# 文件位置:your_python_path/site-packages/airtest/core/cv.py
class Template(object):
"""
picture as touch/swipe/wait/exists target and extra info for cv match
filename: pic filename
target_pos: ret which pos in the pic
record_pos: pos in screen when recording
resolution: screen resolution when recording
rgb: 識別結果是否使用rgb三通道進行校驗.
scale_max: 多尺度模板匹配最大范圍.
scale_step: 多尺度模板匹配搜索步長.
"""
def __init__(self, filename, threshold=None, target_pos=TargetPos.MID, record_pos=None, resolution=(), rgb=False, scale_max=800, scale_step=0.005):
self.filename = filename
self._filepath = None
self.threshold = threshold or ST.THRESHOLD
self.target_pos = target_pos
self.record_pos = record_pos
self.resolution = resolution
self.rgb = rgb
self.scale_max = scale_max
self.scale_step = scale_step
根據上面的例子可以看到,在AirtestIDE中截的圖,默認會帶3個參數:
-
filename:文件路徑。如上例中r"tpl1630325470097.png"表示當前路徑下的這張圖片,也可以是絕對路徑,如r'/picture/1.png'
-
record_pos:圖片坐標對應手機屏幕中心點的偏移值相對於手機分辨率的百分比,匹配時會優先匹配這附近的畫面。這樣Airtest在圖像匹配時,會優化在這個坐標區域附件查找,提高查找圖片的速度和精確度。如果在這個區域找不到,才會將查找范圍擴大至整個畫面。
-
resolution:手機分辨率。當腳本執行時的手機不是錄制時的手機時,Airtest會對屏幕截圖按照分辨率進行縮放,最大程度兼容跨分辨率匹配。但如果不同手機的分辨率比例相差大,仍會導致匹配不到圖片,所以可能同一張圖,不同手機需要准備2張或以上的圖片做為查找圖片。
以下為一個圖片,多個不同分辨率手機截圖時的查找示例:
flower_xiaomi = Template(r"flower_xiaomi.png", record_pos=(0.79, 0.32), resolution=(1024, 2000))
flower_huawei = Template(r"flower_huawei.png", record_pos=(0.81, 0.4), resolution=(800, 1600))
pic_list = [flower_xiaomi,flower_huawei]
for pic in pic_list:
pos = exists(pic) # 圖片找到返回坐標,沒找到返回False
if pos:
touch(pos)
break # 只要找到圖片列表中的任何一張圖片,就執行touch,並結束循環
除了上邊3個默認的參數,我們看到源碼中還有其他參數:
-
threshold:識別閾值,浮點類型,范圍是[0.0, 1.0],默認0.7。
也就是當識別可信度=>0.7時就認為是匹配的。對於計算機來說,不存在2張完全一樣的圖片,計算機只能告訴你2張圖片的相似程度。比如相似度是0.9(90%)就是比較像,相似度是0.5(50%)就是不太像。計算機只會告訴你相似度,那這2張圖算不算匹配,是由人通過閾值決定的。比如我們說只要相似度70%以上,就算是一樣的。
我們可以指定某個圖片的閾值,如
touch(Template(r"tpl1556019871196.png", threshold=0.9))
但假如我們想讓所有圖片的閾值都是0.9,可以通過全局設置:
from airtest.core.api import *
# airtest.core.api中包含了一個名為ST的變量,即為全局設置
ST.THRESHOLD = 0.9 # 設置全局的匹配閾值為0.9
# 未寫明圖片threshold,使用上面全局的ST.THRESHOLD=0.9
touch(Template(r"1.png", record_pos=(0.79, 0.32), resolution=(107, 1164)))
# 指定圖片threshold,以圖片設置的0.6為准
touch(Template(r"2.png", record_pos=(0.79, 0.32), resolution=(107, 1164), threshold=0.6))
根據經驗,默認的0.7是比較合理的能用的,大家可以根據自己的實際情況進行調節,總結出一個適合自己的閾值。
-
target_pos:圖片點擊位置,整型,默認為5,即圖片的中心點。
在上面Template初始化源碼中,target_pos的默認值是TargetPos.MID,我們去TargetPos類定義中可知,MID就是5
文件位置:your_python_path/site-packages/airtest/utils/transform.py
class TargetPos(object):
"""
點擊目標圖片的不同位置,默認為中心點5
1 2 3
4 5 6
7 8 9
"""
LEFTUP, UP, RIGHTUP = 1, 2, 3
LEFT, MID, RIGHT = 4, 5, 6
LEFTDOWN, DOWN, RIGHTDOWN = 7, 8, 9
從以上代碼,可以看出點擊位置的取值范圍是1~9,這9個點對應下圖
上圖中紅線圈起來的就是我們要找的圖,找到圖后要點擊,默認是點5那個點,如果我們想點圖中的升級按鈕,那應該設置成8
touch(Template(r"1.png", target_pos=8))
再舉一個例子,我們要點擊圖中的玩吧的安裝按鈕
我們可以這樣截圖
因為默認是5,不用改,如果想安裝第1個app,設target_pos=2;如果想安裝第3個app,設target_pos=8
-
rgb:是否開啟彩色識別,Bool類型,默認False。
rgb=False時,Airtest會先將圖像轉為灰度圖再進行識別;為True時,指定使用彩色圖像進行識別。一般情況下,我們都用默認的False即可,但假如畫面上有多個形狀相同顏色不同圖片時,就要設為True。
如上圖,刪除按鈕形狀、文字完全一樣,如果不開rgb,是不會准確識別到紅色按鈕的。 -
scale_max:Airtest1.2.0新增圖像識別算法mstpl專用參數,用於調節匹配的最大范圍,默認值 800, 推薦值 740, 800, 1000 取值范圍 [700 , 2000]。比如截屏為(500,2000),scale_max=1000,則在匹配前截屏會resize為(250,1000)。resize后圖片大小少了一倍,理論上匹配速度也會變快,但因為縮小后,更不容易匹配較小的UI,所以如果要查找的目標UI很小的話,可以適當增大這個數值。
-
scale_step:Airtest1.2.0新增圖像識別算法mstpl專用參數,用於控制搜索比例步長,在匹配時,會以截圖最長邊*scale_step的步長進行搜索,默認值0.005,推薦值 0.02, 0.005, 0.001 取值范圍 [0.001, 0.1]。如果要查找的目標UI很小的話,可以適當減小這個數值(通常不需要調整該值,但如果有跨分辨率匹配失敗,可以嘗試減少,相應的匹配時間則會大大增加)
以上所有這些參數的修改、調試,在AirtestIDE中都可以通過‘圖片編輯器’從UI界面上修改,可以看之前的文章:AirtestIDE高級功能
---------------------------------------------------------------------------------
關注微信公眾號即可在手機上查閱,並可接收更多測試分享~