本文爲原創,轉載請聲明來源和做者,謝謝!
做者:_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("登錄失敗"); }