JavaScript 单击 google 结果页面时 HtmlUnit 出现异常

JavaScript Exception in HtmlUnit when clicking at google result page

我想使用 HtmlUnit (v2.21) 从 google 获取一些搜索结果页面。这就需要我在找人的时候点击"people also looked for"link(右边,看例子link),会触发一些JavaScript,改变当前页面的内容.但这给了我一个 JavaScript 包装异常(见下文)。

可点击示例link:https://www.google.de/search?ie=UTF-8&safe=off&q=nicki+minaj

有错误的简单测试用例:

String url = "https://www.google.de/search?ie=UTF-8&safe=off&q=nicki+minaj";
WebClient client = new WebClient(BrowserVersion.BEST_SUPPORTED);
HtmlPage page = client.getPage(url);
HtmlElement link = page.getFirstByXPath("//a[@class='_Zjg']");
HtmlPage newPage = link.click(); //throws exception
this.storeResultFile(newPage.asXml(), "test");
client.close();

结果:

net.sourceforge.htmlunit.corejs.javascript.WrappedException: Wrapped java.lang.NullPointerException
at net.sourceforge.htmlunit.corejs.javascript.Context.throwAsScriptRuntimeEx(Context.java:2053)
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.doProcessPostponedActions(JavaScriptEngine.java:947)
at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.processPostponedActions(JavaScriptEngine.java:1012)
at com.gargoylesoftware.htmlunit.html.DomElement.click(DomElement.java:799)
at com.gargoylesoftware.htmlunit.html.DomElement.click(DomElement.java:742)
at com.gargoylesoftware.htmlunit.html.DomElement.click(DomElement.java:689)

我存储了 "page" 对象的 xml 并确保 XPath 表达式有效并且有结果。

有人有什么想法吗?

看起来 JavaScript-Engine(基于 Rhino)很容易在某些脚本问题上崩溃并退出,而其他浏览器仍然能够 运行 该脚本。 我不知道 google 的脚本是否有错误,但是这两行为我解决了它:

JavaScriptEngine engine = client.getJavaScriptEngine();
engine.holdPosponedActions();

然而,当 运行在多个线程中设置多个 htmlunit 对象时,仍然有可能遇到此错误。这与其说是解决方案,不如说是解决方法。