在上一篇博客中,我们重点介绍了下鼠标和键盘的操作,如果大家没有看过,可以查阅以下
博客地址:https://www.cnblogs.com/bainianminguo/p/17666180.html
我们掌握了鼠标和键盘操作,那下一步我们就需要掌握在哪里做鼠标操作。今天我就给大家出一个方案
基于pyautogui+opencv的方案
我们实战中一般会这样使用
1、首先对当前的屏幕做一个截屏,并保存
1 2 3 4 5 6 7 8 9 10 11 12 13 | import pyautoguiimport cv2import 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方法,将截屏图片和微信图片都读入对象中
1 2 | screenobj = cv2.imread("./abc.jpg")imobj = cv2.imread("./weichat.png") |
4、通过下面的方法找到像素最相似的点
1 2 3 4 5 | screenobj = cv2.imread("./abc.jpg")imobj = cv2.imread("./weichat.png")res = cv2.matchTemplate(imobj,screenobj,cv2.TM_CCOEFF_NORMED)res = cv2.minMaxLoc(res)[3] |
# res是个二维列表,列表中最大值元素的位置就是对比后相似度最高的图片的最上角的位置,
# cv2.minMaxLoc(res)返回四个值,分别是 最不相似的点分数,最相似点分数,最不相似点坐标,最相似点坐标,所以我们在这里取的最后一个元素,也就是最相似点的元素
此时找到的元素是小图标的左上角的坐标,此时我们还需要在微调下,我们要点击的坐标
5、首先获取小图片的坐标,此处我们用到图像对象的shape的属性,此处我们那截屏的图片来演示,大家应该看的更清楚
1 2 3 4 5 6 7 8 9 10 | 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) |
返回的信息如下
1 | (720, 1280, 3) |
说明第一个元素纵坐标,第二个元素的横坐标
6、下面我们可以这样做来找到小图标的中间位置的坐标信息
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | 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、完整代码如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | import pyautoguiimport cv2import osimport timeif 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的自动化,基本上可以满足的我们的要求。有兴趣或者有需要的小伙伴可以去实战下