序言

如果你在UI自动化测试中遇到如下问题,那么本文将会给你带来帮助:

做web自动化测试时,由于个别无法识别的元素而Block自动化测试进度。

苦恼于使用python脚本而无法调用sikuli来完成UI元素识别。

定义

Sikuli是由MIT(麻省理工学院)研究团队发布的一种图形化编程技术,使用Sikuli你只需要会写HelloWorld这种最基本的编程技能即可,用Sikuli不需要去写出一行行复杂的代码,而是用屏幕截图的方式,用截出来的图形元素组合出神奇的程序。

Sikuli官网:http://www.sikulix.com/

Sikuli是开源的,源码可在Github查看:https://github.com/sikuli/sikuli

优点

可以测试不易识别或无法定位的对象,比如map 、Flash和图表等;可以验证图片;

缺点

图片匹配区域的大小和样式不能有丝毫变化,所以如果屏幕分辨率、浏览器缩放等,导致图片区域的大小发生变化,就会失败

环境配置

WindowsXP    Windows 8 and 10

Mac OSX 10.6 、10.10+

JDK 1.8以上

把sikulixapi.jar引入到Eclipse中

下载地址https://raiman.github.io/SikuliX1/downloads.html

直接下载sikulixapi.jar即可

 

详解UI自动化测试辅助利器:Sikuli_自动化测试

校验图片是否在当前页面中出现

自动化测试中最常用的场景是判断某图片是否在当前页面中出现,典型的应用场景是校验上传的图片在页面中正常显示。

例如访问百度首页 https://www.baidu.com/

 

详解UI自动化测试辅助利器:Sikuli_java_02

想验证logo是否在首页中出现

详解UI自动化测试辅助利器:Sikuli_java_03

 

思路如下:

1.把图片保存到本地

 

详解UI自动化测试辅助利器:Sikuli_自动化测试_04

 

 

2.打开https://www.baidu.com/

3.调用sikuli相关方法来判断步骤1中的图片是否在百度首页中展示。核心代码如下

import org.sikuli.script.FindFailed;
import org.sikuli.script.Pattern;
import org.sikuli.script.Screen;
 public boolean isPicExist(String p_iconPath){ //本地图片
               Pattern pattern = newPattern(p_iconPath);
               Screen screen = new Screen();    
               try {
                            screen.find(pattern).getImage();
                            returntrue;
 
                     }catch (FindFailed e) {
                            // TODO Auto-generated catch block
                            returnfalse;
                     }、

注意:如果是在远程的机器上执行代码,可以用selenium的截屏方法,在远程机器中进行截屏,然后把截屏文件保存到本地,然后判断截屏图片中是否有需要查找的图片。

核心代码如下:

String findedImage = "D:/pic/baidu.png"; //需要查找的图片
String sreenshotImage="D:/pic/baiduhome.png";//截屏图片
Finder objFinder = newFinder(findedImage);
objFinder.find(Image.create(sreenshotImage));
System.out.println(objFinder.hasNext());

点击页面中的图片

有些web页面中的元素无法识别,我们可以通过点击该元素截屏的方法操控元素。在实际工作中我们经常会用到selenium+sikuli联合的方式进行UI自动化测试。由于屏幕分辨率不同、浏览器缩放等原因,都会导致sikuli匹配图片失败,所以项目中仍然不要以sikuli为主,当面对少数selenium难于识别的web元素时,我们可以引入sikuli来确保UI自动化地顺利进行。下面以在百度中搜索关键字的场景为例,使用selenium结合sikuli的方式来完成自动化测试,具体细节实现如下:

1.使用selenium,在百度首页中输入Selenium关键字

2.使用sikuli,点击下图中的“百度一下”图标(前提是已经把该图标保存到本地)

 

详解UI自动化测试辅助利器:Sikuli_UI_05

3.使用使用selenium 完成校验工作

代码实现如下:

driver.get("https://www.baidu.com/");
         driver.manage().window().maximize();
         Thread.sleep(5000);
         driver.findElement(By.id("kw")).clear();
         driver.findElement(By.id("kw")).sendKeys("selenium");
         Thread.sleep(1000);
         Screens = new Screen();
         try{
              s.click("d:/pic/baidu.png");     
 
           }
         catch(FindFailed e){
                 e.printStackTrace();
         }
 
         Thread.sleep(3000);
          assertTrue(driver.findElement(By.className("nums_text")).getText().contains("百度为您找到相关结果约"));

在python中调用sikuli

因为sikuli使用java编写的,要是想使其在python中被调用,可以使用第三方工具来实现。

最常用的工具是JPype,它的原理是在java虚拟机和python虚拟机中进行本地级的接口来实现的。注意两个虚拟机的位数必须一致,必须都是64位或者32位的。

官网:http://jpype.sourceforge.net/

安装方式:pip install JPype1pi

核心代码如下:

from jpype import *
# C:\ProgramFiles\Java\jdk1.8.0_181\jre\bin\server\jvm.dll
startJVM(getDefaultJVMPath(),"-ea", "-Djava.class.path=D:\pic\sikulixapi.jar")
java.lang.System.out.println("helloworld") #调用System.out.println
Screen =JClass("org.sikuli.script.Screen") #调用sikuli
screen = Screen()
screen.click("D:/pic/news.png")
shutdownJVM()