代码改变世界

用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("登陆失败");
        }