Airtest-API精講之Template


上期回顧:手機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高級功能

 

---------------------------------------------------------------------------------

關注微信公眾號即可在手機上查閱,並可接收更多測試分享~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM