推荐一个可以用于辅助Selenium自动化的桌面自动化工具-SuperPatrick,经过测试使用过后,效果整体来说还不错,貌似也有一些问题,后文会简单说明一下;
官方网址:http://www.autotestops.com/
官方SDK链接:http://www.autotestops.com/index/superpatrick.html
SuperPatrick工具整体是使用C++开发实现的,而且可以跨语言开发(调用Dll,:)),元素定位、查找的速度应该是很快的,但有部分方法找到元素后作用到桌面点击并不是很快,感觉可能是开发者应该是在执行过程中增加了延时,具体哪些有延时哪些无延迟后续会说;
SuperPatrick还提供了桌面的定位器,而且使用这个定位器定位到的控件属性,可以跨语言的开发,这个还是挺亮眼的,经过测试了一下,桌面的大部分控件都能定位的到,一些厂商自己扩展封装的桌面控件有些定位不到;有点儿像AutoIT但是整体来说比AutoIT要准一些,也快一些;
SuperPatrick的findElement的点击事件就需要使用这个定位器来提供定位数据进行开发,如何使用这里就不多做介绍了,可以去这两篇文章查看,一个是老版的定位器说明,一个是新增图像识别的定位器说明:
http://www.autotestops.com/index/xq/cid/28/id/23.html
http://www.autotestops.com/index/xq/cid/28/id/41.html
然后通过浏览SuperPatrick的接口文档,发现目前提供了如下的几个使用方法,详情参数使用方法可以去官网查看;
1.发送字符
void sendKeys(char* pKeysString);
2.快捷键
void sendShortCutKeys (char* pKeysString)
3.查找桌面元素,默认会点击(左键)
bool findElement(char* pStrId, char *pStrName, char *pStrClassName, char* pStrControleType)
4.全屏图像识别,默认点击一次(左键)
bool findImage(char *strPartImage)
5.相对坐标图像识别,默认点击一次(左键)
bool findStaticImage(char *strPartImage, int left, int top, int right, int bottom)
6.基于窗口句柄的图像识别点击,默认点击一次(左键)
bool findImageByHwnd(char *strClass, char *strTitle, char *strPartImage)
当前只有着六个方法提供,结合上面说的部分点击事件有延时,以上的点击事件方法中,只有findStaticImage这个方法是没有点击延时的,可以做到类似于双击的连续点击,给我感觉很可能是忘了加上延时了,漏了一个;
这里简单说明一下,最后的findStaticImage跟findImageByHwnd方法,发现了一个比较奇怪的情况,就是图像查找不到的情况,应当返回false,但是一直都是返回true,随后特意的测试了一下,貌似目前是这个情况,findImage的true以及false的返回情况是正常的,这两个暂时貌似一直是true;
话不多说,上个官网上不使用图像识别的例子看看吧,代码如下:
import com.sun.jna.Library;
import com.sun.jna.Native;
public class SuperPatrickTest {
public interface SuperPatrickLibrary extends Library {
void findElement(String pStrId, String pStrName, String pStrClassName, String controlType);
void sendKeys(String pKeysString);
void sendShortCutKeys(String pKeysString);
}
public static void main(String[] args) throws InterruptedException {
System.setProperty("jna.encoding","GBK");
String dllPath = "C:/1/SuperPatrickLibrary.dll";
SuperPatrickLibrary superpatrick = (SuperPatrickLibrary) Native.loadLibrary(dllPath, SuperPatrickLibrary.class);
superpatrick.findElement("307","显示桌面","","Button");
superpatrick.sendShortCutKeys("{WIN}r");
Thread.sleep(2000);
superpatrick.sendKeys("notepad");
superpatrick.sendShortCutKeys("{Return}");
Thread.sleep(500);
superpatrick.sendKeys("欢迎使用来到AutoTestOps测试开发专业网站!!!");
Thread.sleep(500);
superpatrick.findElement("","文件(F)","","MenuItem");
superpatrick.findElement("3","保存(S) Ctrl+S","","MenuItem");
Thread.sleep(500);
superpatrick.sendKeys("test.txt");
superpatrick.findElement("1","","Button","Button");
superpatrick.findElement("CommandButton_6","是(Y)","CCPushButton","Button");
superpatrick.findElement("","关闭","","Button");
}
}
代码的执行效果这里我就引用一下官网的实际操作动图,如下
注:其余语言的具体代码可以http://www.autotestops.com/index/alist/pid/10/cid/28.html上面查看,这里只做一下Java版本解析;
这段代码主要完成的事情流程如下:
1.点击电脑屏幕右下角按钮-显示桌面
superpatrick.findElement("307","显示桌面","","Button");
2.win键+R键-弹出“运行”
superpatrick.sendShortCutKeys("{WIN}r");
3.输入notepad
superpatrick.sendKeys("notepad");
4.键入“回车键”,这样就是在命令行打开记事本
superpatrick.sendShortCutKeys("{Return}");
5.在记事本中输入“欢迎使用来到AutoTestOps测试开发专业网站!!!”
superpatrick.sendKeys("欢迎使用来到AutoTestOps测试开发专业网站!!!");
6.点击记事本中“文件(F)”按钮
superpatrick.findElement("","文件(F)","","MenuItem");
7.点击“文件(F)”菜单中的“保存(S)”按钮
superpatrick.findElement("3","保存(S) Ctrl+S","","MenuItem");
8.当前焦点已经停留在了文件名的输入处,输入文件名称“test.txt”
superpatrick.sendKeys("test.txt");
9.点击“保存”按钮
superpatrick.findElement("1","","Button","Button");
10.貌似是由于文件重名,这里加了一个点击“是”的按钮
superpatrick.findElement("CommandButton_6","是(Y)","CCPushButton","Button");
初次试用,就先到这里吧,后续的图像识别的例子说明,后续琢磨琢磨再;