使用htmlunit的好处有两点,相比httpclient,htmlunit是对浏览器的模拟,比如你定位一个按钮,就可以执行click()方法,此外不需要象在httpclient中一样编写复杂的代码,如一堆request header还有一大堆请求参数,你只需要填写用户名,密码,验证码即可,就象在使用一个没有界面的浏览器,当然更重要的是htmlunit对js的支持设置极其简单

1.添加maven的htmlunit(标红)依赖

 1  <dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>${junit.version}</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>org.jsoup</groupId>
<artifactId>jsoup</artifactId>
<version>1.11.3</version>
</dependency>
<dependency>
19 <groupId>net.sourceforge.htmlunit</groupId>
20 <artifactId>htmlunit</artifactId>
21 <version>2.18</version>
22 </dependency> </dependencies>

2.思路

定位用户名,密码,验证码框等元素,填写即可,验证码可以先把图片下载下来然后手动输入,也可以使用tess4j进行图片识别,这里是手动输入测试的网站,是一个伪ajaxsubmit,测试多次发现需要二次输入验证码才能正确登录,但令人疑惑的是两次生成的验证码一样(如果不一样说明你第一次输入错误)

 public static void main(String[] args) throws Exception {
WebClient webClient = new WebClient(BrowserVersion.CHROME);
webClient.getOptions().setJavaScriptEnabled(true);
webClient.getOptions().setCssEnabled(true);
webClient.getOptions().setThrowExceptionOnScriptError(false);
// webClient.getOptions().setThrowExceptionOnFailingStatusCode(true);
webClient.getOptions().setActiveXNative(false); //ajax
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.getOptions().setUseInsecureSSL(false); //允许重定向
webClient.getOptions().setRedirectEnabled(true); //连接超时
webClient.getOptions().setTimeout(5000); //js执行超时
webClient.setJavaScriptTimeout(10000*3); //对于此网站务必开启
webClient.getCookieManager().setCookiesEnabled(true); String url = "https://www.zuhaowan.com/login/";
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScript(5000); HtmlPage newPage = readyPage(page, webClient);
// String content1 = newPage.asXml();
// IOUtils.write(content1.getBytes(),new FileWriter(new File("f:/content1.txt"))); //如果页面url没有变化重新进行一次登录
if(newPage.getUrl().toString().equals(url)) {
System.out.println("出现错误请重新登录-------------");
HtmlPage result = readyPage(newPage,webClient);
System.out.println("url----------------"+result.getUrl());
System.out.println("页面----" + result.asXml());
// IOUtils.write(result.asXml(),new FileWriter(new File("f:/content2.txt"))); } webClient.close();
} public static HtmlPage readyPage(HtmlPage page,WebClient webClient) throws Exception {
//封装页面元素
HtmlForm form = page.getHtmlElementById("form2");
HtmlTextInput loginname = form.getInputByName("loginname");
loginname.setValueAttribute("用户名");
HtmlPasswordInput loginpwd = form.getInputByName("loginpwd");
loginpwd.setValueAttribute("密码"); //验证码输入框
HtmlTextInput verify_code = form.getInputByName("verify_code"); //验证码图片
HtmlImage verify_img = (HtmlImage) page.getElementById("verify_img");
UUID randomUUID = UUID.randomUUID();
//保存
verify_img.saveAs(new File("./src/main/resources/image/verifyimg"+ randomUUID.toString() +".png")); System.out.println("验证码图片已保存!");
System.out.println("请输入验证码");
//手动输入验证码
Scanner scanner = new Scanner(System.in);
String code = scanner.nextLine();
System.out.println("验证码-------------" + code);
verify_code.setValueAttribute(code); //登录按钮也可以使用page.executeJavaScript("javascript:document.getElementById('loginsubmit').click()").getNewPage();
HtmlAnchor login = page.getHtmlElementById("loginsubmit");
HtmlPage newPage = login.click(); //等待js加载
webClient.waitForBackgroundJavaScript(5000);
return newPage; }

3.控制台部分输出截图

最新文章

  1. [转] MySql 优化 大数据优化
  2. HTML5_拖放
  3. hdu 4911 Inversion (分治 归并排序 求逆序数)
  4. C#面向对象(一)
  5. QQ地图api里的 地址解析函数 看不懂 javascript_百度知道
  6. spring简单入门示例
  7. [C++]C++中的运行时类型检测
  8. Zabbix实战-简易教程--拓扑图(Maps)
  9. 4.C++中的函数重载,C++调用C代码,new/delete关键字,namespace(命名空间)
  10. gdb core 调试多线程
  11. chrome 安装setupvpn 解决chorme未能成功加载扩展程序的问题
  12. UEditor百度编辑器,工具栏自定义添加一个普通按钮
  13. Codeforces Round #359 (Div. 2) D - Kay and Snowflake
  14. cf-Global Round2-E. Pavel and Triangles
  15. phpstorm+xdebug调试代码
  16. Reverse string using recursion
  17. MathExamLv2——周世元211606348,许燕婷211606338
  18. Single Image Haze Removal(图像去雾)-CVPR’09 Best Paper
  19. Windows Update error 80070003
  20. 一道面试题Lintcode196-Find the Missing Number

热门文章

  1. html 代码
  2. .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一)
  3. P2P网贷-借款与发标
  4. Docker使用Dockerfile创建Centos(tomcat+jdk)镜像
  5. js的继承操作案例
  6. Android java.lang.IllegalArgumentException: Object returned from onCreateLoader must not be a non-static inn
  7. linux中的rootfs/initrd/ramfs/initramfs
  8. POJ 2590 Steps (ZOJ 1871)
  9. [Scss Flex] Reuse Flexbox Styles With A Sass Mixin
  10. js课程 2-7 for-in循环怎么使用