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
相关产品推荐
相关产品推荐

