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

使用Java HtmlUnit点击CBSE成绩页提交按钮时抛出ScriptException

解决HtmlUnit点击CBSE成绩页面提交按钮时的routeEvent函数未找到错误

问题分析

你遇到的ScriptException核心原因是:CBSE的成绩查询页面依赖了IE早期版本专属的routeEvent事件处理方法,而HtmlUnit默认的JavaScript引擎没有模拟足够老旧的IE环境,导致无法识别这个过时的API。

另外,我注意到你的代码里有个小笔误:centerField.type(schCode);这里应该传入的是centerno参数,而非重复的schCode——虽然这不是引发当前JS异常的原因,但会导致考场号填写错误,需要一并修正。

错误核心信息引用:

TypeError: Cannot find function routeEvent in object [object HTMLDocument]. (http://www.cbseresults.nic.in/class12zpq/cal2.js#522)

解决方案

要解决这个问题,关键是让HtmlClient模拟旧版本的IE浏览器(比如IE8),同时调整JS相关配置兼容老旧脚本:

  • 显式设置浏览器版本为IE8,HtmlUnit会启用对IE专属方法的支持
  • 可选禁用脚本错误抛出,避免单个JS错误中断流程
  • 修正表单字段填写的笔误

修改后的完整代码

public HtmlPage getCBSE18(String roll, String schCode, String centerno) throws IOException {
    // 初始化WebClient并配置为模拟IE8,适配老旧页面的JS
    WebClient webClient = new WebClient(BrowserVersion.INTERNET_EXPLORER_8);
    
    // 配置选项:兼容老旧页面的容错设置
    webClient.getOptions().setThrowExceptionOnScriptError(false);
    webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
    webClient.getOptions().setJavaScriptEnabled(true);
    
    // 目标成绩查询页面URL
    String CBSE18 = "http://www.cbseresults.nic.in/class12zpq/class12th18.htm";
    HtmlPage page = webClient.getPage(CBSE18);
    
    // 获取页面表单
    final HtmlForm form = page.getFormByName("FrontPage_Form1");
    
    // 填写准考证号
    final HtmlTextInput regField = form.getInputByName("regno");
    regField.type(roll);
    
    // 填写学校代码
    final HtmlTextInput schField = form.getInputByName("sch");
    schField.type(schCode);
    
    // 修正笔误:填写考场号(传入正确的centerno参数)
    final HtmlTextInput centerField = form.getInputByName("cno");
    centerField.type(centerno);
    
    // 获取提交按钮
    final HtmlSubmitInput button = form.getInputByName("B2");
    
    // 等待页面背景JS加载完成
    webClient.waitForBackgroundJavaScript(1000);
    
    // 点击按钮获取成绩页面
    final HtmlPage page2 = button.click();
    
    // 可选:打印页面内容验证结果
    System.out.println(page2.asText());
    
    return page2;
}

补充说明

  • 模拟IE8是解决routeEvent错误的核心,因为这个方法是IE8及更早版本的专属API,HtmlUnit在模拟该版本时会内置对它的支持
  • 禁用ThrowExceptionOnScriptError可以避免页面中其他潜在的老旧JS错误中断程序,如果需要调试JS问题,可以暂时开启该选项
  • 确保所有表单字段填写正确,否则即使JS错误解决,也可能无法获取有效成绩

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.29 08:40:09