推荐一个自动化的工具——Sikuli

最近组里计划在几十台虚机上使用Sikuli模拟400个用户操作软件来测试软件,以达成Load Test的效果。之前用Sikuli反复执行一个操作来以检测内存泄漏的情况,感觉还不错,所以特意推荐一下。

我们系统有一个模块是用WPF写的,无法像其他Windows程序那样,通过句柄来找控件并操作。Sikuli是基于图像识别的,正好可以达到要求。

不过Sikuli是一个开源软件,而且正处于成长阶段,所以功能并不能说很全,也经常会出现一些问题。大家如果感兴趣可以试试。

以下内容摘自Sikuli的官方网站:http://sikuli.org/ 。

What’s SIKULI?

  Sikuli is a visual technology to automate and test graphical user interfaces (GUI) using images (screenshots). Sikuli includes Sikuli Script, a visual scripting API for Jython, and Sikuli IDE, an integrated development environment for writing visual scripts with screenshots easily. Sikuli Script automates anything you see on the screen without internal API’s support. You can programmatically control a web page, a Windows/Linux/Mac OS X desktop application, or even an iphone or android application running in a simulator or via VNC.

 

  How Sikuli Works

  ../_images/SystemDesign.png 

  

  Sikuli Script

  Sikuli Script is a Jython and Java library that automates GUI interaction using image patterns to direct keyboard/mouse events. The core of Sikuli Script is a Java library that consists of two parts: java.awt.Robot, which delivers keyboard and mouse events to appropriate locations, and a C++ engine based on OpenCV, which searches given image patterns on the screen. The C++ engine is connected to Java via JNI and needs to be compiled for each platform. On top of the Java library, a thin Jython layer is provided for end-users as a set of simple and clear commands. Therefore, it should be easy to add more thin layers for other languages running on JVM, e.g. JRuby, Scala, Javascript, etc.

  The Structure of a Sikuli source/executable script (.sikuli, .skl)

  A Sikuli script (.sikuli) is a directory that consists of a Python source file (.py), and all the image files (.png) used by the source file. All images used in a Sikuli script are simply a path to the .png file in the .sikuli bundle. Therefore, the Python source file can also be edited by any text editor.

  While saving a script using Sikuli IDE, an extra HTML file is also created in the .sikuli directory so that users can share the scripts on the web easily.

  A Sikuli executable script (.skl) is simply a zipped file of all files in the .sikuli directory. When a script is passed to Sikuli IDE as a command line argument, Sikuli IDE recognizes its type by check its filename extension. If a .skl is seen, Sikuli IDE runs it without showing the IDE window. If a .sikuli is seen, Sikuli IDE opens it in a source code editor.

  Sikuli IDE

  Sikuli IDE edits and runs Sikuli source scripts. Sikuli IDE integrates screen capturing and a custom text editor (SikuliPane) to optimize the usability of writing a Sikuli script. To show embedded images in the SikuliPane, all string literals that ends with ”.png” are replaced by a custom JButton object, ImageButton. If a user adjusts the image pattern’s similarity, a Pattern() is automatically constructed on top of the image.

  To execute a Sikuli script, Sikuli IDE creates a org.python.util.PythonInterpreter and automatically passes a few lines of headers (e.g. to import Sikuli’s Jython modules, and to set the path to .sikuli directory) to the interpreter. Once these headers are set, the .py script is simply executed by PythonInterpreter.execfile().

  下面是一个示例程序,演示如何选中当前屏幕中的所有复选框。

  Uncheck All Checkboxes

  In this tutorial, we will demonstrate how to use a for loop to interact with multiple instances of a GUI component. Suppose we want to uncheck all the check boxes in a window, such as the Sharing preferences window shown below:

../../_images/uncheck_sharing.png

  Unfortunately, there is no “uncheck all” function available. The solution? Write a Sikuli Script to look for ALL the checked items and uncheck them automatically. The function needed for this operation is findAll().

  First, let’s capture the screenshot image of a checked item.

../../_images/uncheck_capturing.png

  Then, we can insert the image into the findAll() function.

../../_images/uncheck_findall.png

  findAll() searches the entire screen for all the matching visual patterns and returns a list of locations of those similar patterns. This capability allows us to obtain all the checked items are on the screen. Then, we can simply write a for loop in standard Python syntax and call click() on each element in the list.

../../_images/uncheck_code.png

  When this script is executed, Sikuli will find all the items that are currently checked and click on each item one by one in the loop.

  Sikuli中有几个比较重要的概念:RegionScreenLocationPatternMatchFinder等。

  具体请参考官方网站。

  如果你公司有一个签到的系统的话,可以用这玩意自动签到。 :)

✏️ 有任何想法?欢迎发邮件告诉老夫:daozhihun@outlook.com