颜色识别方案
之前的文章里面有介绍过怎么样用坐标来实现UI测试自动化、但是坐标法有一些致命的缺点、比如不能做断言
还有兼容性很差
;所以这次的内容我会和大家分享一下怎么样用颜色识别技术来做UI测试自动化。
在讲颜色识别之前、必须要先简单介绍一下三原色
、颜色值
和像素
三原色(RGB)
我们在显示器上看到的所有色彩都是红绿蓝三种颜色调和而成
下图经典的三原色图片
颜色值
颜色值用十六进制来表示
每个颜色的最低值为 0(十六进制为 00),最高值为 255(十六进制为FF)
十六进制值的写法 #FFFFFF
更多关于三原色的信息大家可以自行Google
像素
像素是视频显示的基本单位、也就是屏幕上的最小单位
给大家一个例子
这是QQ的ICO图标
然后放大到最大化
图片里面一个一个小方块就是像素;而像素里面又包含了颜色值。
终于可以说颜色识别的原理了
- 通过像素的颜色值在屏幕上找到目标
- 然后返回目标坐标值
- 模拟鼠标键盘进行操作
- 并通过颜色识别做断言
有了理论基础 我们开始实践
如果你想用颜色识别来做自动化、那么按键精灵
和大漠插件
是目前最好用最稳定的实现方案。
接下来的操作是用大漠插件
实现的
- 用大漠插件工具加载图片
- 然后取色
- 当二值化区域能清晰的看到我们要找的目标时、就说明这个颜色值可以在屏幕上找到目标
- 复制颜色值代码、我们要开始写代码了
下面是代码
#! /usr/bin/env python3
# encoding:utf-8
import time
import pyautogui
import win32com.client
import win32api
# 找登录按钮
login = dm.FindMultiColor(
0, 0, 1200, 750, "96966d",
"6|0|d2d38a,0|10|c8c698,9|10|e7da98,16|0|e7da98,17|5|96ac7d,18|10|daac2f",
0.8, 1)
print("找到登录按钮坐标:", login)
if login[0] > 0:
intX, intY = login[1:]
pyautogui.moveTo(intX, intY ) # 登录按钮位置
pyautogui.click()
pyautogui.PAUSE = 0.5
上面的代码就实现了一个功能
- 通过颜色值在屏幕固定区域查找匹配
- 匹配之后返回坐标值
- 移动鼠标到指定位置
- 实现点击功能
看下代码执行效果
大漠插件颜色识别函数介绍
其实我们这里用到的最最主要的就这个方法FindMultiColor()
核心代码就这几行、简单介绍一下步骤
- 传递区域坐标、多点找色颜色值、匹配度0.8,查找方向是1也就是从左到右,从下到上
- 判断返回值是否大于0
- 返回值如果大于0 说明通过颜色值找到目标位置
- 获取坐标位置
moveTo()
移动鼠标到目标坐标- 实现点击操作
写个UI自动化用例
上面的视频里面有2个自动化用例
- 自动登录
- 兑换一个物品
颜色识别的优势
- 可以做断言;这是单纯的坐标法解决不了的痛点
- 适应性强;只要你愿意基本上都可以用颜色识别来做自动化;如果不信的可以去按键精灵论坛看下有多少人按键精灵写外挂就知道了;
颜色识别法的劣势
- 代码写起来比较麻烦、每一个目标元素都是要单独取色
- 如果你的程序有自动换皮肤的功能就麻烦了
- 没有用颜色识别技术做的自动化测试框架;