解决HtmlUnit执行JS报错提示ScriptException

htmlunit,js,scriptexception · 浏览次数 : 0

小编点评

**解决方法:** 1. **处理 HtmlUnit不支持的 JS关键字:** - 遍历页面上的所有 JS 文件。 - 检查文件名的扩展名是否是 `.js`。 - 如果扩展名为 `.js`,则进行代码替换,替换 `async` 和 `await` 关键字。 2. **修改 JS 资源的源代码:** - 可以在页面加载前动态修改 JS 资源的源代码,过滤不支持的关键字。 - 使用 `ScriptPreProcessor` 接口的钩子方法,根据需要修改 JS 代码。 3. **分析原站 JS代码:** - 如果 JS 对象不支持,则通过 Java 代替实现逻辑。 - 通过变量赋值、修改JS 代码的方式进行处理。 **示例代码:** ```java // ScriptPreProcessor 接口的处理方法 @Override public void setScriptPreProcessor(ScriptPreProcessor scriptPreProcessor) { scriptPreProcessor.setEnabled(true); scriptPreProcessor.setJavaScriptEnabled(true); } ``` **其他提示:** - 使用 `HtmlUnit 5.0` 版本中的 `JsoupPreProcessor` 接口,它支持更广泛的 JS 语法。 - 在处理 JS 代码时,可以使用正则表达式或其他字符串处理工具进行匹配和替换。 - 在修改 JS 代码之前,应考虑页面内容的安全性。

正文

问题描述

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

但是,众所周知,HtmlUnit对JS脚本的支持并不是很友好,GitHub中大部分的issue都和JS执行错误有关,作者也一直在升级JS Engine。

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

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

org.htmlunit.ScriptException: missing ; before statement (https://www.xxx.com/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)

解决方法

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

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

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

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

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

与解决HtmlUnit执行JS报错提示ScriptException相似的内容:

解决HtmlUnit执行JS报错提示ScriptException

问题描述 HtmlUnit作为一款比Selenium更轻量的HeadLess的Java版本浏览器模拟器,不需要在服务器上安装部署浏览器及其Driver程序。 但是,众所周知,HtmlUnit对JS脚本的支持并不是很友好,GitHub中大部分的issue都和JS执行错误有关,作者也一直在升级JS En

解决卡顿发热,超帧技术焕发中重载游戏动力

近几年,中国手游市场规模不断扩大,开发者通过在画面、玩法等方面的持续创新和打磨,推出更加精品化的产品。然而愈发精美的画质和复杂的玩法,也给硬件带来超高的负载,导致玩家在游戏过程中,频繁出现掉帧卡顿、发烫、续航差等体验降低的现象。 HarmonyOS SDK 图形加速服务(Graphics Accel

解决 Xshell 无法使用 zsh 的 prompt style

为了更好的阅读体验,请点击这里 先学习一下 zsh 的配置吧~ 参考资料 从 0 开始:教你如何配置 zsh powerlevel10k 如何给 Xshell 配置呢 当我安装完 oh-my-zsh、powerlevel10k、fast-syntax-highlighting、以及若干(powerl

解决Python使用GPU

本文简单介绍了使用Python解决使用GPU的方法,并给出了TensorFlow和PyTorch示例;本文还介绍了TensorFlow GPU的安装版本介绍,以及介绍了安装CUDA的详细教程。

第134篇:解决浏览器的CORS跨域问题(CORS policy: Cross origin requests are only supported for protocol schemes: http, data, isolated-app, chrome-extension, chrome-untrusted, https, edge.)

好家伙, 我继续尝试着将我的飞机大战使用ES6模块化分离开来,出了点问题 1.出现问题: edge,chrome等一系列浏览器,会为了安全,禁止你跨域访问 目录如下: 主程序 index.html main_1.js main.js 完整代码如下: 1 /* //plane封装成类 2 //实例化后

[转帖]解决Java中的java.io.IOException: Broken pipe问题

https://www.cnblogs.com/Chary/p/16835248.html Java 中java.io.IOException: Broken pipe 认识broken pipe pipe是管道的意思,管道里面是数据流,通常是从文件或网络套接字读取的数据。 当该管道从另一端突然关闭

[转帖]解决Nginx负载均衡重复提交问题

https://www.qiansw.com/resolving-nginx-load-balancing-repeated-commit-problems.html 这篇文章的发布时间较早,其中的信息可能已经过时,阅读时请注意甄别。 Nginx [测试环境 Tengine version: Ten

[转帖]解决vCenter6.x由于证书过期问题无法登录

https://www.dinghui.org/vcenter-sts-certificate.html#:~:text=%E8%BF%99%E6%97%B6%E5%80%99%EF%BC%8C%E5%8F%AF%E8%83%BD%E5%B0%B1%E6%98%AF%E9%81%87%E5%88%B

[转帖]解决jmeter请求响应结果乱码的问题

如下图所示,请求百度接口的时候,发现返回的信息里面中文是乱码 这个时候我们只需要改一下jmeter里的配置文件,设置响应结果的字符编码为UTF-8就行了。 进入jmeter安装目录/bin中,找到jmeter.properties这个文件,windows用文本编辑器打开,我是mac的,直接vim编辑

[转帖]解决Harbor在服务器重启后无法自启动的问题

问题 当部署Harbor的服务器在重启之后,可能会出现Harbor无法跟随系统自启动 解决方案 现假设Harbor的安装目录位置为/usr/local/harbor,在Harbor安装完成之后,在此目录下会生成docker-compose.yml配置文件,可以使用docker-compose操作此文