上一篇                     
               
			  如何 使用 htmlunit
- 前端开发
- 2025-07-24
- 4782
 使用HTMLUnit需先配置Java环境,添加依赖,创建WebClient实例,设置JS支持,调用getPage获取页面,解析DOM或执行脚本
 
环境搭建与基础配置
-  引入依赖 
 HtmlUnit的核心库需通过Maven或手动添加JAR包引入,以下是Maven坐标:<dependency> <groupId>net.sourceforge.htmlunit</groupId> <artifactId>htmlunit</artifactId> <version>2.60.0</version> <!-最新版本请参考官网 --> </dependency>
-  创建WebClient实例 
 WebClient是HtmlUnit的核心类,负责模拟浏览器行为,基础配置如下:import com.gargoylesoftware.htmlunit.WebClient; import com.gargoylesoftware.htmlunit.html.HtmlPage; WebClient client = new WebClient(); client.getOptions().setCssEnabled(false); // 禁用CSS以提高解析速度 client.getOptions().setJavaScriptEnabled(true); // 启用JS支持 
-  获取页面内容 
 通过client.getPage(url)加载页面,返回HtmlPage对象:HtmlPage page = client.getPage("https://example.com"); String htmlContent = page.asXml(); // 获取HTML源码
| 配置项 | 说明 | 默认值 | 
|---|---|---|
| CssEnabled | 是否解析CSS | true | 
| JavaScriptEnabled | 是否执行JS | false | 
| ThrowExceptionOnScriptError | JS错误时是否抛出异常 | false | 
页面交互与数据提取
-  表单提交 
 通过HtmlForm对象模拟表单提交: HtmlForm form = page.getFormByName("loginForm"); form.getInputByName("username").setValueAttribute("admin"); form.getInputByName("password").setValueAttribute("123456"); HtmlPage submitPage = form.getInputByValue("Login").click();
-  动态元素处理 
 对AJAX生成的元素,需启用JS并等待异步加载:client.waitForBackgroundJavaScript(5000); // 等待5秒执行JS HtmlElement dynamicDiv = page.getElementById("dataContainer");
-  数据抽取 
 使用XPath或CSS选择器定位元素:List<HtmlTableRow> rows = page.getByXPath("//table[@id='dataTable']/tbody/tr"); for (HtmlTableRow row : rows) { String cellText = row.getCell(0).asText(); System.out.println(cellText); }
进阶功能与优化
-  Cookie管理 
 通过CookieManager处理会话: client.setCookieManager(new CookieManager()); client.getCookieManager().addCookie(new Cookie("sessionId", "abc123"));
-  文件下载与上传 - 下载文件:调用HtmlAnchor或HtmlLink的click()方法。
- 上传文件:通过HtmlFileInput设置本地文件路径:HtmlFileInput fileInput = page.getFileInput("fileUpload"); fileInput.setValueAttribute(new File("path/to/localfile").getAbsolutePath());
 
- 下载文件:调用
-  性能优化 - 禁用不必要的功能(如CSS、图片加载)
- 使用WebWindow管理多窗口场景
- 配置超时时间:client.setTimeout(10000);
 
常见问题与解决方案
FAQs:
Q1:如何处理需要复杂JavaScript验证的页面?
A1: 

- 启用JS支持:client.getOptions().setJavaScriptEnabled(true);
- 配置JS引擎:建议使用HtmlUnitBrowserVersionFactory指定浏览器版本(如CHROME)。
- 捕获JS错误:设置client.getOptions().setThrowExceptionOnScriptError(false);避免中断。
Q2:如何设置代理服务器或HTTP请求头?
A2: 
- 代理配置: client.getOptions().setProxyConfig(new ProxyConfig("proxy.example.com", 8080));
- 自定义请求头: client.addRequestHeader("User-Agent", "Mozilla/5.0"); client.addRequestHeader("Referer", "https://origin.com");
完整示例代码
import com.gargoylesoftware.htmlunit.;
import com.gargoylesoftware.htmlunit.html.;
public class HtmlUnitDemo {
    public static void main(String[] args) throws Exception {
        // 初始化WebClient
        WebClient client = new WebClient();
        client.getOptions().setCssEnabled(false);
        client.getOptions().setJavaScriptEnabled(true);
        // 加载页面
        HtmlPage page = client.getPage("https://www.baidu.com");
        System.out.println("页面标题:" + page.getTitleText());
        // 填写表单
        HtmlForm searchForm = page.getFormByName("fm");
        HtmlTextInput input = searchForm.getInputByName("wd");
        input.setValueAttribute("HtmlUnit教程");
        HtmlSubmitButton button = searchForm.getInputByValue("百度一下") instanceof HtmlSubmitButton ?
                (HtmlSubmitButton) searchForm.getInputByValue("百度一下") : null;
        HtmlPage resultPage = button.click();
        // 提取搜索结果
        System.out.println("第一条结果:" + resultPage.getByXPath("//div[@class='result c-container ']/h3/a").asText());
        client.close();
    }
} 
 
  
			