首页 > 其他分享 >解决HtmlUnit执行JS报错提示ScriptException

解决HtmlUnit执行JS报错提示ScriptException

时间:2024-05-08 22:44:24浏览次数:20  
标签:java htmlunit JS 报错 sourceCode org ScriptException HtmlUnit

问题描述

HtmlUnit作为一款比Selenium更轻量的HeadLess的Java版本浏览器模拟器,不需要在服务器上安装部署浏览器及其Driver程序。

但是,众所周知,HtmlUnit对JS脚本的支持并不是很有话,GitHub中大部分的issue都和JS执行错误有关。

笔者在实际使用(HtmlUnit 4.1.0版本)过程中也遇到了JS执行问题,并且issue和google均为找到较好的解决方案。

具体问题原因,是由于访问的网站使用了ES6中的asyncawaitthen等关键字和方法。

org.htmlunit.ScriptException: missing ; before statement (https://ownfile.net/includes/js/common.js#322)
	at org.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:963)
	at org.htmlunit.corejs.javascript.Context.call(Context.java:585)
	at org.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:481)
	at org.htmlunit.javascript.HtmlUnitContextFactory.callSecured(HtmlUnitContextFactory.java:313)
	at org.htmlunit.javascript.JavaScriptEngine.compile(JavaScriptEngine.java:735)
	at org.htmlunit.javascript.JavaScriptEngine.compile(JavaScriptEngine.java:110)
	at org.htmlunit.html.HtmlPage.loadJavaScriptFromUrl(HtmlPage.java:1124)
	at org.htmlunit.html.HtmlPage.loadExternalJavaScriptFile(HtmlPage.java:1015)

解决方法

上文提到笔者在issue、Stack Overflow和google搜索良久无果。

开始逆向思考,既然有这些不支持的关键字导致JS执行报错,能否通过页面及资源加载时,修改网页的源代码,屏蔽不支持的关键字。

通过翻阅HtmlUnit官网文档,发现有个ScriptPreProcessor接口,可以通过钩子修改JS的执行代码,实现代码如下:

this.browser.setScriptPreProcessor((htmlPage, sourceCode, sourceName, lineNumber, htmlElement) -> {
    // 处理HtmlUnit不支持ES6的async、await关键字,对js源码进行处理
    if (StringUtils.contains(sourceName, "common.js")) {
        sourceCode = sourceCode.replace("async ", StringUtils.EMPTY);
        sourceCode = sourceCode.replace("await ", StringUtils.EMPTY);
    }
    
    return sourceCode;
});

大家可以根据自己遇到的具体问题,对sourceCode进行处理。

最后再引申一下,如果有些JS对象不支持,可以分析原站JS代码,通过Java代替实现JS的逻辑,再通过变量赋值、修改JS源码的方式进行处理。

标签:java,htmlunit,JS,报错,sourceCode,org,ScriptException,HtmlUnit
From: https://www.cnblogs.com/changxy-codest/p/18181093

相关文章

  • Windows平台git clone文件路径太长报错
    问题描述在Windows下拉取一些比较大的开源项目经常会提示文件路径太长(filenametoolong),然后死活都不成功解决办法1.配置gitgitconfig--systemcore.longpathstrue2.修改文件C:\ProgramFiles\Git\etc\gitconfig(需要以管理员身份打开)[core] autocrlf=true fscache=......
  • qt 使用windows 的USB库 hid.dll 报错 :undefined reference to `HidD_GetAttributes(v
     1、cmakeLists.txt文件引入相应的库: cmake_minimum_required(VERSION3.5)project(test1LANGUAGESCXX)file(GLOBSRC./*.cpp./*.h)add_executable(test1${SRC})include(GNUInstallDirs)target_link_libraries(${PROJECT_NAME}hidsetupapi)inst......
  • 报错sql_mode=only_full_group_by
    这个问题的原因是,在这种模式下,sql分组时默认只能select+分组字段以及聚合函数,相当于做一个规范检查但很多时候并不需要这个检查,因为真实sql中,分组后很多字段是1对1的,比如分组id,那么其他字段都可以查出来才对这是可以修改一下这种配置,基本上有三种方式:1、修改sql的配置文件......
  • Jenkins发版时报错Failed to instantiate [io.seata.spring.annotation.GlobalTransac
    Failedtoinstantiate[io.seata.spring.annotation.GlobalTransactionScanner]:Factorymethod'globalTransactionScanner'threwexception;nestedexceptionisjava.lang.ExceptionInInitializerError一开始以为是seata配置有问题,但最近也没有动过,直接执行发版脚本就没事......
  • 解决远程调用三方接口:javax.net.ssl.SSLHandshakeException:sun.security.validator.Va
    一、前言最近在对接腾讯会议API接口,在鉴权完成后开始调用对方的接口,在此过程中出现调用报错:javax.net.ssl.SSLHandshakeException。二、出现原因当你在进行https请求时,JDK中不存在三方服务的信任证书,导致出现错误javax.net.ssl.SSLHandshakeException:sun.security.validator.Va......
  • 关于FreeSql报错System.Exception: SQL logic error near " ": syntax error
    ps:不要什么都存数据库。。。遇到一个BUG,调试了好久没找到原因,后来打印了sql语句,问题出在msg.Msg字段的保存,如下:msg.Msg是一串JSON字符串保存的时候,FreeSql会解析成:因为特殊字符,导致保存失败。 ......
  • @RefreshScope导致xxl-job jobhandler naming conflicts项目启动报错
    问题项目里使用xxl-job定时任务框架,某个任务定义如下:@Slf4j@RefreshScope@Component@JobHandler("xxxTask")publicclassXxxTaskextendsIJobHandler{@Value("${xxx.enable:false}")privatebooleanenable;@OverridepublicReturnT<S......
  • SSH远程连接时报错提示Permission denied (publickey).的解决方法
    1.发现问题在Linux终端使用sshroot@server_ip来连接到远程服务器时,出现Permissiondenied(publickey).提示2.分析问题远程主机禁用了ssh密码登录权限本地访问远程主机的公钥没有添加或者被取消(无法认证)本地生成的一对秘钥,私钥~/.ssh/id_rsa和公钥~/.ssh/id_rsa.pub。......
  • jmap使用报错Doesn't appear to be a HotSpot VM (could not find symbol "gHotSpotVM
    报错场景问题原因服务器上装了jdk,按理来说jmap是自带了的,可以直接使用,根据情况来看是装了jmap但是无法正常使用,推测是版本的问题导致解决方式指定jdk自带的jmap工具1.查看当前java的环境变量echo$JAVA_HOME2.配置jdk自带工具的环境变量exportPATH=$JAVA_HOME/bin:$P......
  • 解决报错:Could not set property 'id' of 'class com.north.domain.Book' with value
    报错原因问题描述:因为MyBatis-Plus默认的id自增策略使用的雪花算法org.mybatis.spring.MyBatisSystemException:nestedexceptionisorg.apache.ibatis.reflection.ReflectionException:Couldnotsetproperty'id'of'classcom.north.domain.Book'withvalue'1......