UI自动化实现分三种,第一种基于坐标,二种基于图像,第三种基于元素,本章介绍的自动化工具SikuliX,它不仅提供一个IDE的工具,还提供了SikuliX.jar的java包,供JAVA程序调用。能够以JAVA代码来方式实现自动化。
Python语言之所以被称之为‘胶水语言’,是因为它可以直接调用其他编程语言。当我们想要通过Python来调用SikuliX.jar,是可以通过第三方包jpype来执行JAVA代码的方式来实现。
1.在Python中安装jpype1的第三方扩展包。
在cmd中执行pip install jpype1或者Python –m pip install jpype1,由于使用的Python3.x版本,所以没有用jpype包,而是使用jpype1包(后面不是L,是数字1)如图x-x所示。
图x-x jpype1扩展包安装
当本机上没有jpype-0.6.2包时会自动在网络上搜索镜像文件并安装,很多时候在安装过程中会出现一些错误,如图x-x所示。
图x-x jpype安装错误
如果出现上面的问题,说明需要在系统中安装Visual C++ Build Tools 2015,可以从 http://landinghub.visualstudio.com/visual-cpp-build-tools 这个网址上下载.
2.编写Python调用SikuliX的代码。
(1)安装好jpype1包后,就可以写端Python调用java的代码,看看能否成功。
import jpype #引入jpype模块 jvmPath = jpype.getDefaultJVMPath() #指定jvm的默认路径 jpype.startJVM(jvmPath) #通过jpype启动jvm jpype.java.lang.System.out.println( ‘hello world! ‘) #通过jpype执行java代码 jpype.shutdownJVM() #关闭jvm |
如果环境没有问题,能够正常调用JVM时,上面代码在Python执行结果如图x-x所示。
图x-x Python执行java代码
(2)由于需要通过java来调用SikuliX.jar的java包,所以需要注意自己电脑上java的版本,SikuliX1.1.1是支持jdk8的,所以可以在https://java.com/en/download/manual.jsp下载jdk8。
(a)配置java环境变量:
首先,右键计算机---属性---高级系统设置---环境变量;建议是都设置系统变量,一般Path这个变量是存在的。
(b)添加JAVA_HOME:
新建系统变量JAVA_HOME
变量名:JAVA_HOME
变量值:C:\ProgramFiles\Java\jdk1.8.0(此处是你的jdk安装目录,建议默认的C盘即可)
(c)添加CLASSPATH:
新建系统变量CLASSPATH
变量名:CLASSPATH
变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar;
(d)添加Path变量内容:
这个变量一般系统中已经存在,所以编辑它,在最后加上如下变量值:
变量值:.;%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;
添加完成之后,确认保存。
(3)通过Python调用SikuliX.jar来操作蜗牛进销存系统。
想要用Python调用jar的java包,不光需要通过jpype模块,还需要明确引入SikuliX.jar的扩展包。前面直接调用java的代码明显不能满足要求,缺乏引入指定jar包的方法。在startJVM()函数中,不光有指定JVM路径的参数,还有args参数,可以将指定的扩张包交给JVM编译。那么在代码中就可以加入SikuliX.jar的包。其作用相当于在java代码中import SikuliX。既然可以引入jar包,那么执行SikuliX操作可以有两种方式来实现,第一种:在java中直接调用SikuliX.jar。然后将SikuliX的操作代码打包成jar文件,在Python中调用;第二种:在Python中通过jpype引入SikuliX.jar。然后在后面直接调用java来执行SikuliX来操作页面。这里就只演示后者。
import jpype #引入jpype模块来执行java代码 import os,time jvmpath = jpype.getDefaultJVMPath() #指定java的JVM路径 jarpath = os.path.join(os.path.abspath('.'), 'G:/SikuliX/SikuliX/SikuliX/') #指定jar包路径 if not jpype.isJVMStarted(): #判断JVM是否启动 jpype.startJVM(jvmpath,'-Djava.class.path=%s'%(jarpath+'SikuliX.jar')) system = jpype.java.lang.System #为System调用定义一个变量,方便后面使用 javaclass = jpype.JClass('org.Sikuli.script.Screen') #引入SikuliX中的Screen类 s = javaclass() #实例化Screen类得到对象 s.doubleClick('D:/Sikulitest/1515658316113.png') #通过Screen对象操作 time.sleep(10) #SikuliX包中没有了Sikuli-script包中的wait()函数,用线程休眠代替 s.click('D:/Sikulitest/1515660994865.png') s.type('http://localhost:8080/WoniuSales/\n') time.sleep(2) s.click('D:/Sikulitest/1515738489187.png') time.sleep(2) s.click('D:/Sikulitest/1515738607167.png') s.type('18781163070') s.click('D:/Sikulitest/1515739177258.png') jpype.shutdownJVM() #关闭JVM |
这里只是实现了Python代码的jar包调用,具体用于测试的验证点插入就省略了,和IDE一样的方法就不在赘述,只是在使用的时候需要注意一些IDE里的方法代码里没有,比如wait(),我们可以使用time的sleep()函数来解决。如果想要得到wait()方法相同的效果,也就是在一个超时时间范围内一直等待,需要自己封装一个方法来实现。
def wait_element(n,img): #n是自定义超时时间,数据类型为int,img是要等待的元素 if type(n) == int: for i in range(n): if exists(img): #如果存在该图片,等待结束 break else: time.sleep(1) #如果不存在,1秒后再找 else: return Flase #超时后,直接返回元素找不到 else: print(‘超时时间类型错误,请输入整型’) return True |
这样,在需要的时候调用该方法,一样可以在一个自定义的超时时间范围内等待目标元素出现。
下期推送:利用Python开发图像识别测试框架
为了答谢大家对蜗牛学院的支持,蜗牛学院将会定期对大家免费发放干货,敬请关注蜗牛学院的官方微信。