2016-05-04 13 views
0

Ich möchte HtmlUnit (v2.21) verwenden, um einige Suchergebnisseiten von Google zu erhalten. Dies erfordert, dass ich bei der Suche nach einer Person auf den Link "Personen auch gesucht" klicke (rechte Seite, siehe Beispiel-Link), wodurch JavaScript ausgelöst wird und der Inhalt der aktuellen Seite geändert wird. Aber das gibt mir eine JavaScript Wrapper Exception (siehe unten).JavaScript Ausnahme in HtmlUnit beim Klicken auf Google Ergebnisseite

klickbare Beispiel Link: https://www.google.de/search?ie=UTF-8&safe=off&q=nicki+minaj

Einfache Testcase mit Fehlern:

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(); 

Ergebnis:

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) 

ich die xml der "Seite" Objekt gespeichert und sorgte dafür, dass die XPath Ausdruck ist gültig und hat Ergebnisse.

Hat jemand irgendwelche Ideen?

Antwort

0

Sieht aus wie die JavaScript-Engine (basierend auf Rhino) ist sehr leicht zu verärgern und beendet einige Skript-Probleme, wo andere Browser immer noch das Skript ausführen können. Ich weiß nicht, ob es einen Fehler in den Skripten von Google ist, aber diese beiden Linien gelöst es für mich:

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

Dennoch, wenn mehrere Htmlunit-Objekte in mehreren Threads ausgeführt wird es noch möglich ist, quer durch diese zu erhalten Error. Dies ist eher ein Workaround als eine Lösung.

Verwandte Themen