• 客户端自动化测试解决方案之图像识别


    在上一篇博客中,我们重点介绍了下鼠标和键盘的操作,如果大家没有看过,可以查阅以下

    博客地址: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 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方法,将截屏图片和微信图片都读入对象中

    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 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的自动化,基本上可以满足的我们的要求。有兴趣或者有需要的小伙伴可以去实战下

  • 相关阅读:
    流程图如何制作?好用的11款流程图软件盘点!
    C语言实现根据用户输入的整数求和(两种方法)
    物联网面试准备
    UG NX二次开发(C++)-采用NXOpen方法计算体的质心
    [附源码]计算机毕业设计JAVA高校新生报到管理系统
    Unity之创建第一个2D游戏项目
    从C语言过渡到C++
    2.1、物理层的基本概念
    2023-5-22-C++异常处理机制学习
    论文解读(IGSD)《Iterative Graph Self-Distillation》
  • 原文地址:https://www.cnblogs.com/bainianminguo/p/17666934.html