序言
如果你在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即可
校验图片是否在当前页面中出现
自动化测试中最常用的场景是判断某图片是否在当前页面中出现,典型的应用场景是校验上传的图片在页面中正常显示。
例如访问百度首页 https://www.baidu.com/
想验证logo是否在首页中出现
思路如下:
1.把图片保存到本地
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,点击下图中的“百度一下”图标(前提是已经把该图标保存到本地)
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()