zoukankan      html  css  js  c++  java
  • 【python+selenium自动化】图像识别技术在UI自动化测试中的实际运用

    引言:

    目前在图像识别方面的自动化测试框架有很多,其中比较有名的是airtest,主要做手机端的游戏自动化测试(http://airtest.netease.com/)

    因为没有实际把airtest运用在项目中的经验,所以此篇文章暂不讨论,等后续有时间去实践了,一定回来分享

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

    目前在做的项目,也运用到了图像识别技术。优化过的框架,是通过一篇文章得来的启发:https://www.pyimagesearch.com/2017/06/19/image-difference-with-opencv-and-python/#comment-429138

    直接看下图也行:

    两张信用卡的图片,左图有芯片和几个字母,右图没有。通过图像识别,两张图做比对,找出了差异,并把差异都标记了出来,这样看图片差异,是不是就一目了然了

    根据上面的思路,需要两张图,一个是用来做对比的基础图片(Base),一个是拿来跟基础图片比较的图片(Compare)

    所以,在UI自动化测试的流程中,加入一个录制基础图片的过程,比如上周的版本,我们跑自动化测试用例,录制了基础图片,这周发版本,我们跑自动化测试用例后,把这个版本的图片跟上个版本的图片做比对,如果完全一致,那说明测试通过,如果有差异,要么是bug,要么是需求改动了UI。这样做的好处是:一般自动化测试工程师不能像功能测试工程那样,完全关心到每个版本的需求变动,这样检测出来的结果最为正确。

    先上一部分代码(就是上图中信用卡比对差异的实现方法),后续有时间再把整个框架图整理出来

    import imutils
    from skimage.measure import compare_ssim
    import cv2
    import numpy as np
    
    
    class MarkDiffImg:
        @staticmethod
        def cv_imread(file_path):
            """
            读取图片(解决路径中含有中文无法读取的问题),一般是直接cv2.imread(filea_path)
            :param file_path:图片的路径
            :return:
            """
            cv_img = cv2.imdecode(np.fromfile(file_path, dtype=np.uint8), -1)
            return cv_img
    
        def mark_diff_img(self, result, basesnapshot_png, runningsnapshot_png, DiffSnapshot_Dir, casename, name):
            """
            对比图片并标出差异,保存差异图片
            :param basesnapshot_png:
            :param runningsnapshot_png:
            :param DiffSnapshot_Dir:
            :param casename:
            :param name:
            :return:
            """
            # 加载两张图片并将他们转换为灰度:
            image_a = self.cv_imread(basesnapshot_png)
            image_b = self.cv_imread(runningsnapshot_png)
            gray_a = cv2.cvtColor(image_a, cv2.COLOR_BGR2GRAY)
            gray_b = cv2.cvtColor(image_b, cv2.COLOR_BGR2GRAY)
    
            # 计算两个灰度图像之间的结构相似度指数:
            (score, diff) = compare_ssim(gray_a, gray_b, full=True)
            diff = (diff * 255).astype("uint8")
            print("SSIM:{}".format(score))
    
            # 找到不同点的轮廓以致于我们可以在被标识为“不同”的区域周围放置矩形:
            thresh = cv2.threshold(diff, 0, 255, cv2.THRESH_BINARY_INV | cv2.THRESH_OTSU)[1]
            cnts = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
            cnts = imutils.grab_contours(cnts)
    
            # 找到一系列区域,在区域周围放置矩形:
            for c in cnts:
                x, y, w, h = cv2.boundingRect(c)
                cv2.rectangle(image_a, (x, y), (x + w, y + h), (255, 0, 0), 2)
                cv2.rectangle(image_b, (x, y), (x + w, y + h), (255, 0, 0), 2)
    
            # 基础快照标出与运行时快照的差异 图片
            diffsnapshot_png_a = DiffSnapshot_Dir + casename + '/' + name + '_base.png'
            # 运行时快照标出与基础快照的差异 图片
            diffsnapshot_png_b = DiffSnapshot_Dir + casename + '/' + name + '_running.png'
            # 保存差异图片
            cv2.imencode('.jpg', image_a)[1].tofile(diffsnapshot_png_a)
            cv2.imencode('.jpg', image_b)[1].tofile(diffsnapshot_png_b)
            result["对比快照-基础快照路径"] = diffsnapshot_png_a
            result["对比快照-运行时快照路径"] = diffsnapshot_png_b
    
            return result
  • 相关阅读:
    STL的相关知识
    有关欧拉通路/回路的一些资料整理
    差分约束
    BZOJ 2100: [Usaco2010 Dec]Apple Delivery
    BZOJ 2017: [Usaco2009 Nov]硬币游戏(A Coin Game)
    vijos 1282&1283&1284&1285 佳佳的魔法照片/魔法药水/魔杖/魔法阵
    BZOJ 1660: [Usaco2006 Nov]Bad Hair Day
    BZOJ 1602: [Usaco2008 Oct]牧场行走
    BZOJ 1647: [Usaco2007 Open]Fliptile 翻格子游戏
    BZOJ 1646: [Usaco2007 Open]Catch That Cow
  • 原文地址:https://www.cnblogs.com/fengzx120/p/10956027.html
Copyright © 2011-2022 走看看