【速看】如何通過合理的封裝,讓你的自動化腳本更上一層樓!

此文章來源於項目官方公衆號:“AirtestProject”
版權聲明:允許轉載,但轉載必須保留原鏈接;請勿用作商業或者非法用途

1. 前言

上一篇推文利用一個在圖片範圍內實現隨機座標點擊的例子,去教會大家如何將自己想要的效果實現出來,受到大家的熱情反響,在我們官方討論羣中,還有大佬對我們的示例代碼進行優化改進,做了很多合理的函數封裝,以及減少了示例腳本內的二次查找等問題;我們也徵得大佬同意,將他的代碼與大家分享一下~(大佬來自Airtest官方討論3羣-Moty)

2. 代碼分享

Moty同學是通過在本地python環境安裝Airtest庫去進行Airtest自動化腳本編寫的,同時該腳本在AirtestIDE上是可以完美適配運行的。所以大家在編寫自動化腳本的時候,可以有多重選擇;但是AirtestIDE在代碼編寫上也有很多方便大家的小設計小巧思,大家也可以多多使用我們的AirtestIDE啊~

廢話不多說,我們先來看看Moty同學代碼的運行情況,可以看到通過生成隨機座標的形式,點擊圖片上的任意點,這裏用計算器去具象化,可以看到每次隨機座標可以點擊不同數字或者數字的不同位置,每次運行都可以獲得隨機的數字序列。

看起來很厲害的樣子,我們應該這麼去實現呢,讓我們來看看Moty同學的代碼吧~

# -*- encoding=utf8 -*-
__author__ = "Moty"

from airtest.core.api import *
from airtest.cli.parser import cli_setup
from airtest.core.error import *
from airtest.core.settings import Settings as ST
import random

"""
獲取模板匹配的目標區域的矩形 這一部分實現參考 cv.py 中 loop_find 部分
: param : tpl 模板
: param : intervalfunc 沒有合適匹配時的回調函數
: return 最佳匹配的矩形區域(x1,y1,x2,y2)
"""

def rectangle(tpl,intervalfunc=None):  
    G.LOGGING.info("Try finding: %s", tpl)
    start_time = time.time()
    while True:
        screen = G.DEVICE.snapshot(filename=None, quality=ST.SNAPSHOT_QUALITY)
        if screen is None:
            # 如果截圖爲空,則可能是屏幕鎖定了
            G.LOGGING.warning("Screen is None, may be locked")
        else:
            match_result = tpl._cv_match(screen)
            if match_result:
                try_log_screen(screen)
                # 這裏 rect 得到的是 4個座標點 取出左上右下角 得到(x1,y1,x2,y2) 元組
                rect = match_result.get("rectangle")
                if rect is not None:
                    return (round(rect[0][0]) , round(rect[0][1]) , round(rect[2][0]) , round(rect[2][1]))

        if intervalfunc is not None:
            intervalfunc()

        # 超時則raise,未超時則進行下次循環:
        if (time.time() - start_time) > ST.FIND_TIMEOUT:
            try_log_screen(screen)
            # 如果超時,則拋出異常
            raise TargetNotFoundError('Picture %s not found in screen' % tpl)
        else:
            time.sleep(0.5)

"""
param : rect : 矩形區域 或模板
return : 區域內的隨機座標 
"""

# 獲取矩形區域內的隨機座標
def random_point(rect):
    # 如果傳入的是圖片,則獲取圖片匹配的矩形區域
    if isinstance(rect, Template):
        x1, y1, x2, y2 = rectangle(rect)
    else:
        x1, y1, x2, y2 = rect
    # 在矩形區域內隨機生成一個座標點
    x = random.randint(x1, x2)
    y = random.randint(y1, y2)
    return x, y

"""
在 矩形範圍內 隨機點擊 
param : v : 目標區域 or 模板 or 座標點(兼容touch)
param : times : 點擊次數
return :最終點擊的點的座標
"""
@logwrap
def random_touch_in_area(v, times=1, **kwargs):
    if isinstance(v, Template) or (isinstance(v, tuple) and len(v) == 4):
        pos = random_point(v)
    else:
        try_log_screen()
        pos = v
# 在目標區域內隨機點擊
    for _ in range(times): 
        G.DEVICE.touch(pos, **kwargs) 
        time.sleep(0.05)  
    delay_after_operation()  
    return pos


if __name__ == '__main__':

    # 如果沒有通過命令行連接設備,則使用該連接命令,若使用IDE運行則可忽略這段代碼,不用寫上
    if not cli_setup():
        auto_setup(__file__, logdir=None, 
                devices=["android:///",])

    # 錄製圖片
    tpl = Template(r"tpl1697636105500.png", record_pos=(0.243, -0.165), resolution=(1080, 2280))

    # 獲取模板匹配的目標區域的矩形
    result = rectangle(tpl)
    print(f"圖片所在矩形區域 {result}")

    # 在目標區域內隨機點擊
    for i in range(10):
        p =  random_touch_in_area(tpl)
        print(f"第 {i+1:02d} 次點擊座標 {p}")
        sleep(1)

可以看出來,在編寫代碼的時候,Moty同學將每一個步驟進行函數封裝後,可以減少二次查找的次數以及代碼冗餘,Moty同學的編寫思路很值得我們學習~

3.小結

最後,希望同學們在學習以及使用Airtest的時候,可以先學習方法,掌握代碼編寫技巧後,對自己的腳本可以進行優化再優化,從而實現代碼收益最大化。同時,我們也鼓勵大家在學習我們的官方教程腳本的時候,進行優化再創作,也可以到我們官方Q羣進行投稿噢~

官方Q羣:目前1、2、3羣已滿,大家可以加入4羣(117973773)。

這裏附上我們官方教程文檔的網址,歡迎同學們查閱哦:https://airtest.doc.io.netease.com/


AirtestIDE下載:airtest.netease.com/
Airtest 教程官網:airtest.doc.io.netease.com/
搭建企業私有云服務:airlab.163.com/b2b

官方答疑 Q 羣:117973773

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