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

HtmlUnit新版本无法通过XPath获取HtmlFieldSet问题求助

HtmlUnit 3.x版本无法获取目标元素的适配问题

问题场景

访问目标页面,输入1010501508并提交后,跳转页面中存在class为addressblock的fieldset元素。

旧版本(HtmlUnit 2.69.0/2.70.0)可行代码

使用Oracle JDK 21.0.2搭配HtmlUnit 2.x版本时,以下代码可成功获取该元素,控制台输出addressblocks.size() = 1:

import java.util.*;
import com.gargoylesoftware.htmlunit.*;
import com.gargoylesoftware.htmlunit.html.*;
import com.gargoylesoftware.htmlunit.javascript.*;

class HtmlFieldSetClass {
    public static void main(String[] args) {
        try {
            System.getProperties().put("org.apache.commons.logging.simplelog.defaultlog", "fatal");
            java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(java.util.logging.Level.OFF);
            final WebClient webClient = new WebClient(BrowserVersion.BEST_SUPPORTED);
            webClient.getOptions().setCssEnabled(false);
            webClient.getOptions().setThrowExceptionOnScriptError(false); 
            webClient.setJavaScriptErrorListener(new SilentJavaScriptErrorListener()); 
            webClient.setCssErrorHandler(new SilentCssErrorHandler());  
            HtmlPage page = webClient.getPage("https://parcelinquirytreasurer.cochise.az.gov/");
            webClient.waitForBackgroundJavaScriptStartingBefore(1000000000);    
            page = (HtmlPage) page.getEnclosingWindow().getEnclosedPage(); 
            List<HtmlForm> forms = page.getByXPath("//form[@method='post']");
            Iterator formsIterator = forms.iterator();
            HtmlForm form = (HtmlForm) formsIterator.next();
            List<HtmlInput> his = form.getByXPath("//input[@value='Submit']");
            Iterator hisIterator = his.iterator();
            HtmlInput hi = (HtmlInput) hisIterator.next();
            HtmlTextInput textField = form.getInputByName("parcelNumber_input");  
            textField.click();
            textField.setValueAttribute("1010501508");  
            webClient.waitForBackgroundJavaScript(10000000);
            webClient.waitForBackgroundJavaScriptStartingBefore(1000000);
            webClient.getOptions().setJavaScriptEnabled(true);
            HtmlPage page2 = hi.click();
            page2.getEnclosingWindow().getJobManager().waitForJobs(10000000);
            webClient.waitForBackgroundJavaScriptStartingBefore(1000000000);
            List<HtmlFieldSet> addressblocks = page2.getByXPath("//fieldset[@class='addressblock']");
            System.out.println("addressblocks.size() = " + addressblocks.size());
        }
        catch (Exception e) {
            System.out.println("Exception:  " + e.toString());
        }
    }
}

新版本(HtmlUnit 3.09.0/3.10.0)问题

将代码中的包路径从com.gargoylesoftware替换为org后,运行代码控制台输出addressblocks.size() = 0,无法获取目标元素。目前无法确定是版本间API变更导致使用方式错误,还是存在bug。

需求

  • 若为API变更,提供适配后的代码
  • 若为bug,将向官方提交反馈
  • 同时寻求新版本下的可行替代方案,目前暂考虑回退版本

内容的提问来源于stack exchange,提问作者God's Gift To Java

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 23:20:30