如何克服HTMLUnit ScriptException?

 晴felleman_110 发布于 2023-02-13 15:42

我遇到了一行代码,可能会触发一些js函数,但是我怎么能解决这个问题呢?

box.setText(link.toString());
client.waitForBackgroundJavaScriptStartingBefore(10000);
box.dblClick(); //this line cause the exception

Exception in thread "main" ======= EXCEPTION START ========
EcmaError: lineNumber=[0] column=[0] lineSource=[function () {] name=[ReferenceError] sourceName=[onclick event for HtmlDivision[
] in https://www.facebook.com/?_fb_noscript=1] message=[ReferenceError: "Bootloader" is not defined.] com.gargoylesoftware.htmlunit.ScriptException: ReferenceError: "Bootloader" is not defined. at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:684) at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:602) at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507) at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:616) at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:591) at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunctionIfPossible(HtmlPage.java:985) at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeEventHandler(EventListenersContainer.java:210) at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeBubblingListeners(EventListenersContainer.java:230) at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:804) at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:738) at com.gargoylesoftware.htmlunit.html.HtmlElement$1.run(HtmlElement.java:869) at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:602) at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507) at com.gargoylesoftware.htmlunit.html.HtmlElement.fireEvent(HtmlElement.java:874) at com.gargoylesoftware.htmlunit.html.HtmlElement.doClickFireClickEvent(HtmlElement.java:1311) at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1253) at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1205) at com.gargoylesoftware.htmlunit.html.HtmlElement.dblClick(HtmlElement.java:1351) at com.gargoylesoftware.htmlunit.html.HtmlElement.dblClick(HtmlElement.java:1326) at prototype.Profile.postLinkOnWall(Profile.java:225) at html.Log.findNext(Log.java:150) at prototype.Prtp.main(Prtp.java:49) Caused by: net.sourceforge.htmlunit.corejs.javascript.EcmaError: ReferenceError: "Bootloader" is not defined. at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3603) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3587) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.notFoundError(ScriptRuntime.java:3657) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.nameOrFunction(ScriptRuntime.java:1749) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.name(ScriptRuntime.java:1690) at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1622) at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:798) at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:105) at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.doTopCall(ContextFactory.java:405) at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.doTopCall(HtmlUnitContextFactory.java:309) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3031) at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:103) at com.gargoylesoftware.htmlunit.javascript.host.EventHandler.call(EventHandler.java:81) at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$4.doRun(JavaScriptEngine.java:609) at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:669) ... 21 more Enclosed exception: net.sourceforge.htmlunit.corejs.javascript.EcmaError: ReferenceError: "Bootloader" is not defined. at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3603) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3587) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.notFoundError(ScriptRuntime.java:3657) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.nameOrFunction(ScriptRuntime.java:1749) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.name(ScriptRuntime.java:1690) at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpretLoop(Interpreter.java:1622) at script.onclick(onclick event for HtmlDivision[
] in https://www.facebook.com/?_fb_noscript=1) at net.sourceforge.htmlunit.corejs.javascript.Interpreter.interpret(Interpreter.java:798) at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:105) at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.doTopCall(ContextFactory.java:405) at com.gargoylesoftware.htmlunit.javascript.HtmlUnitContextFactory.doTopCall(HtmlUnitContextFactory.java:309) at net.sourceforge.htmlunit.corejs.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:3031) at net.sourceforge.htmlunit.corejs.javascript.InterpretedFunction.call(InterpretedFunction.java:103) at com.gargoylesoftware.htmlunit.javascript.host.EventHandler.call(EventHandler.java:81) at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$4.doRun(JavaScriptEngine.java:609) at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:669) at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:602) at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507) at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:616) at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.callFunction(JavaScriptEngine.java:591) at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptFunctionIfPossible(HtmlPage.java:985) at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeEventHandler(EventListenersContainer.java:210) at com.gargoylesoftware.htmlunit.javascript.host.EventListenersContainer.executeBubblingListeners(EventListenersContainer.java:230) at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:804) at com.gargoylesoftware.htmlunit.javascript.host.Node.fireEvent(Node.java:738) at com.gargoylesoftware.htmlunit.html.HtmlElement$1.run(HtmlElement.java:869) at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:602) at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:507) at com.gargoylesoftware.htmlunit.html.HtmlElement.fireEvent(HtmlElement.java:874) at com.gargoylesoftware.htmlunit.html.HtmlElement.doClickFireClickEvent(HtmlElement.java:1311) at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1253) at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1205) at com.gargoylesoftware.htmlunit.html.HtmlElement.dblClick(HtmlElement.java:1351) at com.gargoylesoftware.htmlunit.html.HtmlElement.dblClick(HtmlElement.java:1326) at prototype.Profile.postLinkOnWall(Profile.java:225) at html.Log.findNext(Log.java:150) at prototype.Prtp.main(Prtp.java:49) == CALLING JAVASCRIPT == function () { [native code, arity=0] } ======= EXCEPTION END ========

我写的框在普通的浏览器上运行一个重新格式化的函数,这个函数不是用HtmlUnit执行的,所以我试着用dbclick()来强制它.

2 个回答
  • HtmlUnit与JavaScript不兼容.它会经常抛出错误抱怨未定义的变量或函数.

    从这个意义上说,现实生活中的浏览器(FireFox,Internet Explorer,Chrome等)更加灵活.这意味着它们将允许语法错误的HTML和JavaScript(例如:不定义函数或不结束HTML标记).

    HtmlUnit期望一切都(几乎)完美.虽然,它会修复一些丢失的结束HTML标记,但一般来说,它希望页面中的代码不包含任何类型的错误.此外,即使一切看起来都正确,HtmlUnit甚至可能会抱怨.

    您要考虑的一些项目是:

    最重要的是在不同之间切换BrowserVersions.您可以在创建WebClient对象时设置它们.事实证明,Internet Explorer(具有讽刺意味的是)在解释JavaScript方面给了我最好的结果

    确保您的HTML和JavaScript代码都正确无误

    避免使用复杂的库(jQuery似乎得到了适当的支持)

    尝试使用非最小化版本的库

    如果您碰巧使用jQuery(或其他类似的库),请避免使用复杂的jQuery方法(例如:向元素动态添加事件)

    当然,如果您可以控制从服务器获取的源代码,那么这些注释将适用.有时,事实并非如此.在这种情况下,你的双手更加紧密.

    一种选择是用以下方法来抑制异常:

    webClient.getOptions().setThrowExceptionOnScriptError(false);
    

    虽然,这将使您通过异常将不会更正任何JavaScript错误.这意味着如果抛出此异常的JS代码在您的逻辑中恰好是至关重要的,我的意思是,您绝对依赖于该代码的执行结果,那么您就不能让HtmlUnit处理您的JS.如果这恰好是AJAX请求的结果,那么您可以自己手动发出请求,而不是让HtmlUnit这样做.

    另一方面,如果给你麻烦的JS代码在你的逻辑中并不重要,我的意思是,它可能只是隐藏一个元素或改变你不关心的颜色,然后抑制异常将是要走的路.

    剩下的选择不多.

    2023-02-13 15:43 回答
  • 尝试设置您的Web客户端不要抛出异常:

    client.getOptions().setThrowExceptionOnScriptError(false);
    

    2023-02-13 15:43 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有