用Java模拟网站登录(二)
2013-11-06 17:23 _cha1R 阅读(11238) 评论(4) 编辑 收藏 举报本文为原创,转载请声明来源和作者,谢谢!
作者:_cha1R
上一篇文章《用Java模拟网站登录》介绍过,模拟一些如百度、QQ之类的网站登录?有两个方式,一是发送模拟请求,二是模拟浏览器操作。那么这次介绍第二种方式,模拟浏览器操作。这个可能知道的人不多,它并没有HttpClient那么出名。当初我在学习它的时候,在百度几乎搜索不到关于它的资料,幸亏我们还可以用Google。它叫htmlunit。
htmlunit:A java GUI-Less browser, which allows high-level manipulation of web pages, such as filling forms and clicking links; just getPage(url), find a hyperlink, click() and you have all the HTML, JavaScript, and Ajax are automatically processed.
简单翻译下介绍:一个Java代码版浏览器,它没有图形界面。它可以允许使用网页的一些高级操作,如填写表单、点击链接。你只需要调用getPage(url)方法,然后找到一个超链接,调用click()方法点击它,你就可以得到点击后返回的页面。包括Javascript、Ajax、cookie等都是自动处理的。
换言之,浏览器能做什么,它就能做什么。它可以模拟浏览器大部分操作,包括解析Js、css!
在使用它之前,做好准备工作:
从http://sourceforge.net/projects/htmlunit/files/上下载htmlunit-2.13-bin.zip,解压后导入到项目里。
导入完以后,模拟一个登陆的过程:
首先创建一个WebClient对象,这个对象跟HttpClient对象有几分相似,同样是一个浏览器对象,可以用它来做点浏览器可以做的事情。
WebClient webClient = new WebClient();//创建WebClient
它可以打开一个网址,返回一个HtmlPage对象,我们可以用它来获得表单。
HtmlPage page = webClient.getPage("http://www.baidu.com/"); //打开百度
获得一个HtmlElement对象,可以根据html的id、name来获取,如果都没有,也可以用Xpath语法来获取htmlElement对象
//获得name为"登陆"的html元素 HtmlElement htmlElement = page.getElementByName("登陆");
获得后,“点击”这个htmlElement。返回的是点击百度的“登陆”后的页面
page = htmlElement.click();//调用click()方法
这样当前的page2就是百度的登陆页面,那么我们要填写表单然后提交表单登陆。
还是先获取HtmlElement元素
//获得name为"username"的html元素 HtmlElement usernameEle = page.getElementByName("username"); //获得id为"password"的html元素 HtmlElement passwordEle = (HtmlElement)page.getElementById("password");
填写这两个表单元素,用type()方法,注意先设置焦点:
usernameEle.focus(); //设置输入焦点 usernameEle.type("username123"); //填写值 passwordEle.focus(); //设置输入焦点 passwordEle.type("mypassword"); //填写值
填写完后,提交登陆表单
//获得name为"登陆"的元素 HtmlElement submitEle = page.getElementByName("登陆"); //点击“登陆” page = submitEle.click();
click()完以后,会返回click()后的HtmlPage对象,我们可以用它来判断是否登陆成功
String result = page.asXml();//获得click()后的html页面(包括标签) if(result.contains("登陆成功!")){ System.out.println("登陆成功"); }else{ System.out.println("登陆失败"); }
下面附上整个代码以便测试:
WebClient webClient = new WebClient();//创建WebClient HtmlPage page = webClient.getPage("http://www.baidu.com/"); //打开百度 //获得name为"登陆"的html元素 HtmlElement htmlElement = page.getElementByName("登陆"); page = htmlElement.click();//调用click()方法 //获得name为"username"的html元素 HtmlElement usernameEle = page.getElementByName("username"); //获得id为"password"的html元素 HtmlElement passwordEle = (HtmlElement) page.getElementById("password"); usernameEle.focus(); //设置输入焦点 usernameEle.type("username123"); //填写值 passwordEle.focus(); //设置输入焦点 passwordEle.type("mypassword"); //填写值 //获得name为"登陆"的元素 HtmlElement submitEle = page.getElementByName("登陆"); //点击“登陆” page = submitEle.click(); String result = page.asXml();//获得click()后的html页面(包括标签) if(result.contains("登陆成功!")){ System.out.println("登陆成功"); }else{ System.out.println("登陆失败"); }