- VisualStudio2022插件的安装及使用-编程手把手系列文章
- pprof-在现网场景怎么用
- C#实现的下拉多选框,下拉多选树,多级节点
- 【学习笔记】基础数据结构:猫树
HtmlUnit作为一款比Selenium更轻量的HeadLess的Java版本浏览器模拟器,不需要在服务器上安装部署浏览器及其Driver程序.
但是,众所周知,HtmlUnit对JS脚本的支持并不是很友好,GitHub中大部分的issue都和JS执行错误有关,作者也一直在升级JS Engine.
笔者在实际使用过程中(HtmlUnit 4.1.0版本),也遇到了JS执行问题,并且issue、StackOverflow和google均未找到较好的解决方案.
具体问题原因,是由于原站使用了ES6中的async、await、then等关键字和方法.
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的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
在 ejb 项目中注入(inject) javascript 时出现此错误: Unhandled exception type ScriptException. 这是我的代码: @Override p
我正在使用 HtmlUnitDriver,这是我的代码。 HtmlUnitDriver driver = new HtmlUnitDriver(true); driver.get("som
我遇到了一行代码的问题,它可能会触发一些 js 函数并导致异常,我该如何解决这个问题? box.setText(link.toString()); client.waitForBackgroundJa
如何通过symfony配置启用动态脚本? I have simply multiply 2*2 but it can't works. curl -XGET 'http://localhost:920
我正在使用 HTMLUnit 来抓取网站。我正在使用 htmlunit-2.19 版本。我知道这是重复的问题,但相信我,我尝试了在谷歌中找到的所有解决方案,但我仍然遇到了这个异常(exception)
我正在使用 htmlunit 2.9 并且在 java 脚本解析时由于 console 在以下异常中出现脚本异常 function debug(o){ if (console && console
在一个 Maven 项目中,我有使用 Kotlin ScriptEngine 的测试。 (只需调用 scriptEngine.eval(script) )。当我从 IntelliJ 运行测试时,它们都
我正在使用 Jmeter 5.0,其中我在 JSR223 后处理器中编写了一段 Java 代码。代码如下- import java.util.Map; import java.util.HashMap
我正在尝试使用 JSR223 预处理器在 JMeter 中实现下面的代码,但是面临标题中提到的问题。 public class G2bApiServletReturns extends GstUtil
我正在使用 JRE6 中内置的 JSR-223 脚本引擎执行 Javascript。 Javascripts 能够访问 Java 代码和对象。当从 JavaScript 执行的 Java 代码抛出异常
我们有一个字符串输入,比如说2+2。现在我们要对其进行转换以便计算。我已经为其编写了以下代码,如果我在 main 方法中使用此 throws ScriptException ,它就会起作用。但我不想在
我使用 testng 和 htmlUnitDriver 运行 Selenium 测试。我使用一个 webDriver 实例进行所有测试。我只是在每个测试类之后注销并清除 cookie driver.m
我运行下面的 java 文件时遇到此错误。 import java.io.BufferedReader; import java.io.InputStreamReader; import java.
尝试使用 JSR233 采样器在 Jmeter 中运行 Selenium Webdriver 脚本。该脚本在 Eclipse IDE 中运行良好,但在 Jmeter 中遇到以下错误。 ERROR o.
我正在尝试浏览http://taxtest.navajocountyaz.gov/Pages/WebForm1.aspx?p=1&apn=10301003B使用 Java 代码和最新版本的 HTMLU
[root@piyushjoshi bin]# sh cli.sh用户名: 管理员密码:欢迎使用 XL Deploy Jython CLI!输入“help”以了解可用于与 XL Deploy 交互的对
我是一名优秀的程序员,十分优秀!