close

是不是想要把自己在模擬器的行為自動化, 做排程, 機器人, 或是測試網頁的工具? 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/

arrow
arrow
    全站熱搜

    minglight 發表在 痞客邦 留言(0) 人氣()