背景
最近负责的软件,新增了一个准入校验的功能,它会检测用户当前的环境是否存在有问题来确定是否能够允许用户进行连接, 但是因为服务本身的不稳定,导致经常概率性的出现上一次已经校验通过了,结果再次连接的时候,又提示失败的情况。而开发又告诉你说这个问题它已经解决了,需要你自己验证,那有没有可能有一个工具能够快速帮我们做这种重复的执行的动作,来验证我可能重复了100次的操作,都是没有问题的。
介绍
这里就要隆重介绍下SikuliX 了。
并且sikulix 也提供了IDE的编辑界面,方便我们快速的进行自动化脚本的编写
菜单栏与工具栏非常简单,下面介绍一下这几个按钮是干嘛用的
屏幕截图(Take screenshot):点击该按钮,进入屏幕截图状态,拖拽辅助线选取需要截取的界面元素,释放鼠标左键的同时,自动将该截图插入到编辑区中光标当前位置。使用快捷键 Ctrl+Shift+2(Command+Shift+2)也可激活截图状态,以完成对于弹出菜单、下拉框一类的控件的实时截图。该快捷键亦可通过主菜单 File->Preferences 进行自 定义。
插入图片(Insert image):除直接截图外,用户也可通过点击该按钮导入已有的 PNG 格式图片文件。
建立屏幕区域(Create region):点击该按钮,进入屏幕区域选择状态,拖拽定位十字线选取屏幕区域。释放鼠标左键,即可将当前选中区域的屏幕坐标信息插入到编辑区中。
运行(Run):点击执行当前脚本。快捷键为 Ctrl+R(Command+R)。
如下是SukuliX提供的一些常用的命令:
openApp(someApp) # 我们使用一个应用程序 someApp
click(imageButton) # 我们点击某个按钮
wait(imageExpected1) # 我们等待应用做出反应并在屏幕上显示预期的结果
type(“some text”); type(Key.ENTER) # 我们填写一些文本并按 ENTER 键
wait(imageExpected2) # 再次等待一些预期的反应或结果
案例
背景: 现在我们的翼察软件软件有一个bug, 即程序在进行零信任连接的时候,有概率出现检测出错,或者说检测不通过的情况 (这两种都是与实际不符合的),现在我们需要通过自动化的方式去统计下,这个出现的概率有多大。
我们先看下界面以及预期的结果是什么样的
我们需要点击这里的连接按钮:
若正常连接成功,则界面就会变成这个样子,存在一个断开连接的按钮
但是这连接的过程中可能可能又会出现一些异常的情况如:
所以根据了上述的场景,我们就可以整理出如下的脚本内容了:
for i in range(5):
# 点击连接按钮
click("1715527464212.png")
# 检测是否存在重试的按钮
if exists("1715528024229.png", 40):
# 点击关闭按钮
click("1715589381387.png")
else:
# 是否存在断开按钮
if exists("1715590998797.png", 10):
# 点击断开按钮
click("1715590998797.png")
time.sleep(10)
这样子我们就把一个小流程给跑完了,以上的图片是直接通过工具栏截图得到。
改进
上面流程是写完了,但是有几个问题
1. 缺少一些日志的记录,也不知道测试的情况如何
2. 缺少一些关键的截图操作,如果出现重试的情况,是不是应该做一个截图,确实是出现了这个,而不是脚本误报的情况
对于问题1, 因为前面说过,sikuli是只是的python的,所以我们完成可以借助python的文本处理的逻辑来满足日志的写入
对于问题2 sikuli还额外提供了一个 capture
的api, 支持对某个区域进行截图,并返回保存的文件路径。所以我们看下最终代码的结果
import time
import shutil
def save_png(file_name):
save_path = capture(0,0,1920,1080)
shutil.move(save_path, "./" + file_name)
with open("1.txt", 'w') as log_file:
for i in range(105):
log_file.write(str(i) + "\n")
# 点击连接按钮
click("1715527464212.png")
if exists("1715528024229.png", 40):
log_file.write("存在检测异常\n")
log_file.write("关闭窗口\n")
save_png("检测异常" + str(i) + ".png")
click("1715589381387.png")
elif exists("1715607084122.png", 5):
log_file.write("检测失败,存在重试失败\n")
save_png("重试" + str(i) + ".png")
click("1715613366374.png")
else:
if exists("1715590998797.png", 10):
click("1715590998797.png")
time.sleep(10)
log_file.write("检测通过\n")
else:
log_file.write("未匹配到断开按钮\n")
save_png("其他" + str(i) + ".png")
通过这上面的结果我们就清楚知道这次自动化执行过程出现了几次问题了。