Airtest局部截圖+找圖、截屏另存為


上期回顧:Airtest腳本編寫技巧及經驗總結


以下基於
python3.8;airtestIDE1.2.13;airtest1.2.4;pocoui1.0.85

局部截圖+找圖

Airtest提供了全屏的找圖API,wait()和exists(),可以看Airtest API精講之wait(),exists()

為什么還需要局部找圖呢,因為縮小查找范圍找的更快啊。比如找一個App的圖標,在1080*2340大小的圖片找140*140的圖標,肯定要比在140*140的圖片上找140*140的圖標,要慢的多。

下面演示一個實例:

  1. 局部截圖小米"手機管家"App圖標,並保存

  2. 10秒后,再次局部截圖小米"手機管家"App圖標,並保存

  3. 用第2次的截圖去匹配第1次的截圖,如找到則返回"手機管家"App圖標在手機上的絕對坐標,方便click()等操作

# -*- encoding=utf8 -*-
__author__ = "測試工程師小站"

from airtest.core.api import *
from airtest.aircv import *

# 初始化,logdir為截圖和日志存放路徑
auto_setup(__file__, devices=["android:///"], logdir='/Users/szh/report/log')

# 第1次對手機截屏
screen1 = G.DEVICE.snapshot()
# 根據坐標進行局部截圖,即圖標左上角和右下角的坐標(坐標可以在AirtestIDE里獲取)
screen1 = aircv.crop_image(screen1, (599, 156, 744, 302))
# 保存局部截圖(清晰度99最高),保存成功后會返回文件名和截圖大小
r1 = try_log_screen(screen1, quality=99)
# 打印返回,形如:{'screen': '1642500247024.jpg', 'resolution': (145, 146)}
print(f'r1:{r1}')

# 以上就完成了第1次局部截圖,以上操作你也可以事先手動截圖並保存,方便下面的直接對比。
sleep(10)

# 第2次對手機截屏
screen2 = G.DEVICE.snapshot()
# 局部截圖
screen2 = aircv.crop_image(screen2, (599, 156, 744, 302))
# 保存局部截圖
r2 = try_log_screen(screen2, quality=99)
print(f'r2:{r2}')

# 將第1次的局部截圖設置為一個Template對象,如果之前是手動截取,那也在這定義一下
tempalte = Template(rf'/Users/szh/report/log/{r1["screen"]}')

s = time.time()  # 局部找圖開始計時

# 在第1次的局部截圖中匹配第2次的局部截圖
pos = tempalte.match_in(screen2)

print(f"局部找圖消耗時間:{time.time() - s}")  # 打印局部找圖耗時

# 返回找到的圖片坐標(該坐標是相對於局部截圖的中心點坐標)
print(pos[0], pos[1])

# 若要返回目標在整個屏幕中的坐標,則需要加上局部截圖時左上角的坐標
if pos:
    pos = pos[0]+599, pos[1]+156
    print(pos[0], pos[1])
else:
    print('沒找到')

# 對比一下exists()全屏的找圖時間
s = time.time()
exists(tempalte)
print(f"全屏找圖消耗時間:{time.time() - s}")

運行后可以在指定的路徑看到2次截圖的圖片。
可以看到局部找圖比全屏找圖快多了:

r1:{'screen': '1642501303079.jpg', 'resolution': (145, 146)}

r2:{'screen': '1642501303184.jpg', 'resolution': (145, 146)}

局部找圖消耗時間:0.002668142318725586

72 73
671 229

全屏找圖消耗時間:0.2622840404510498

圖解一下上例中的坐標

圖片

不過局部截圖有個缺點,就是要指定絕對坐標,如果換了手機,就對不上坐標了。不過如果是相同分辨率比率的,可以通過相對坐標換算來兼容。不同分辨率比率,就把截圖尺寸放大一些吧。

比如在100*100的屏幕上,坐標是[50,50],那相對坐標就是[0.5,0.5];在1000*1000的屏幕上該點坐標=[1000*0.5, 1000*0.5]

代碼如下:

# -*- encoding=utf8 -*-
__author__ = "測試工程師小站"

from airtest.core.api import *

# 其他設備上獲取到的相對坐標
relative = [0.5, 0.5]

# 獲取當前手機的分辨率
if G.DEVICE.display_info['orientation'] in [1,3]:  # 豎屏時
    height = G.DEVICE.display_info['width']
    width = G.DEVICE.display_info['height']
else:  # 橫屏時
    height = G.DEVICE.display_info['height']
    width = G.DEVICE.display_info['width']

absolute = [height*0.5, width*0.5]  # 絕對坐標

截屏另存為

正常情況下用例跑完后,生成報告,報告中就包含了運行中的各種截圖,但如果你期望某些截圖單獨保存,以供將來對比等用處,可以這樣做:

# -*- encoding=utf8 -*-
__author__ = "測試工程師小站"

from airtest.core.api import *
from airtest.aircv.utils import cv2_2_pil

auto_setup(__file__, devices=["android:///"])

screen = G.DEVICE.snapshot()  
pil_img = cv2_2_pil(screen)
pil_img.save("D:/qasite/測試工程師小站.png", quality=99, optimize=True)

 

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

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


免責聲明!

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



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