引言:

目前在图像识别方面的自动化测试框架有很多,其中比较有名的是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

【python+selenium自动化】图像识别技术在UI自动化测试中的实际运用的更多相关文章

  1. Python+Selenium+Appium对APP进行UI自动化测试

    1. 安装Python3.7版本 pythonjava的JDK java -version javac nodejs node --versionappium 若nodejs安装完毕,使用npm安装a ...

  2. Python+Selenium自动化 模拟鼠标操作

    Python+Selenium自动化 模拟鼠标操作   在webdriver中,鼠标的一些操作如:双击.右击.悬停.拖动等都被封装在ActionChains类中,我们只用在需要使用的时候,导入这个类就 ...

  3. Python+Selenium+Unittest+Ddt+HTMLReport分布式数据驱动自动化测试框架结构

    1.Business:公共业务模块,如登录模块,可以把登录模块进行封装供调用 ------login_business.py from Page_Object.Common_Page.login_pa ...

  4. python selenium自动化点击页面链接测试

    python selenium自动化点击页面链接测试 需求:现在有一个网站的页面,我希望用python自动化的测试点击这个页面上所有的在本窗口跳转,并且是本站内的链接,前往到链接页面之后在通过后退返回 ...

  5. python+selenium自动化登录dnf11周年活动界面领取奖励登录部分采坑总结[1]

    背景: Dnf的周年庆活动之一,游戏在6月22日 06:00~6月23日 06:00之间登陆过游戏后可以于6月25日 16:00~7月04日 06:00领取奖励 目标:连续四天自动运行脚本,自动领取所 ...

  6. Python+selenium 自动化-启用带插件的chrome浏览器,调用浏览器带插件,浏览器加载配置信息。

    Python+selenium 自动化-启用带插件的chrome浏览器,调用浏览器带插件,浏览器加载配置信息.   本文链接:https://blog.csdn.net/qq_38161040/art ...

  7. Python+Selenium自动化总结

    Python+Selenium自动化总结 1.环境搭建 1.1.安装selenium模块文件 pip install selenium 1.2.安装ChromeDriver驱动 [1]下载安装Chro ...

  8. Python+Selenium自动化-定位一组元素,单选框、复选框的选中方法

    Python+Selenium自动化-定位一组元素,单选框.复选框的选中方法   之前学习了8种定位单个元素的方法,同时webdriver还提供了8种定位一组元素的方法.唯一区别就是在单词elemen ...

  9. Python+Selenium自动化-模拟键盘操作

    Python+Selenium自动化-模拟键盘操作   0.导入键盘类Keys() selenium中的Keys()类提供了大部分的键盘操作方法:通过send_keys()方法来模拟键盘上的按键. # ...

随机推荐

  1. 对数据集做标准化处理的几种方法——基于R语言

    数据集——iris(R语言自带鸢尾花包) 一.scale函数 scale函数默认的是对制定数据做均值为0,标准差为1的标准化.它的两个参数center和scale: 1)center和scale默认为 ...

  2. 软件工程大作业(学生会管理系统)Web端个人总结报告

    软件工程大作业(学生会管理系统)Web端个人总结报告 一.小组信息 1.所在小组:第二组 2.小组选题:学生会管理系统 3.项目源代码链接: Web端源代码:code 小程序端源代码:code APP ...

  3. java Class类使用

    1.forName public static Class<?> forName(String className) throws ClassNotFoundException 返回与带有 ...

  4. webpack 零基础到工程实战(1)

    webpack resolve:resolve 配置是帮助 webpack 查找依赖模块resolve.alias 是最常用的配置,通过设置 alias 可以帮助 webpack 更快查找模块依赖,而 ...

  5. 【串线篇】spring boot嵌入式Servlet容器启动原理;

    什么时候创建嵌入式的Servlet容器工厂?什么时候获取嵌入式的Servlet容器并启动Tomcat: 获取嵌入式的Servlet容器工厂: 1).SpringBoot应用启动运行run方法 2).r ...

  6. ubuntu16.04 下安装jdk

    1.         在/usr/lib目录下新建jdk mkdir jdk 2.         执行文件移动 sudo mv ./resource/jdk-8u191-linux-x64.tar. ...

  7. Spring Boot关于layui的通用返回类

    1.关于layui的通用返回类 code.count.data.msg public class Msg { private long code = 0; private long count = 0 ...

  8. 如何编译Java程序以及运行程序

    一.编辑运行 二.HelloWorld程序的组成: 三.public static void main(String[] args){} 四.System.out.println("Hell ...

  9. linux运维、架构之路-git版本管理

    一.常见版本管理系统 1.SVN     集中式的版本控制系统,只有一个中央数据仓库,如果中央数据仓库挂了或者不能访问,所有的使用者无法使用svn,无法进行提交或者备份文件 2.Git      分布 ...

  10. dnsmasq+Stunnel+sniproxy加密代理

    一.环境介绍 [root@kimissVPN ~]# cat /etc/redhat-release CentOS release 6.8 (Final) [root@kimissVPN ~]# un ...