一:HtmlUnit介绍
HtmlUnit是一个用java编写的无界面浏览器,建模html文档,通过API调用页面,填充表单,点击链接等等。如同正常浏览器一样操作。典型应用于测试以及从网页抓取信息。
二、常用步骤
1、定义WebClient
webClient = new WebClient();
2、获取页面
HtmlPage page = webClient.getPage("https://www.hao123.com/rili/");// hao123 万年历
3、从页面中获取元素
DomNodeList<DomElement> elementsByTagNameSubmit = page.getElementsByTagName("ul");
4、模拟点击
nextMonthElement.click(); // 点击下一个月
三、获取元素常用方法
1、根据id获取元素
HtmlPage.getElementById(String);
HtmlPage.getElementsById(String);
2、根据name获取元素
HtmlPage.getElementByName(String);
HtmlPage.getElementsByName(String)
3、根据标签名获取元素
page.getElementsByTagName("ul");
4、根据xpath获取元素
page.getByXPath("//div[@class='select_month e_clear']");
四、webClient.getOptions()的常用方法说明
void setCssEnabled(boolean enabled) //启用/禁用CSS支持。
void setJavaScriptEnabled(boolean enabled) //启用/禁用JavaScript支持。
void setTimeout(int timeout) //设置该程序的超时。
void setUseInsecureSSL(boolean useInsecureSSL) //如果设置为true,客户机将接受与任何主机的连接,而不管它们是否有有效证书
五、示例代码
示例代码功能:获取hao123万年历日期信息。
WebClient webClient = new WebClient();
webClient.getOptions().setUseInsecureSSL(true);
HtmlPage page = webClient.getPage("https://www.hao123.com/rili/");// hao123 万年历
DomElement dateDomElement = null;
// 等待检查页面是否加载
for (int i = 0; i < 60; i++) {
DomNodeList<DomElement> elementsByTagNameList = page.getElementsByTagName("div");
for (DomElement domElement : elementsByTagNameList) {
//根据目标元素class属性循环匹配
if (domElement.getAttribute("class").equals("select_month e_clear")) {
break;
}
}
Thread.sleep(1000);
}
List<HtmlDivision> list = page.getByXPath("//div[@class='select_month e_clear']");
DomElement nextMonthElement = null;// 页面下一个月元素
for(HtmlDivision htmlDivision : list){
Iterator<DomElement> childElems = htmlDivision.getChildElements().iterator();
while(childElems.hasNext()){
DomElement domElem = childElems.next();
if(domElem.getAttribute("class").equals("right_arrow")){
nextMonthElement = domElem;
break;
}
}
}
nextMonthElement.click(); // 点击下一个月
for (int i = 0; i < 60; i++) {
DomNodeList<DomElement> elementsByTagNameList = page.getElementsByTagName("ul");
for (DomElement domElement : elementsByTagNameList) {
//根据目标元素class属性循环匹配
if (domElement.getAttribute("class").equals("e_clear js-cld-panel")) {
dateDomElement = domElement;
break;
}
}
Thread.sleep(1000);
}
DomNodeList<HtmlElement> htmlElements = dateDomElement.getElementsByTagName("li");
for (HtmlElement element : htmlElements) {
List<HtmlElement> lunar = element.getElementsByAttribute("div", "class", "lunar_date");// 阴历日期
List<HtmlElement> solar = element.getElementsByAttribute("div", "class", "solar_date");// 阳历日期
if (element.getAttribute("class").indexOf("vacation") != -1) {// 假期
}
if (element.getAttribute("class").indexOf("weekend") != -1 ) {// 周末
}
}