htmlunit 模拟登录 数字验证码
2024-08-31 22:05:54
使用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.控制台部分输出截图
最新文章
- [转] MySql 优化 大数据优化
- HTML5_拖放
- hdu 4911 Inversion (分治 归并排序 求逆序数)
- C#面向对象(一)
- QQ地图api里的 地址解析函数 看不懂 javascript_百度知道
- spring简单入门示例
- [C++]C++中的运行时类型检测
- Zabbix实战-简易教程--拓扑图(Maps)
- 4.C++中的函数重载,C++调用C代码,new/delete关键字,namespace(命名空间)
- gdb core 调试多线程
- chrome 安装setupvpn 解决chorme未能成功加载扩展程序的问题
- UEditor百度编辑器,工具栏自定义添加一个普通按钮
- Codeforces Round #359 (Div. 2) D - Kay and Snowflake
- cf-Global Round2-E. Pavel and Triangles
- phpstorm+xdebug调试代码
- Reverse string using recursion
- MathExamLv2——周世元211606348,许燕婷211606338
- Single Image Haze Removal(图像去雾)-CVPR’09 Best Paper
- Windows Update error 80070003
- 一道面试题Lintcode196-Find the Missing Number
热门文章
- html 代码
- .NetCore微服务Surging新手傻瓜式 入门教程 学习日志---先让程序跑起来(一)
- P2P网贷-借款与发标
- Docker使用Dockerfile创建Centos(tomcat+jdk)镜像
- js的继承操作案例
- Android java.lang.IllegalArgumentException: Object returned from onCreateLoader must not be a non-static inn
- linux中的rootfs/initrd/ramfs/initramfs
- POJ 2590 Steps (ZOJ 1871)
- [Scss Flex] Reuse Flexbox Styles With A Sass Mixin
- js课程 2-7 for-in循环怎么使用