文章目录
- 什么是SikuliX?
- SikuliX的使用场景
- 安装SikuliX
- 常用方法
- 查找
- 鼠标
- 键盘
- 其他
- 示例脚本
- 示例一 自动抢票
- 示例二 自动打开计算器
- 示例三 自动访问CSDN博客搜索博主并关注
- 其他
- SikuliX原理
- SikuliX脚本
- Sikuli 源文件夹或压缩文件(.sikuli、.skl)的结构
- 缺点
官网: http://sikulix.com/
Github:https://github.com/sikuli/sikuli
教程:
-
https://sikulix-2014.readthedocs.io/en/latest/toc.html
-
https://sikulix-2014.readthedocs.io/en/latest/genindex.html
什么是SikuliX?
SikuliX(西库里)可自动执行在运行Windows,Mac或某些Linux / Unix的台式计算机屏幕上看到的所有内容。 它使用OpenCV提供的图像识别功能来识别GUI组件。 在无法轻松访问GUI内部或要操作的应用程序或网页的源代码的情况下,这非常方便。
SikuliX支持脚本语言
- Python语言级别2.7(由Jython支持)
- 支持运行RobotFramework文本脚本
- Ruby语言级别1.9和2.0(由JRuby支持)
- JavaScript(由Java脚本引擎支持)
…,您可以将它用于Java编程和任何Java感知编程/脚本语言(Jython,JRuby,Scala,Clojure等)的编程/脚本中。
除了在屏幕上定位图像之外,SikuliX还可以运行鼠标和键盘来与标识的GUI元素进行交互。它适用于多监视器环境,甚至适用于某些限制的远程系统。
SikuliX带有基本文本识别(OCR),可用于搜索图像中的文本。此功能由Tesseract支持。
SikuliX是一个Java应用程序,可在Windows,macOS和大多数Linux / Unix系统上运行。
SikuliX支持脚本方式和编程方式,本文只介绍脚本方式,编程方式的话后面和selenium一起探讨。
最新稳定版本为2.0.5 (当前时间2023.06.19)
SikuliX的使用场景
您想自动化一些重复性任务
- 应用程序或网页的日常使用
- 玩游戏
- IT系统和网络的管理
…而且您手头没有足够的工具。
您想要测试正在开发的应用程序或网页。
您想要创建在指定应用程序或网页上实时运行的使用文档或培训材料。
您已经拥有相应的工具和工作流程,但您希望添加SikuliX的特定功能以增强您的方法并提高效率和结果。
安装SikuliX
1.安装JDK64 位 (版本 8 或更高版本)
2.下载SikuliIDE,不同的操纵系统选择不同的包下载。
-
Windows: Download the ready to use sikulixide-2.0.5-win.jar (SikuliX IDE for Windows)
-
macOS: Download the ready to use sikulixide-2.0.5-mac.jar (SikuliX IDE for macOS)
-
Linux: Download the ready to use sikulixide-2.0.5-lux.jar (SikuliX IDE for Linux)
常用方法
Screen类是Sikuli提供的所有方法的基类。Screen类包含用于屏幕元素上所有常用操作的预定义方法,如单击、双击、向文本框提供输入、悬停等。下面是Screen类提供的常用方法列表。
由于类 Screen 扩展了类Region
,因此类 Region 的所有方法都可用于 Screen 对象。
请注意,使用整个屏幕进行查找操作会对性能产生影响。因此,如果可能的话,将查找操作限制在较小的区域对象(例如
reg.find()
)以加快处理速度。
查找
方法 | 描述 |
---|---|
find | 此方法用于在屏幕上查找特定元素。 它接受图像名称作为参数。 |
findAll | 在整个屏幕上搜索所有匹配的视觉模式,并返回这些相似模式的位置列表。此功能允许我们获取屏幕上的所有选中项目。 |
wait | 等待指定图案加载完成。 |
wait | 等待几秒。 |
waitVanish | 不断搜索该区域中的指定图案,直到图像消失 |
exists | |
sleep | 让电脑歇一下,不要急于执行下面的语句。单位为秒 |
鼠标
命令 | 描述 |
---|---|
click | 左键点击元素 |
rightClick | 右键点击元素 |
hover | 鼠标悬停在指定元素上 |
dragDrop | 拖动,dragDrop(“1606202686079.png”, “1606202694506.png”) #将第一个元素拖动至第二个元素位置 |
paste | 文本输入(建议使用,单纯的复制的你的内容并进行粘贴) |
键盘
按键 | 命令 |
---|---|
Shift | type(Key.SHIFT) |
Ctrl | type(Key.CTRL) |
Alt键 | type(Key.ALT) |
Tab(制表符) | type(Key.TAB) |
大写锁定 | type(Key.CAPSLOCK) |
输入 | type(Key.ENTER) |
删除 | type(Key.DELETE) |
退格键 | type(Key.BACKSPACE) |
插入 | type(Key.INSERT) |
Home | type(Key.HOME) |
End | type(Key.END) |
ESC | type(Key.ESC) |
空格 | type(Key.SPACE) |
视窗 | type(Key.WIN) |
换页 | type(Key.PAGE_UP) |
向下翻页 | type(Key.PAGE_DOWN) |
列印画面 | type(Key.PRINTSCREEN) |
数字键盘锁 | type(Key.NUM_LOCK) |
滚动锁 | type(Key.SCROLL_LOCK) |
F1 | type(Key.F1) |
F2 | type(Key.F2) |
F3 | type(Key.F3) |
F4 | type(Key.F4) |
F5 | type(Key.F5) |
F6 | type(Key.F6) |
F7 | type(Key.F7) |
F8 | type(Key.F8) |
F9 | type(Key.F9) |
F10 | type(Key.F10) |
F11 | type(Key.F11) |
F12 | type(Key.F12) |
光标键:向上 | type(Key.UP) |
光标键:向下 | type(Key.DOWN) |
光标键:左 | type(Key.LEFT) |
光标键:向右 | type(Key.RIGHT) |
向上移动光标两次 | type(Key.UP * 2) |
向下移动光标两次 | type(Key.DOWN * 2) |
向左移动光标两次 | type(Key.LEFT * 2) |
向右移动光标两次 | type(Key.RIGTH * 2) |
按特定键 | KeyDown(Key.*) 需要使用Region()进行区域设置。 |
释放特定键 | KeyUp(Key.*) 需要使用Region()设置区域。 |
运算符
运算 | 命令 |
---|---|
加成 | + |
减法 | – |
乘法 | * |
除 | / |
余数计算 | % |
除数的整数部分 | // |
A的b次方 | A ** B |
A的负数 | -A |
逻辑或 | or |
逻辑与 | and |
否认 | not |
a大于b | a > b |
a小于b | a < b |
a小于或等于b | a <= b |
a大于或等于b | a >= b |
a等于b | a == b |
a不等于b | a != b |
快捷键
常见操作 | 快捷键 | 命令 |
---|---|---|
复制 | Ctrl + C | type(“c” , Key.CTRL) |
剪下 | Ctrl + X | type(“x” , Key.CTRL) |
贴上 | Ctrl + V | type(“v” , Key.CTRL) |
搜索 | Ctrl + F | type(“f” , Key.CTRL) |
打印 | Ctrl + P | type(“p” , Key.CTRL) |
撤消 | Ctrl + Z | type(“z” , Key.CTRL) |
重做 | Ctrl + Y Ctrl + Shift + Z | type(“y” , Key.CTRL); type(“z” , Key.CTRL + Key.SHIFT) |
关闭标签 | Ctrl + F4 | type(Key.F4 , Key.CTRL) |
还原标签 | Ctrl + Shift + T | type(“t” , Key.CTRL + Key.SHIFT) |
浏览器缓存刷新(强制刷新) | Ctrl + F5 | type(Key.F5 , Key.CTRL) |
关闭窗口 | Alt + F4 | type(Key.F4 , Key.ALT) |
最小化所有窗口 | Windows + M | type(“m” , Key.WIN) |
显示桌面 | Windows + D | type(“d” , Key.WIN) |
最小化窗口(当窗口为正常大小时)恢复为原始大小(当窗口为最大化时) | Windows + 光标键:向下,如果最大化,请执行上述两次。 | type(Key.DOWN , Key.WIN) |
窗口最大化 | Windows +光标键:向上 | type(Key.UP , Key.WIN) |
切换活动窗口 | Windows + Tab; Windows + Shift + Tab | type(Key.TAB , Key.WIN); type(Key.TAB , Key.WIN + Key.SHIFT) |
启动任务管理器 | Ctrl + Shift + ESC | type(Key.ESC , Key.CTRL + Key.SHIFT) |
启动资源管理器 | Windows + e | type(“e” , Key.WIN) |
其他
打开应用
#打开应用程序,注意应用程序的路径名里的斜杠“\”要改为双斜杠“\\”。
openApp(应用程序路径名)
#closeApp
#switchApp
If语句
if 条件 and 条件: #(注意有冒号,‘#’号表示注释)
语句
循环语句
for x inrange(10): #循环10次,x不用预先定义
循环体
弹出输入框
# 显示一个输入框,以供输入。要输入中文应该在前面加u,不然会乱码
input(u"字符串")
弹出提示框
popup("Obama has updated his message")
操作文件
#打开 写文件
f=open('c:/wy.txt','a')
t="hello\n"
f.write(t)
f.close()
#打开 读文件
f=open('c:/wy.txt','r')
t=f.read()
popup(t)
#open(路径+文件名,读写模式)
#读写模式:r只读,r+读写,w新建(会覆盖原有文件),a追加,b二进制文件.常用模式
示例脚本
示例一 自动抢票
流程:
1.打开浏览器输入抢票的网址
2.循环点击抢票按钮
这里用登入按钮代替抢票按钮哈。
脚本截图:
脚本代码:
n = 10
find("1687314581241.png")
for i in range(n):
click(Pattern("1687314614204.png").targetOffset(116,-4))
sleep(1)
print "done"
示例二 自动打开计算器
流程:
1.打开Windows搜索
2.输入calc
3.输入1+1
4.按=
进行计算
脚本截图:
脚本代码:
click("1687331888480.png")
paste("calc")
type(Key.ENTER)
type(Key.ENTER)
wait(2)
paste("1+1")
wait(1)
click("1687332030574.png")
print("done")
示例三 自动访问CSDN博客搜索博主并关注
流程:
1.在桌面找到Chome浏览器
2.双击Chome浏览器
3.sleep 2秒
4.等待Chrome浏览器打开
5.敲击回退键
6.敲击https://www.csdn.net/
7.敲击ENTER键
8.敲击ENTER键
9.sleep 4秒等待浏览器加载内容
10.等待csdn加载完成
11.敲击lakernote
12.敲击ENTER键
13.敲击ENTER键
14.等待搜索完成
15.鼠标点击用户
16.鼠标点击关注
17.关闭浏览器
脚本截图:
脚本代码:
find("1687269549891.png")
doubleClick(Pattern("1687269549891.png").targetOffset(3,-21))# 点击指定图案的指定位置
sleep(2)
wait(Pattern("1687269907253.png").similar(0.60)) # 指定图案命中相似度为0.6,更容易命中
type(Key.BACKSPACE)
type("https://www.csdn.net/")
type(Key.ENTER)
type(Key.ENTER)
sleep(4)
wait("1687270102974.png")
type("1687270102974.png","lakernote")
type(Key.ENTER)
type(Key.ENTER)
sleep(2)
click("1687270231840.png")
sleep(2)
click("1687270273555.png")
sleep(3)
click("1687270623962.png")
其他
find("png") # 在整个电脑屏幕的范围内去找图标
r = Region("png")
r.find("xx") # 在指定的范围内找图标
if exists("查看的内容图片"):
click("查看的内容图片")
print"断言的内容"
else:
print("断言的内容")
for x in findAll(png):
click(x)
while exists(png):
sleep(5)
popup("vgod just logged off")
while not find(png):
sleep(1)
else:
print "not found", png
keyDown((Key.CTRL) # 一直按着
keyUp(Key.CTRL) # 松开
# 方位
Nearby(number)、above()、below()、left()、right()、getCenter()
SikuliX原理
https://sikulix-2014.readthedocs.io/en/latest/devs/system-design.html
SikuliX脚本
Sikuli Script(Sikuli脚本)是一个基于Jython和Java的库,可以使用图像模式来自动化GUI交互,通过图像模式来指定键盘/鼠标事件。Sikuli Script的核心是一个Java库,由两部分组成:
- java.awt.Robot(用于向适当位置发送键盘和鼠标事件的类)
- 以及基于OpenCV的C++引擎(用于在屏幕上搜索给定的图像模式)
C++引擎通过JNI与Java连接,并且需要为每个平台进行编译。在Java库的基础上,为最终用户提供了一个简单明了的命令集作为一层薄薄的Jython封装。因此,很容易为在JVM上运行的其他语言(如JRuby、Scala、Javascript等)添加更多薄薄的封装层。
Sikuli 源文件夹或压缩文件(.sikuli、.skl)的结构
Sikuli脚本(.sikuli)是一个目录,其中包含一个表示自动化工作流程或测试用例的Python源文件(.py),以及源文件使用的所有图像文件(.png)。Sikuli脚本中使用的所有图像只是一个指向.sikuli捆绑包中.png文件的路径。因此,Python源文件也可以使用任何文本编辑器进行编辑。
在使用Sikuli IDE保存脚本时,可以选择在.sikuli目录中创建一个额外的HTML文件,以便用户可以轻松地在Web上共享脚本的可视副本。
Sikuli压缩脚本(.skl)只是.sikuli文件夹中所有文件的压缩文件。它适用于通过电子邮件或Web上传进行分发,也可以从命令行运行并在Sikuli IDE中重新打开。(以前称为“Sikuli可执行文件”已被弃用,因为这样命名是误导性的:人们通常会认为它类似于一个自包含和自运行的软件包,类似于Windows的EXE文件,但实际上不是这样的)
缺点
- 依赖屏幕截图,使其在不同的操作系统上,不同的浏览器中,甚至是不同的显示分辨率下,需要独立维护一套图形源文件,对于其跨平台的能力造成障碍。
- 由于对于截图的检索依赖于实时的桌面显示,若出现程序逻辑之外的意外界面遮挡或焦点切换(如,弹出窗口等),则会对程序执行造成影响。
- IDE 处于开发初级阶段,稳定性和易用性存在一定问题。其本身仅支持初级的代码编辑功能,对于规模较大的代码开发和调试工作仍存在不便之处。其在 Windows 平台和 Linux 平台上的运行稳定性也稍逊于在 MacOSX 上的表现。