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