You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为HtmlUnit Web Client预加载Local Storage值及验证加载状态

HtmlUnit Web Client 预加载 Local Storage 问题

当前使用代码

HtmlPage initialPage = webClient.getPage(url);
if (httpHeadersSpec != null && httpHeadersSpec.getLocal_storage() != null) {
    for (StorageItemSpec item : httpHeadersSpec.getLocal_storage()) {
        initialPage.executeJavaScript(
                "localStorage.setItem('" + item.getKey() + "', '" + item.getValue() + "');");
    }
}

HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScriptStartingBefore(3000);
URL baseUrl = page.getFullyQualifiedUrl(page.getBaseURI());

问题

  1. 如何验证 Local Storage 值已成功加载?
  2. 为 HtmlUnit Web Client 预加载浏览器 Local Storage 值的正确方式是什么?

解答

1. 验证 Local Storage 值的方法

可以通过两种方式验证存储值是否生效:

  • 单个键值验证:执行JS获取指定键的值,直接输出或做断言校验
// 替换为你的目标key
String targetKey = "test-key";
String storedValue = (String) page.executeJavaScript("localStorage.getItem('" + targetKey + "');").getJavaScriptResult();
// 控制台打印查看
System.out.println(targetKey + " 对应存储值:" + storedValue);
// 单元测试场景可添加断言
// assertEquals("预期值", storedValue);
  • 遍历所有存储项验证:获取所有存储的key,逐个检查对应值
ScriptResult keyResult = page.executeJavaScript("Object.keys(localStorage)");
List<String> allKeys = (List<String>) keyResult.getJavaScriptResult();
for (String key : allKeys) {
    String value = (String) page.executeJavaScript("localStorage.getItem('" + key + "')").getJavaScriptResult();
    System.out.println(key + ": " + value);
}

2. 预加载 Local Storage 的正确方式

当前代码存在两个问题:一是先加载页面再设置存储,随后重新加载页面会导致预存值可能被页面初始化逻辑覆盖;二是JS字符串拼接方式容易因特殊字符(如单引号、换行)出现语法错误。推荐直接使用HtmlUnit的Java API操作LocalStorage,无需提前加载页面:

// 获取WebClient的主窗口
WebWindow mainWindow = webClient.getWebWindowByName("");
Storage localStorage = mainWindow.getLocalStorage();

// 直接添加预加载的存储项
if (httpHeadersSpec != null && httpHeadersSpec.getLocal_storage() != null) {
    for (StorageItemSpec item : httpHeadersSpec.getLocal_storage()) {
        localStorage.setItem(item.getKey(), item.getValue());
    }
}

// 加载目标页面
HtmlPage page = webClient.getPage(url);
webClient.waitForBackgroundJavaScriptStartingBefore(3000);
URL baseUrl = page.getFullyQualifiedUrl(page.getBaseURI());

这种方式的优势:

  • 无需提前加载页面,避免冗余请求
  • 直接通过Java API操作,规避JS字符串拼接的语法风险
  • 存储项会在页面加载前已存在,确保页面初始化时能读取到预加载的值

内容的提问来源于stack exchange,提问作者quarks

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 12:25:22