【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
【python+selenium自动化】图像识别技术在UI自动化测试中的实际运用的更多相关文章
- Python+Selenium+Appium对APP进行UI自动化测试
1. 安装Python3.7版本 pythonjava的JDK java -version javac nodejs node --versionappium 若nodejs安装完毕,使用npm安装a ...
- Python+Selenium自动化 模拟鼠标操作
Python+Selenium自动化 模拟鼠标操作 在webdriver中,鼠标的一些操作如:双击.右击.悬停.拖动等都被封装在ActionChains类中,我们只用在需要使用的时候,导入这个类就 ...
- Python+Selenium+Unittest+Ddt+HTMLReport分布式数据驱动自动化测试框架结构
1.Business:公共业务模块,如登录模块,可以把登录模块进行封装供调用 ------login_business.py from Page_Object.Common_Page.login_pa ...
- python selenium自动化点击页面链接测试
python selenium自动化点击页面链接测试 需求:现在有一个网站的页面,我希望用python自动化的测试点击这个页面上所有的在本窗口跳转,并且是本站内的链接,前往到链接页面之后在通过后退返回 ...
- python+selenium自动化登录dnf11周年活动界面领取奖励登录部分采坑总结[1]
背景: Dnf的周年庆活动之一,游戏在6月22日 06:00~6月23日 06:00之间登陆过游戏后可以于6月25日 16:00~7月04日 06:00领取奖励 目标:连续四天自动运行脚本,自动领取所 ...
- Python+selenium 自动化-启用带插件的chrome浏览器,调用浏览器带插件,浏览器加载配置信息。
Python+selenium 自动化-启用带插件的chrome浏览器,调用浏览器带插件,浏览器加载配置信息. 本文链接:https://blog.csdn.net/qq_38161040/art ...
- Python+Selenium自动化总结
Python+Selenium自动化总结 1.环境搭建 1.1.安装selenium模块文件 pip install selenium 1.2.安装ChromeDriver驱动 [1]下载安装Chro ...
- Python+Selenium自动化-定位一组元素,单选框、复选框的选中方法
Python+Selenium自动化-定位一组元素,单选框.复选框的选中方法 之前学习了8种定位单个元素的方法,同时webdriver还提供了8种定位一组元素的方法.唯一区别就是在单词elemen ...
- Python+Selenium自动化-模拟键盘操作
Python+Selenium自动化-模拟键盘操作 0.导入键盘类Keys() selenium中的Keys()类提供了大部分的键盘操作方法:通过send_keys()方法来模拟键盘上的按键. # ...
随机推荐
- 对Xcode菜单选项的详细探索(来自董铂然的微博http://www.cnblogs.com/dsxniubility/p/4983614.html)
本文调研Xcode的版本是 7.1,基本是探索了菜单的每一个按钮.虽然从xcode4一直用到了xcode7,但是一般都只是用了一些基础的功能,说来也惭愧.在一次偶然的机遇突然发现了“显示调用层级”的选 ...
- redis防止抢购商品超卖
前言: redis不仅仅是单纯的缓存,它还有一些特殊的功能,在一些特殊场景上很好用. 本篇博文用来测试下使用redis来防止抢购商品超卖问题. 内容: 使用redis的list进行测试 思路是设置一个 ...
- MFC学习笔记3---使对话框风格与系统统一
有一件郁闷了我很久的事情,在VS中编辑对话框或者点击预览时都是以Win7风格体现的按钮及对话框: 点击上图测试对话框: 然而生成的应用程序却是这样的: 这样人很不爽啊,按钮风格回到了N年前的版本,复古 ...
- 基于FastDFS在SpringBoot上的上传与下载
方法: 1.在application.properties里设置参数,其中tracker-list是tracker的端口 fdfs.so-timeout= fdfs.connect-timeout= ...
- [转]WAREZ无形帝国
一. 这会儿夜深了,他们昏昏睡去.随便哪栋建筑的某一个黑洞洞的窗口,你冷眼望去,没准就能看到一台白色的电脑,静静地卧在主人的书桌上.如果那主人睡得足够深,你就打开他的抽屉,现在你看到了什么?哦,我不是 ...
- 03python面向对象编程1
1.创建和使用类 1.1 创建 Dog 类.根据 Dog 类创建的每个实例都将存储名字和年龄.我们赋予了每条小狗蹲下( sit() )和打滚( roll_over() )的能力: In [2]: cl ...
- Qt应用程序的发布
1 Windows平台上的应用程序发布 Windows发布工具 windeployqt.exe是Qt自带的Windows平台发布工具.windeployqt.exe文件在Qt的bin目录下,Qt的每一 ...
- nacos 动态刷新@ConfigurationProperties
使用@ConfigurationProperties 可以替换@value @ConfigurationProperties @Value 注解功能 可以批量注入配置文件中的属性 只能一个个指定注 ...
- 1.使用kubeadm安装kubernetes
一.环境准备 所有规划主机(一台master,两台node)均需操作 1.关闭防火墙,selinux [root@node1 ~]# systemctl stop firewalld [root@no ...
- 8.docker的系统资源限制
一. 概述 默认docker容器使用的memory资源和CPU资源是没有限制的,但是我们可以在docker run的时候通过选项去限制,具体参考官方文档. [root@node1 ~]# docker ...