打卡制度由來已久,對於公司管理員工的出勤比較重要,存在也是合情合理,但對於程序員這個嚮往彈性工作的羣體,內心裏還是不太樂意,遂利用HtmlUnit寫了一個自動打卡的工具,放到公司內網,通過Crontab實現自動打卡,本意不在打卡,更多是爲了學習HtmlUnit,爲將來實現自動化測試熱身。^_^
對於網頁解析部分,僅適用於我所在的公司的打卡頁面,如果有同學恰好也需要這個功能,需要自己再查資料修改代碼了
package com.xx.AutoAttendance;
/**
* 自動打卡考勤程序,根據頁面不同,解析網頁的代碼需要修改
* @author Chris.Xiao
*/
import java.io.IOException;
import java.net.MalformedURLException;
import com.gargoylesoftware.htmlunit.BrowserVersion;
import com.gargoylesoftware.htmlunit.FailingHttpStatusCodeException;
import com.gargoylesoftware.htmlunit.NicelyResynchronizingAjaxController;
import com.gargoylesoftware.htmlunit.WebClient;
import com.gargoylesoftware.htmlunit.html.HtmlAnchor;
import com.gargoylesoftware.htmlunit.html.HtmlForm;
import com.gargoylesoftware.htmlunit.html.HtmlPage;
import com.gargoylesoftware.htmlunit.html.HtmlPasswordInput;
import com.gargoylesoftware.htmlunit.html.HtmlSubmitInput;
import com.gargoylesoftware.htmlunit.html.HtmlTextInput;
public class AutoAttendance
{
public static void main(String [] args) throws FailingHttpStatusCodeException, MalformedURLException, IOException
{
String LOGIN_URL = "http://kaoqin.xx.com";
//模擬一個瀏覽器
WebClient webClient = new WebClient(BrowserVersion.FIREFOX_2);
//設置webClient的相關參數
webClient.setJavaScriptEnabled(true);
webClient.setCssEnabled(false);
webClient.setAjaxController(new NicelyResynchronizingAjaxController());
webClient.setTimeout(35000);
webClient.setThrowExceptionOnScriptError(false);
//模擬瀏覽器打開目標網址
HtmlPage loginPage= webClient.getPage(LOGIN_URL);
System.out.println(loginPage.asText());
System.out.println(loginPage.getTitleText());
System.out.println(loginPage.getTextContent());
// 根據form的名字獲取頁面表單,也可以通過索引來獲取:page.getForms().get(0)
final HtmlForm form = loginPage.getFormByName("login_form");
// 1.登錄:用戶名/密碼
HtmlTextInput userName = form.getInputByName("username");
userName.setValueAttribute("YourName");
HtmlPasswordInput userPwd = form.getInputByName("password");
userPwd.setValueAttribute("YourPassword");
final HtmlSubmitInput subBtn = (HtmlSubmitInput)loginPage.getByXPath("//input").get(2);
System.out.println(subBtn.asText());
final HtmlPage targetPage = subBtn.click();
try {
Thread.sleep(3000);
} catch (InterruptedException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
// 2.打卡:找到打卡button打卡
HtmlAnchor anchor = (HtmlAnchor) targetPage.getByXPath("//*[@id=\"clockIn\"]").get(0);
HtmlPage finalPage = anchor.click();
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println(finalPage.asText());
}
}
代碼裏有幾處sleep3秒鐘,是因爲點擊後,需要跳轉時間,如果點擊後,馬不停蹄的走下去,頁面還沒有跳轉完畢,後面的解析會失敗。