本文为原创,转载请声明来源和做者,谢谢!
做者:_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对象,咱们能够用它来得到表单。css
HtmlPage page = webClient.getPage("http://www.baidu.com/"); //打开百度
得到一个HtmlElement对象,能够根据html的id、name来获取,若是都没有,也能够用Xpath语法来获取htmlElement对象html
//得到name为"登录"的html元素 HtmlElement htmlElement = page.getElementByName("登录");
得到后,“点击”这个htmlElement。返回的是点击百度的“登录”后的页面java
page = htmlElement.click();//调用click()方法
这样当前的page2就是百度的登录页面,那么咱们要填写表单而后提交表单登录。web
仍是先获取HtmlElement元素浏览器
//得到name为"username"的html元素 HtmlElement usernameEle = page.getElementByName("username"); //得到id为"password"的html元素 HtmlElement passwordEle = (HtmlElement)page.getElementById("password");
填写这两个表单元素,用type()方法,注意先设置焦点:cookie
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("登录失败"); }