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

