使用者端自動化測試解決方案之影象識別

2023-08-30 15:01:48

在上一篇部落格中,我們重點介紹了下滑鼠和鍵盤的操作,如果大家沒有看過,可以查閱以下

部落格地址:https://www.cnblogs.com/bainianminguo/p/17666180.html

我們掌握了滑鼠和鍵盤操作,那下一步我們就需要掌握在哪裡做滑鼠操作。今天我就給大家出一個方案

基於pyautogui+opencv的方案

我們實戰中一般會這樣使用

1、首先對當前的螢幕做一個截圖,並儲存

import pyautogui
import cv2
import os
 
import time
 
if os.path.exists("./abc.jpb"):
    os.remove("./abc.jpb")
 
time.sleep(5)
im = pyautogui.screenshot()
 
im.save("./abc.jpg")

  

2、然後在使用截圖工具,將我們要點選的圖示截圖,然後做儲存

 

3、此時我們呼叫cv2.imread方法,將截圖圖片和微信圖片都讀入物件中

screenobj = cv2.imread("./abc.jpg")
imobj = cv2.imread("./weichat.png")

  

4、通過下面的方法找到畫素最相似的點

screenobj = cv2.imread("./abc.jpg")
imobj = cv2.imread("./weichat.png")


res = cv2.matchTemplate(imobj,screenobj,cv2.TM_CCOEFF_NORMED)

# res是個二維列表,列表中最大值元素的位置就是對比後相似度最高的圖片的最上角的位置,

res = cv2.minMaxLoc(res)[3]

# cv2.minMaxLoc(res)返回四個值,分別是 最不相似的點分數,最相似點分數,最不相似點座標,最相似點座標,所以我們在這裡取的最後一個元素,也就是最相似點的元素

  

此時找到的元素是小圖示的左上角的座標,此時我們還需要在微調下,我們要點選的座標

 

5、首先獲取小圖片的座標,此處我們用到影象物件的shape的屬性,此處我們那截圖的圖片來演示,大家應該看的更清楚

screenobj = cv2.imread("./abc.jpg")
imobj = cv2.imread("./weichat.png")


res = cv2.matchTemplate(imobj,screenobj,cv2.TM_CCOEFF_NORMED)

res = cv2.minMaxLoc(res)[3]


print(screenobj.shape)

  

返回的資訊如下

(720, 1280, 3)

  

說明第一個元素縱座標,第二個元素的橫座標

 

6、下面我們可以這樣做來找到小圖示的中間位置的座標資訊

screenobj = cv2.imread("./abc.jpg")
imobj = cv2.imread("./weichat.png")


res = cv2.matchTemplate(imobj,screenobj,cv2.TM_CCOEFF_NORMED)

res = cv2.minMaxLoc(res)[3]


print(screenobj.shape)


clickpostion = [res[0] + imobj.shape[1]/2,res[1] + imobj.shape[0]/2]

print(clickpostion)


pyautogui.doubleClick(clickpostion)

  

 

 

然後我們在做雙擊操作即可

7、完整程式碼如下

 

import pyautogui
import cv2
import os

import time

if os.path.exists("./abc.jpb"):
    os.remove("./abc.jpb")

time.sleep(5)
im = pyautogui.screenshot()

im.save("./abc.jpg")

# 1、做螢幕截圖


screenobj = cv2.imread("./abc.jpg")
imobj = cv2.imread("./weichat.png")

# 2、將圖片讀入的物件中


res = cv2.matchTemplate(imobj,screenobj,cv2.TM_CCOEFF_NORMED)

res = cv2.minMaxLoc(res)[3]

# 3、通過比較,獲取兩張圖片畫素最相近的點的左上角的座標資訊


print(screenobj.shape)
# 4、獲取小圖示的解析度

clickpostion = [res[0] + imobj.shape[1]/2,res[1] + imobj.shape[0]/2]

print(clickpostion)
# 5、找到小圖示的中間點的座標資訊

pyautogui.doubleClick(clickpostion)
# 6、呼叫第一篇部落格的方法,做滑鼠或者鍵盤操作即可

  

 通過上面的知識,相信大家已經可以做到gui的自動化了

我們的方案是基於pyautogui+openCV+fastAPI 實現的,目前我們內部也是基於這一套技術棧來gui的自動化,基本上可以滿足的我們的要求。有興趣或者有需要的小夥伴可以去實戰下