点击谷歌结果页面时,HtmlUnit中出现JavaScript异常

JavaScript Exception in HtmlUnit when clicking at google result page

本文关键字:HtmlUnit 异常 JavaScript 谷歌 结果      更新时间:2023-09-26

我想使用HtmlUnit(v2.21)从谷歌获取一些搜索结果页面。这需要我在搜索一个人时点击"人们也在寻找"链接(右侧,见示例链接),这会触发一些JavaScript并更改当前页面的内容。但这给了我一个JavaScriptWrapper异常(见下文)。

可点击的示例链接:https://www.google.de/search?ie=UTF-8&安全=关闭&q=镍+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引擎(基于Rhino)很容易在一些脚本问题上出错并退出,而其他浏览器仍然可以运行脚本。我不知道谷歌的脚本中是否有错误,但这两行为我解决了问题:

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

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