
HtmlUnit 3.4.0+ 提供了原生支持 LocalStorage 的 API,可通过 WebClient.getStorageHolder().getLocalStorage(url) 获取与目标 URL 绑定的 localStorage 实例,直接 put 键值对即可在页面加载前预置数据,无需依赖 JavaScript 执行。
htmlunit 3.4.0+ 提供了原生支持 localstorage 的 api,可通过 `webclient.getstorageholder().getlocalstorage(url)` 获取与目标 url 绑定的 localstorage 实例,直接 put 键值对即可在页面加载前预置数据,无需依赖 javascript 执行。
HtmlUnit 早期版本中,开发者常尝试通过 executeJavaScript("localStorage.setItem(...)") 在页面加载后注入 LocalStorage 数据,但这种方式存在明显缺陷:
- 执行时机滞后(页面已加载完成,部分 JS 可能已在初始化阶段读取过 localStorage);
- 无法保证脚本执行成功(如页面禁用 JS、DOM 尚未就绪);
- 难以验证写入结果,且跨域或协议不匹配时 localStorage 实例无效。
自 HtmlUnit 3.4.0 起,官方正式支持 LocalStorage 和 SessionStorage 的模拟,并通过 StorageHolder 提供类型安全、线程友好的操作接口。核心要点如下:
✅ 正确做法:在 getPage() 调用前配置 Storage
LocalStorage 是按源(origin)隔离的,因此必须使用与目标页面完全一致的 URL(含协议、主机、端口) 获取对应的 storage 实例:
try (WebClient webClient = new WebClient()) {
// 注意:url 必须是完整 URL,例如 "https://example.com/app/"
String targetUrl = "https://example.com/";
// 获取该 origin 对应的 localStorage 映射(自动创建,线程安全)
Map<String, String> localStorage =
webClient.getStorageHolder().getLocalStorage(targetUrl);
// 预设键值对(支持任意字符串 key/value)
localStorage.put("user_token", "abc123");
localStorage.put("theme", "dark");
localStorage.put("preferences", "{\"lang\":\"zh-CN\",\"notify\":true}");
// 此时再加载页面,所有 JS 脚本均可正常读取 localStorage
HtmlPage page = webClient.getPage(targetUrl);
// ✅ 验证写入是否生效(可在 JS 中调用,或直接查 Map)
System.out.println("Stored token: " + localStorage.get("user_token")); // 输出: abc123
}⚠️ 关键注意事项:
-
getLocalStorage(url)中的url必须与后续getPage(url)的 URL 协议、域名、端口完全一致(路径部分可不同,但 origin 必须匹配); - 不要使用
initialPage.executeJavaScript(...)方式——它作用于已生成的页面上下文,无法影响页面初始 JS 执行逻辑; - 若需模拟多个不同 origin 的存储(如 iframe 场景),需分别调用
getLocalStorage(otherOriginUrl); - SessionStorage 同理,使用
getStorageHolder().getSessionStorage(url); - StorageHolder 默认启用,无需额外配置;若需禁用,可调用
webClient.getOptions().setJavaScriptEnabled(false)(但将同时禁用 JS)。
? 进阶提示:对于动态配置场景(如从测试配置对象批量注入),可封装工具方法:
立即学习“前端免费学习笔记(深入)”;
public static void setLocalStorage(WebClient webClient, String baseUrl,
Map<String, String> items) {
webClient.getStorageHolder()
.getLocalStorage(baseUrl)
.putAll(items);
}
// 使用示例
setLocalStorage(webClient, "https://demo.site/", httpHeadersSpec.getLocalStorage());综上,HtmlUnit 3.4.0+ 的 StorageHolder 是设置 LocalStorage 的唯一推荐方式——它符合 Web 标准语义、时序可靠、可验证、且与页面生命周期深度集成。请确保升级到 3.4.0 或更高版本(Maven 坐标:net.sourceforge.htmlunit:htmlunit:3.4.0+),并始终以 origin 为单位进行存储操作。


















