Mac环境下用Java(Sikuli+Robot)实现页游自动化
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类。拿传奇霸业这款游戏做例子,实现自动打副本的这样一个辅助。首先 用一个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; import com.thoughtworks.selenium.Selenium; 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是根据图形元素来实现自动化的,所以一定要确保这些图形元素的样式是可以找到的,背景颜色的变化等因素都会影响到自动化能否顺利进行下去。