实验:通过Python代码来实现SikuliX的调用
作者:强官涛   类型:Python开发    类别:实验   日期:2019-07-04    阅读:1752 次   消耗积分:0 分


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所示。


20190704_151953_571.png

图x-x jpype1扩展包安装


当本机上没有jpype-0.6.2包时会自动在网络上搜索镜像文件并安装,很多时候在安装过程中会出现一些错误,如图x-x所示。


20190704_152002_878.png

图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所示。


20190704_152017_188.png

图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开发图像识别测试框架




为了答谢大家对蜗牛学院的支持,蜗牛学院将会定期对大家免费发放干货,敬请关注蜗牛学院的官方微信。


20190320_095757_834.jpg




版权所有,转载本站文章请注明出处:蜗牛学院在线课堂, http://www.woniuxy.com/note/333
上一篇: 资讯:他说:我转IT就是因为头发太多了!
下一篇: 资讯:这次开班不一样!
提示:登录后添加有效评论可享受积分哦!