在开发自动化脚本的时候,很多时候有这种需求,需要点击PC端的软件,来进行测试,比如:打开串口工具、测速软件等等,这个时候就需要你去开发相关的代码了,在我的工作经验中,我一般采取俩种实现方式:
1.基于autoit去点击PC端控件信息,直接获取到控件信息的类名以及次序直接传入原生接口即可;
2.不过,有时候经常第一种方式拿不到控件信息,这个时候就只能采用图片识别获取坐标的方式去点击了;
下面我就把第二种代码贴出来,供大家参考,如有不足,欢迎指出,共同进步:
# -*- coding:utf-8 -*-
from PIL import image
import aircv as ac
import win32gui,win32ui,win32con,win32api
class Screen():
def __int__(self):
pass
#判断坐标点的rgb值
def find_pic_rgb(self,file_path,x,y,r,g,b):
im=Image.open(file_path)
pix=im.load()
result=pix[x,y]
if result[0]==r and result[1]==g and result[2]==b:
return True
else:
return False
#比较俩张图片,如果比较成功,返回比较图片的x,y坐标,比较失败返回0
#参数:要点击的图片,被比较的图片,相似度(如果你用此接口建议相似度调高点,点击的更精确哦)
def compare_image(self,image_path_2,image_path_1,num=0.6):
imsrc=ac.imread(image_path_1)
imobj=ac.imread(image_path_2)
#拿到path_2的坐标位置
pos=ac.find_template(imsrc,imobj,num)
if pos==None:
return 0
else:
return pos['result']
#裁剪图片
def cut_image(self,image_path,x1,x2,y1,y2):
img=cv2.imread(image_path)
cropped=img[y1:y2,x1:x2]
#裁剪坐标为[x0:x1,y0:y1]
cv2.imwrite(image_path,cropped)
#截取当前屏幕的图片
def cut_screen(self):
hwnd=0
hwndDC=win32gui.GetWindowDC(hwnd)
mfcDC=win32gui.CreateDCFromHandle(hwndDC)
saveDC=mfcDC.CreateCompatibleDC()
saveBitMap=win32ui.CreateBitmap()
MoniterDev=win32api.EnumDisplayMonitors(None,None)
w=MoniterDev[0][2][2]
h=MoniterDev[0][2][3]
saveBitMap.CreateCompatibleBitmap(mfcDC,w,h)
saveDC.SelectObject(saveBitMap)
saveDC.BitBlt((0,0),(w,h),mfcDC,(0,0),win32con.SRCCOPY)
saveBitMap.SaveBitmapFile(saveDC,"你的路径")
if __name__=='__main__':
s=Screen()
import autoit
s.cut_screen()
#路径2是cut_screen方法截图图片的放置路径
#路径1:一定要在路径2截图上再去截图你想点击的图(分辨率一致)
res=s.compare_image("路径1","路径2",num=0.95)
autoit.mouse_click("left",res[0],res[1])
好了,就这些了,不要太感谢我哦!加油,共同进步!