写在前面:

  老大让我写个脚本自动给他写dms有一段时间了,说实话当时不知道老大指的这个脚本是什么?毕竟是做web的,难道是写个数据库sql语句脚本吗?也就放在了一边。巧了,最近一个朋友说他之前写了个程式,我就问了一下。哇,这不正是我想要的!他是做了一个可以自动登录网站,然后自动填写日报的程式。看了之后感觉很棒,于是请教了一下。

  朋友的程式是用的c#做的,然后内嵌了一个浏览器控件webbrowser。一下子恍然大悟,还可以这么玩。平时工作也没有接触到浏览器控件,于是赶紧去搜索java的浏览器控件。然后最后也花了点时间,还好,马马虎虎的完成了任务。

  思路:

  使用javase做一个桌面应用程序,弹出一个框,然后里面内嵌一个浏览器,可以模拟自动登录网站,并可以自动填写日报,达到想要的效果。

  对于使用java弹出一个应用框是很好实现的,使用JFrame来实现就好了,主要是如何在弹出框里面内嵌一个浏览器?

  首先百度,java浏览器控件,出来的就是jxbrowser,于是去查资料了解

  想要做一个自动登录网站的应用,使用javase,内嵌一个浏览器是很好的选择。这样就避免了一些cookie之类的设置。

  jxbrowser是什么?

  jxbrowser是一个java浏览器控件,是基于chromium内核的。(如果要自动登录的系统是适应ie浏览器的,那么有可能使用此款浏览器控件,在有些功能上不兼容适用。这里稍微注意下,以免踩坑)

  如何使用?

  首先去下载,http://www.pc0359.cn/downinfo/95385.html,下载下来后进行解压

  

  对于如何破解,可以参考对应的资料,https://blog.csdn.net/Jumenglo/article/details/79459102

  下面简单看下项目的破解步骤:

  1.创建java项目,导入相关的jxbrowser需要的jar包,(在解压的目录下就可以复制);然后在解压文件里找对对应的demo,复制META-INF文件夹(证书),到自己的项目目录下。然后这个时候如果对应的证书的期限到了,是无法使用的,所以要破解。

  2.打开证书teamdev.licenses,直接复制下面的代码,即可。

Product: JxBrowser
Version: 6.x
Licensed to:
License type: Enterprise
License info: JxBrowser Demo License
Expiration date: 01-01-9999
Support expiration date: NO SUPPORT
Generation date: 01-01-9999
Platforms: win32/x86;win32/x64;mac/x86;mac/x64;linux/x86;linux/x64
Company name: TeamDev Ltd.
SigB: 1
SigA: 1

  3.在代码中添加破解的代码块

    /*破解jxbrowser的代码块 导入下面的包是关键* import com.teamdev.jxbrowser.chromium.ba;**/static{try{Field e= ba.class.getDeclaredField("e");e.setAccessible(true);Field f= ba.class.getDeclaredField("f");f.setAccessible(true);Field modifersField= Field.class.getDeclaredField("modifiers");modifersField.setAccessible(true);modifersField.setInt(e, e.getModifiers()& ~Modifier.FINAL);modifersField.setInt(f, f.getModifiers()& ~Modifier.FINAL);e.set(null, new BigInteger("1"));f.set(null, new BigInteger("1"));modifersField.setAccessible(false);}catch(Exception e1) {e1.printStackTrace();}}

  注意,此时添加代码块后,可能找不到ba,因为还需要导入对应的包,这里我导入的是import com.teamdev.jxbrowser.chromium.ba; 有可能jxbrowser的版本不同,这里导入的包也不同,即使用的ba的名字会有变化,这里可以在网上查看下,这里我的版本是6.21。

  此时,不出意外就已经破解好了,可以开始编码了。然后这里我做的是程序启动,弹出一个框,框里内嵌了jxbrowser浏览器,然后会打开一个网站系统,实现自动登录并填写东西,并提交。(这里我的系统是公司内部系统,如果要做其他的仿照即可,大概思路与原理是一个样子的)

  下面直接上代码:

importcom.teamdev.jxbrowser.chromium.Browser;importcom.teamdev.jxbrowser.chromium.ba;import com.teamdev.jxbrowser.chromium.dom.*;importcom.teamdev.jxbrowser.chromium.events.FinishLoadingEvent;importcom.teamdev.jxbrowser.chromium.events.LoadAdapter;importcom.teamdev.jxbrowser.chromium.swing.BrowserView;import javax.swing.*;import java.awt.*;import java.io.*;importjava.lang.reflect.Field;importjava.lang.reflect.Modifier;importjava.math.BigInteger;importjava.util.List;importjava.util.Properties;/*** Description:PACKAGE_NAME* Author: Eleven* Date: 2019/1/9 9:15*/
public classDemo {/*破解jxbrowser的代码块 导入下面的包是关键* import com.teamdev.jxbrowser.chromium.ba;**/static{try{Field e= ba.class.getDeclaredField("e");e.setAccessible(true);Field f= ba.class.getDeclaredField("f");f.setAccessible(true);Field modifersField= Field.class.getDeclaredField("modifiers");modifersField.setAccessible(true);modifersField.setInt(e, e.getModifiers()& ~Modifier.FINAL);modifersField.setInt(f, f.getModifiers()& ~Modifier.FINAL);e.set(null, new BigInteger("1"));f.set(null, new BigInteger("1"));modifersField.setAccessible(false);}catch(Exception e1) {e1.printStackTrace();}}/*正式程序编写*/private static InputStream in = null;private static Properties properties =newProperties();///累计加载的次数static int num = 0;public static voidmain(String[] args) {File directory= new File("");//参数为空,获取所在的路径String courseFile = "";try{//加载读取config.properties文件,配置文件主要存放了一些登陆用户名与密码还有一些其他的参数设置/*获取项目的根路径,因为这里我是将配置文件与项目放在同级的*/courseFile=directory.getCanonicalPath();System.out.println(courseFile);String configPath= courseFile+"/config.properties";in= new BufferedInputStream(newFileInputStream(configPath));properties.load(new InputStreamReader(in, "UTF-8"));}catch(IOException e) {e.printStackTrace();}/*系统的访问地址*/final String url = "http://10.202.10.94/DMS/index.jsp";final String title = "DMS";Browser browser= newBrowser();BrowserView view= newBrowserView(browser);/*窗口制作,设置相关的属性*/JFrame frame= new JFrame("DMS自动-V1.0");frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);//不显示标题栏,最大化,最小化,退出按钮frame.setSize(600, 500);frame.add(view, BorderLayout.CENTER);frame.setLocationRelativeTo(null);frame.setVisible(true);/*使用浏览器控件加载访问系统网站地址*/browser.loadURL(url);/*添加一个完成加载的事件:这里当每次加载一个新的页面的时候(browser.loadURL(...)),都会进来此方法*/browser.addLoadListener(newLoadAdapter() {@Overridepublic voidonFinishLoadingFrame(FinishLoadingEvent event) {if(event.isMainFrame()) {/*因为当加载新的页面时,都会进来此方法,所以,这里要用数字做一个判断,判断是哪个页面,第几次加载,根据自己的需求来*/if(num == 0){DOMDocument doc=event.getBrowser().getDocument();/*找到页面name为personcode的对象,并给它设置值*/DOMElement username= doc.findElement(By.name("personcode")); //找到对应的输入框元素(这里的By类提供了多种查找的方式)/*这里我设置的值是从配置文件中加载的,这里可以直接设置也可以*/username.setAttribute("value", properties.getProperty("personcode")); //在输入框中输入内容DOMElement password = doc.findElement(By.name("password"));password.setAttribute("value",properties.getProperty("password"));/*找到页面name为Submit的按钮,然后模拟点击*/DOMElement loginBtn= doc.findElement(By.name("Submit"));loginBtn.click();//模拟点击num++;}else if(num == 1){Browser browser1=event.getBrowser();//模拟跳转到点击input Daily Record后的页面browser1.loadURL("http://10.202.10.94/DMS/dailyreport/dailyRecordMaintain.jsp");num++;}else if(num == 2){DOMDocument doc=event.getBrowser().getDocument();/*找到页面指定id的下拉框*/DOMSelectElement dDateFrom= (DOMSelectElement) doc.findElement(By.id("dDateFrom"));DOMSelectElement dDateTo= (DOMSelectElement) doc.findElement(By.id("dDateTo"));/*获取下拉框的options集合*/List<DOMOptionElement> optionElementList =dDateFrom.getOptions();List<DOMOptionElement> optionElementList2 =dDateTo.getOptions();for(DOMOptionElement opt:optionElementList){/*模拟下拉框选中时间*/if(opt.getAttribute("value").equals(properties.getProperty("startTime"))){opt.setSelected(true);}}for(DOMOptionElement opt:optionElementList2){/*模拟下拉框选中时间*/if(opt.getAttribute("value").equals(properties.getProperty("endTime"))){opt.setSelected(true);}}/*由于dms系统是兼容ie的,在谷歌上点击对应的study按钮是没有反应的,故这里直接使用给iframe设置src的方式来模拟用户点击study按钮*/DOMFrameElement workitemFrame= (DOMFrameElement) doc.findElement(By.name("workitem"));String tempSrc= workitemFrame.getAttribute("src");workitemFrame.setAttribute("src","http://10.202.10.94/DMS/dailyreport/addStudyRecordInformation.jsp");/*特别特别要注意!!!有可能父页面加载子iframe加载完成需要一定的时间,故需要做延迟,特别注意,别踩坑!!!!* 刚开始获取不到,还以为自己写的问题!!!!!**//*这里要延迟,不然后面可能无法获取到对应的组件元素*/try{Thread.sleep(1000*1);}catch(InterruptedException e) {e.printStackTrace();}DOMDocument wkDocument=workitemFrame.getContentDocument();DOMElement workitemname= wkDocument.findElement(By.name("workitemname"));DOMElement content= wkDocument.findElement(By.name("content"));workitemname.setAttribute("value",properties.getProperty("workitemname"));content.setTextContent(properties.getProperty("content"));//模拟点击提交DOMElement b_save = wkDocument.findElement(By.name("b_save"));b_save.click();num++;}else if(num == 3){//System.out.println("到这里了");
}}}});}
}

  下面是我自己的配置文件,这个根据自己的需求就好了:

  代码中注释已经写得很清楚了,应该大概都可以看得懂把~~~~~~~。

  这里还是要提及一下,一定要注意,当页面有子页面iframe,加载iframe设置的时候,有的页面加载需要一定的时间,故需要做一定的延迟!!!不然无法获取到加载页面的元素,这里一定要注意,至于需要延迟多久,就需要自己测试一下子!

  到这里程序就写完了,然后我们可以将项目打成jar包,然后使用exe4j打成exe可执行文件。这样子就方便多啦。对于如何打成jar包以及如果使用exe4j,就不多说了,可以网上参考相关的资料。

  对了,如果需要知道更多有关jxbrowser的一些方法事件,可以去解压文件里找到api文档,不过是全英文的。

  还有要稍微注意下,使用exe4j生成的可执行程式后,需要配置对应的EXE4J_JAVA_HOME环境变量,不然会报错的。

  参考博客:

  http://ciika.com/2018/05/java-jxbrowser-helloworld/--------JxBrowser的初步使用和证书

  https://www.cnblogs.com/chevin/p/10029256.html------JxBrowser之二:常用函数addLoadListener

  https://blog.csdn.net/weixin_42273374/article/details/80405456------properties文件第一行获取的值为null

  https://blog.csdn.net/qq_30730419/article/details/78041133------No JVM could be found on your system.please define ESE4J_JAVA_HOME to point to an installed 32-bit o

  https://blog.csdn.net/zzzgd_666/article/details/80757194------exe4j打成的exe文件运行时弹窗this executable was created with an evaluation version of exe4j问题解决

  

转载于:https://www.cnblogs.com/eleven258/p/10179838.html

java浏览器控件jxbrowser(简单demo模拟自动登录与点击)相关推荐

  1. java浏览器fx,浏览器控件JxBrowser JavaFX开发快速入门指南

    要求:JDK 1.8及更高版本. 1.下载JxBrowser库 下载JxBrowser 将下载的归档文件解压到某个目录(例如D:\ Projects \ MyProject \)中. 当你解压缩档案时 ...

  2. 动态让控件超出屏幕_JAVA浏览器控件JxBrowser v7.5上线!更轻松处理Dynamic Favicons...

    JxBrowser是将基于Chromium的浏览器与Java应用程序集成,以处理和显示HTML5.CSS3.JavaScript.Flash等. 近日,JxBrowser v7.5发布啦,JAVA应用 ...

  3. java api文档_JAVA浏览器控件JxBrowser v7.3上线!最新API文档打包带走

    JxBrowser是将基于Chromium的浏览器与Java应用程序集成,以处理和显示HTML5,CSS3,JavaScript,Flash等. 近日,JxBrowser v7.3发布上线,支持最新m ...

  4. java浏览器下载_Java浏览器控件下载-JxBrowser(Java浏览器控件)官方下载[Java控件]-天极下载...

    用于Windows的Chromium 64位二进制文件仅支持Windows 64位环境,无法在Windows 32位上使用.哪一个被使用? 它取决于Windows体系结构和Java应用程序类路径. j ...

  5. 浏览器控件JxBrowser 6.18发布 | 极大增强了安全性

    2019独角兽企业重金招聘Python工程师标准>>> JxBrowser 6.18 更新 修复 加载新网页时,有时抛出"IllegalStateException:HTM ...

  6. 基于JxBrowser的浏览器控件封装实现Java Swing的浏览器集成

    基于JxBrowser的浏览器控件封装实现Java Swing的浏览器集成 背景 实现目标 实现代码 运行效果 完整的代码及依赖jar文件下载 背景 进期客户提出在一个Java Swing项目要集成另 ...

  7. java程序获取外部java程序的控件,将 Java 小程序迁移到 Microsoft J# 浏览器控件-JSP教程,Java技巧及代码...

    visual j# .net 小组 microsoft corporation 摘要:通过 microsoft j# 浏览器控件,开发人员可以将所编写的在 java 虚拟机上运行的 java 小程序迁 ...

  8. [备忘]自定义IE浏览器控件

    英文原文:http://msdn.microsoft.com/library/default.asp?url=/workshop/browser/hosting/wbcustomization.asp ...

  9. java日历控件开源_6种Google日历的开源替代方案

    java日历控件开源 对于我们许多人来说,我们的日历是我们的命脉. 尽管有些人可以不用挂历或纸制日程安排者来安排他们的日程安排,但我们中的很多人已经将管理时间分配的过程转移到了数字日历上. 大多数主要 ...

  10. python webkit内核_Winform调用WebKitBrowser,基于chrome内核WebKit的浏览器控件

    在C#中,默认的WebBrowser控件默认使用的是IE的core,而IE的种种遭人吐槽的诟病使我不敢轻易使用WebBrowser,因此,打算使用Chrome的内核替换IE.Chrome的内核使用的是 ...

最新文章

  1. java 微信多媒体文件_java微信接口之三—上传多媒体文件
  2. 《众妙之门——Web用户体验设计与可用性测试》一第2章 在网页设计中通过测量数据优化情感投入2.1 情感应答和行为应答的关系...
  3. Quartz.NET总结(四)Quartz 远程调度
  4. 如何真正做好项目管理?
  5. (4)FPGA面试技能提升篇(数字信号处理基础)
  6. 微服务项目部署在docker容器运行
  7. java面试题 垃圾回收机制 GC BAT面试题系列 基础篇(十四)
  8. Postgresql数据库登录的一些问题
  9. 支付宝个人支付接口(蚂蚁金服官方接口)
  10. 《Python基础教程》学习笔记——异常
  11. 生物信息学仿真软件SInC的初步使用教程
  12. 服务器从购买到配置全流程
  13. thinkPHP基于php的衡水游泳馆管理系统--php-计算机毕业设计
  14. Oracle 10g的闪回机制
  15. Dbeaver_ee使用mysql和mongodb
  16. 二叉树已知前序遍历、中序遍历画出二叉树的形状
  17. dnf鹰犬boss机器人_鹰犬boss_兰蒂卢斯和皇女_兰蒂卢斯的鹰犬-Guide信息网
  18. 【C#】无法从命令行或调试器启动服务,必须首先安装Windows服务(使用installutil.exe)
  19. CHOCOLATEY : windows包管理软件改变软件的默认安装位置
  20. 信息爆炸的时代怎样来读书

热门文章

  1. C#毕业设计——基于C#+asp.net+SQL server的房地产信息管理系统设计与实现(毕业论文+程序源码)——房地产信息管理系统
  2. 联想g500网卡linux驱动,联想g500无线网卡驱动下载-lenovog500无线网卡驱动v10.0.0.225 官方版 - 极光下载站...
  3. iOS p12证书获取
  4. android 音效均衡器,App+1 | 不懂均衡器调校也能量身定制,无需折腾的 Android 音效提升工具...
  5. 计算机二级机试题型,计算机二级机试题库
  6. java成员变量注释规范_java编程规范之java注释规范
  7. python爬虫:用scrapy框架爬取链家网房价信息并存入mongodb
  8. 开源阅读书源_【阅读】一款开源的强大的看书软件!amp;超多书源。
  9. Git命令行和Puttygen生成公钥私钥的方法和区别
  10. 我的世界服务器租服_我的世界中国版开服教程 网易国服怎么租赁服务器