Mac环境下用Java(Sikuli+Robot)实现页游自动化

转载请注明出自天外归云的博客园:http://www.cnblogs.com/LanTianYou/

Sikulix(以前叫Sikuli)在Mac电脑的环境配置步骤如下:

1、从官网上下载Sikulix最新版本(目前为1.1.0)->下载地址(或者看这里)->下载sikulixsetup-1.1.0.jar (md5)(包名可能略有差别这无所谓);

2、在桌面新创建一个文件夹,命名为Sikulix;

3、把下载的sikulixsetup-1.1.0.jar文件放在Sikulix文件夹下,双击打开;

4、选择你要安装的,我选择了前两项:

5、点击“Setup Now”进行自动安装;

6*、如果过程中出现下载失败的提示,是因为电脑的安全设置造成的。需要手动下载这些提示下载失败的文件(点击进入下载页面)。

7*、手动下载完成后,将下载的文件全都转移到桌面的Sikulix文件夹内,然后重新打开sikulixsetup-1.1.0.jar文件进行安装,随提示一路“Yes”即可。

环境配置至此已经基本完成,下面就可以在Sikulix文件夹中双击打开Sikulix IDE进行使用了:

 

下面我用传奇霸业这款游戏做一下示范,点到为止(打开网页,然后选择左侧栏中的鼠标动作,对需要点击的网页元素进行按序截图):

点击运行,就可以在浏览器中看到我们录制的操作自动运行了。

这就是Sikulix的威力,通过识别图像的方式来实现自动化。详细的介绍和文档,可以看看官方的教程

Sikulix还可以通过Java进行编程,下面我来介绍一下JAVA环境的配置(在安装好JDK之后):

1、查找JAVA_HOME的路径:which java->/usr/bin/java->cd /usr/bin->ls -l|grep java->cd /System/Library/Frameworks/JavaVM.framework/Versions/Curr(tab)->CurrentJDK->ls->cd Home->pwd->这就是JAVA_HOME路径;

2、配置JAVA_HOME的路径:vi ~/.bash_profile->i->配置JAVA_HOME路径到配置文件即完成了配置。

至此,Java的环境就配好了。打开Eclipse,新建项目,如果遇到了Java.lang.Object空引用错误:

1*、修改Eclipse Preference设置->Compiler的java版本号,使和你安装的Java版本一致(我这里装的是1.6,所以Compiler选择1.6);

2*、修改Eclipse Preference设置->Installed JREs->Add->Standard VM->JRE Home->填写JAVA_HOME路径;

3*、重启Eclipse;

4、新建项目,之后就可以按照Sikulix api进行编程了,这里为了更好实现网页flash的自动化,还用到java自己的Robot类。至于准备工作,我们事先需要把Skulix文件夹下的SikulixApi的jar包复制粘贴到当前项目的lib文件夹下(没有的话就创建一个),然后项目上点右键->build configuration一下,把复制粘贴的这些jar包文件都导进来。之后就可以在项目中import相关的库了。

下面拿传奇霸业这款游戏做例子,实现自动打副本的这样一个辅助。首先用一个UserInfo类来封装用户名和密码:

import java.util.Set;

public class UserInfo {
    String userName;
    String passWord;

    public UserInfo() {
        this.userName = "用户名";
        this.passWord = "密码";
    }
}

用Sikulix实现自动化的过程要注意图片元素的截取,不要用QQ截图之类的工具,要用Sikulix IDE来截图,然后把截图转移到专门的目录下:

之后在程序中就可以让Sikuli通过这些图片对应的路径来识别图片,并在网页上找到对应的图形元素,实现自动化点击等操作了:

import java.awt.AWTException;
import
java.awt.Robot; import java.awt.*; import java.awt.event.*; import java.util.*; import java.io.*; import org.sikuli.script.*; import com.opera.core.systems.internal.input.KeyEvent;

public class Test { public static void main(String[] args) throws FindFailed, InterruptedException, IOException, AWTException { Screen screen = new Screen(); String imgPath = "/Users/tylan/Desktop/SikuliPics/test"; String chromeImg = imgPath + "/chrome.png"; String newTabImg = imgPath + "/newTab.png"; String startImg = imgPath + "/start.png"; String loginImg = imgPath + "/login.png"; String fubenImg = imgPath + "/fuben.png"; String bloodImg = imgPath + "/blood.png"; String backHomeImg = imgPath + "/backHome.png"; String zumaReadyImg = imgPath + "/zumaReady.png"; String jinruFubenImg = imgPath + "/jinruFuben.png"; //Visit the CQ site. screen.wait(chromeImg).click(); screen.wait(newTabImg).click(); screen.type("http://cqby.wan.360.cn/game_login.php?server_id=S577&&src=loginhistory"); Robot robot = new Robot(); robot.keyPress(java.awt.event.KeyEvent.VK_ENTER); //Login the game. screen.wait(startImg, 10).click(); Thread.sleep(1000); UserInfo uInfo = new UserInfo(); screen.type(uInfo.passWord); Thread.sleep(2000); screen.wait(loginImg).click(); //Navigate to the fuben. screen.wait(bloodImg, 10); screen.wait(backHomeImg, 3).click(); Thread.sleep(1000); screen.wait(fubenImg, 5).click(); screen.wait(zumaReadyImg, 2).click(); screen.wait(jinruFubenImg, 1).click(); Thread.sleep(3000); robot.keyPress(java.awt.event.KeyEvent.VK_Z); } }

要控制好不同操作之间时间的间隔,控制好等待时间,才能顺利的实现预期的自动化效果。Sikuli是根据图形元素来实现自动化的,所以一定要确保这些图形元素的样式是可以找到的,背景颜色的变化等因素都会影响到自动化能否顺利进行下去。

posted @ 2016-01-03 23:04  天外归云  阅读(2338)  评论(0编辑  收藏  举报