您的位置:首页 > 运维架构 > 网站架构

用Java模拟网站登录(二)

2013-11-06 17:23 423 查看
本文为原创,转载请声明来源和作者,谢谢!

作者:_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("登陆失败"); }

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: