无意引起UI 自动化是否必要
的争论、所以想讨论这个问题朋友可以单独开一篇帖子
文笔不好、为了尽量写得通俗易懂、文中可能有的地方比较啰嗦、请见谅。
深知不可能用一篇文章就把一种技术讲得清晰明了、所以文章里面写得内容都是比较简单的解决方案;
如果某一天在做自动化时、发现现有的方案实现不了的时候、想起来之前谁谁谁有分享过其他解决方案、我的目的就达成了!
内容有点多、请提前做好准备
UI 测试自动化大致可以分为下面几种情形
不管你使用什么技术来执行测试自动化至少都得包含如下几个步骤
1. 如果我们是做 Web UI 自动化、现成的框架有 Selenium 和 Robot Framework 可以选择
2. 如果你是 APP 自动化、有 Appium 可以选择
3. 如果 C/S 的程序是 Windows 标准控件的话、可以用 MSAA 或者 UIA 来做自动化
4. 如果上述技术解决方案都解决不了的时候、我们又想实现测试自动化要怎么办?这是我写这篇文章的原因、所以我把文章取名叫 “UI 测试自动化的奇技淫巧”
那么接下来我准备从三个方面来分享一下我在 UI 测试自动化中的一些理解、和大家一起探讨。
当屏幕上有按钮图标时、那么这个图标必然会处于某一个坐标之上;也就是说只要点击目标相应位置的坐标就能点击到图标。
输入内容、滑动、下拉等等一系列操作的前提是需要先找到目标位置。
先简单介绍一下坐标的概念;这里我们说的坐标是屏幕坐标
一般情况下你使用 QQ 截图即可完成对目标坐标的获取。
上面的图片中我用截图工具来丈量了 “用户名输入框的坐标位置 (712,183)
我们只要使用MoveTo(712,183)
这样的命令即可把鼠标移动到输入框上
import pyautogui
import time
#用户名输入框
pyautogui.moveTo(712,183)
pyautogui.click()
pyautogui.typewrite("huang")
time.sleep(3)
#密码输入框
pyautogui.moveTo(712,234)
pyautogui.click()
pyautogui.typewrite("11qq1")
#登录按钮
pyautogui.moveTo(712,356)
pyautogui.click()
通过上面这几行代码、用单纯的坐标实现了一个自动化登录的用例、下面我们看一下效果
细心的你应该发现了、坐标是一个固定的值、并且是没有办法断言的、也就是你不知道坐标值下是否有图标;
坐标法 就是人为找到按钮坐标位置、然后模拟鼠标键盘去执行操作
moveTo
没写错、肯定就是把鼠标移动到指定坐标位置在讲颜色识别之前、必须要先简单介绍一下三原色
、颜色值
和像素
我们在显示器上看到的所有色彩都是红绿蓝三种颜色调和而成
颜色值用十六进制来表示
每个颜色的最低值为 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 - 180) # 输入帐号位置
pyautogui.click()
pyautogui.typewrite("17275")
pyautogui.PAUSE = 0.5
其实我们用到的最最主要的就这个方法FindMultiColor()
核心代码就这几行、简单介绍一下步骤
moveTo()
移动鼠标到目标坐标
上面的视频里面有 2 个自动化用例
说起图像识别、那么 OpenCV 大家必须是需要了解的。
这还不止重点、因为我们重点要知道的是 OpenCV 的模版匹配
上面是我翻译过的 OpenCV 的 6 个模版匹配
简单来说、就是用一张模版图片去源图里面匹配、如果匹配到就返回坐标
当我们拿到坐标之后可以做你想做的事情
上面的代码、我们用一张模版图片、在源图里面匹配、然后画一个矩形
代码执行之后的效果如下
这 2 个的底层都是基于 OpenCV 的图像识别;所以我才在前面罗里吧嗦了很久 OpenCV
由于我只会一丢丢的 Python、所以图像识别方案的自动化脚本我用 Airtest 来做的
Airtest 是一个跨平台的 UI 自动化测试框架,适用于游戏和 App。目前支持 Windows 和 Android 平台,iOS 支持已经发布
我直接录制了一个小视频、简单易懂
当你用Selenium
、Appium
、MSAA或者UIA
常规的自动化解决方案都做不了、
但是还想最自动化的时候、可以来看看我的方案。
我们再来回忆一下 UI 测试自动化三板斧;
我们在做 UI 测试自动化的时候、最难办的就是找
和断言
;(一共就 3 个步骤、有 2 个步骤难办、心中一万匹马)
那么 有没有更好的解决方案?