是不是想要把自己在模擬器的行為自動化, 做排程, 機器人, 或是測試網頁的工具? HtmlUnit正是你需要的一套Java API!
下面這個範例, 可以讓你在Facebook login, 並且留言 (繁體中文版限定, 經過測試, 英文版跟中文版的DOM排列方式不一樣 = =a )
API版本 : HtmlUnit 2.10
1. Login Facebook
String email = "";
String pwd = "";
WebClient webClient = new WebClient(BrowserVersion.CHROME_16);
HtmlPage page = webClient.getPage("http://www.facebook.com");
HtmlTextInput emailInput = (HtmlTextInput)page.getElementById("email");
emailInput.setValueAttribute(email);
HtmlPasswordInput passInput = (HtmlPasswordInput)page.getElementById("pass");
passInput.setValueAttribute(pwd);
HtmlSubmitInput submitBtn = (HtmlSubmitInput)page.getElementById("loginbutton").getFirstChild();
mainPage = submitBtn.click();
2. Post Message
String msg = "";
HtmlAnchor personPageA = (HtmlAnchor)mainPage.getElementById("pageNav").getFirstChild().getFirstChild();
personalPage = personPageA.click();
DomNodeList<HtmlElement> areas = personalPage.getElementsByTagName("textarea");
for(HtmlElement e : areas){
((HtmlTextArea) e).setText(msg);
}
HtmlTextArea input = (HtmlTextArea)personalPage.getElementByName("xhpc_message");
input.setText(msg);
HtmlForm form = (HtmlForm)personalPage.getByXPath("//form[@action='/ajax/updatestatus.php']").get(0);
HtmlSubmitInput submitButton = form.getInputByValue("留言");
if(submitButton == null){
submitButton = form.getInputByValue("Post");
}
submitButton.click();
3. Run Javascript
personalPage.executeJavaScript("alert('HelloWorld');");
後記 & 心得:
會找這個API,起因是想要塞垃圾資料到某個詐騙網站, 當初只有挖出網站的JS, 然後用IE的Development Tool去Run這些JS. 但是手動的好麻煩阿阿阿~~
找到API之後,開始用FB來測試Login + 留言, 後來索性來試著寫出FB的Robot想要監看留言順便按讚 XD
基本上遇到了不少挫折, 我就放棄了Robot的實做, 其中一個原因是利用Android模擬器應該也寫得出來
結論 :
優點我就不多說了,就是讓你可以自動化對瀏覽器做的行為
缺點如下 :
- 雖然可以選擇瀏覽器版本, 但是似乎沒有模擬的完全接近, 有些版本會有一些莫名其妙的bug跑出來
- FB的中文版跟英文版的排版不一樣, load message的方式跟順序也有差別, 所以真的要寫出FB能run的程式還真的是不容易
- 如果網站一改版, 或者是只要有個小地方不一樣, 程式就很有可能會掛掉
建議 :
- 找那些Load網頁不會太複雜, Ajax使用上比較少比較簡單的網站比較適合
- DOM的Select方式要抽離出來, 甚至變成常數檔, 這樣在維護上會比較容易
- 如果自動化邏輯沒有要跟Server互動(例如存進DB), 只是單純的下指令的話, 可以考慮另外寫一個.js檔案, 直接跑Javascript會是最簡單的方式
參考連結 :
StackOverFlow : http://stackoverflow.com/questions/7260282/apache-httpclient-4-and-javascript
HtmlUnit : http://htmlunit.sourceforge.net/
HtmlUnit內建了Selenium, 是一個沒有畫面的瀏覽器, 還可以選擇瀏覽器的版本
Selenium : http://seleniumhq.org/