2012-04-05 63 views
3

我目前正在嘗試使用HtmlUnit。我想填寫一份表格然後提交。但是這會導致錯誤,這似乎是由文件不可訪問導致的,導致連接重置被拋出。 我該如何抑制這一點,因爲考慮到整個網站的加載過程,這並不重要? 它似乎並沒有影響程序,但是,我只是想讓它變得沉默。如何告訴htmlunit忽略某些錯誤

Apr 05, 2012 12:25:13 PM com.gargoylesoftware.htmlunit.html.HtmlPage loadExternalJavaScriptFile 
Schwerwiegend(severe): Error loading JavaScript from [*link*]. 
java.net.SocketException: Connection reset 
    at java.net.SocketInputStream.read(Unknown Source) 
    at java.net.SocketInputStream.read(Unknown Source) 
    at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:149) 
    at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:110) 
    at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:264) 
    at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:98) 
    at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:252) 
    at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:281) 
    at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:247) 
    at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:219) 
    at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:298) 
    at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125) 
    at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:645) 
    at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:464) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820) 
    at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:776) 
    at com.gargoylesoftware.htmlunit.HttpWebConnection.getResponse(HttpWebConnection.java:152) 
    at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseFromWebConnection(WebClient.java:1439) 
    at com.gargoylesoftware.htmlunit.WebClient.loadWebResponse(WebClient.java:1358) 
    at com.gargoylesoftware.htmlunit.html.HtmlPage.loadJavaScriptFromUrl(HtmlPage.java:1008) 
    at com.gargoylesoftware.htmlunit.html.HtmlPage.loadExternalJavaScriptFile(HtmlPage.java:950) 
    at com.gargoylesoftware.htmlunit.html.HtmlScript.executeScriptIfNeeded(HtmlScript.java:349) 
    at com.gargoylesoftware.htmlunit.html.HtmlScript$1.execute(HtmlScript.java:230) 
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.doProcessPostponedActions(JavaScriptEngine.java:642) 
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.access$400(JavaScriptEngine.java:79) 
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine$HtmlUnitContextAction.run(JavaScriptEngine.java:590) 
    at net.sourceforge.htmlunit.corejs.javascript.Context.call(Context.java:537) 
    at net.sourceforge.htmlunit.corejs.javascript.ContextFactory.call(ContextFactory.java:538) 
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:499) 
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.execute(JavaScriptEngine.java:474) 
    at com.gargoylesoftware.htmlunit.html.HtmlPage.executeJavaScriptIfPossible(HtmlPage.java:870) 
    at com.gargoylesoftware.htmlunit.html.HtmlScript.executeInlineScriptIfNeeded(HtmlScript.java:302) 
    at com.gargoylesoftware.htmlunit.html.HtmlScript.executeScriptIfNeeded(HtmlScript.java:368) 
    at com.gargoylesoftware.htmlunit.html.HtmlScript$1.execute(HtmlScript.java:230) 
    at com.gargoylesoftware.htmlunit.html.HtmlScript.onAllChildrenAddedToPage(HtmlScript.java:240) 
    at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.endElement(HTMLParser.java:598) 
    at org.apache.xerces.parsers.AbstractSAXParser.endElement(Unknown Source) 
    at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.endElement(HTMLParser.java:556) 
    at org.cyberneko.html.HTMLTagBalancer.callEndElement(HTMLTagBalancer.java:1142) 
    at org.cyberneko.html.HTMLTagBalancer.endElement(HTMLTagBalancer.java:1044) 
    at org.cyberneko.html.filters.DefaultFilter.endElement(DefaultFilter.java:206) 
    at org.cyberneko.html.filters.NamespaceBinder.endElement(NamespaceBinder.java:329) 
    at org.cyberneko.html.HTMLScanner$ContentScanner.scanEndElement(HTMLScanner.java:3018) 
    at org.cyberneko.html.HTMLScanner$ContentScanner.scan(HTMLScanner.java:2005) 
    at org.cyberneko.html.HTMLScanner.scanDocument(HTMLScanner.java:908) 
    at org.cyberneko.html.HTMLConfiguration.parse(HTMLConfiguration.java:499) 
    at org.cyberneko.html.HTMLConfiguration.parse(HTMLConfiguration.java:452) 
    at org.apache.xerces.parsers.XMLParser.parse(Unknown Source) 
    at com.gargoylesoftware.htmlunit.html.HTMLParser$HtmlUnitDOMBuilder.parse(HTMLParser.java:789) 
    at com.gargoylesoftware.htmlunit.html.HTMLParser.parse(HTMLParser.java:225) 
    at com.gargoylesoftware.htmlunit.html.HTMLParser.parseHtml(HTMLParser.java:179) 
    at com.gargoylesoftware.htmlunit.DefaultPageCreator.createHtmlPage(DefaultPageCreator.java:221) 
    at com.gargoylesoftware.htmlunit.DefaultPageCreator.createPage(DefaultPageCreator.java:106) 
    at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseInto(WebClient.java:433) 
    at com.gargoylesoftware.htmlunit.WebClient.loadDownloadedResponses(WebClient.java:2187) 
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.doProcessPostponedActions(JavaScriptEngine.java:625) 
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.processPostponedActions(JavaScriptEngine.java:707) 
    at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1246) 
    at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1195) 
    at com.gargoylesoftware.htmlunit.html.HtmlElement.click(HtmlElement.java:1158) 
    at com.gargoylesoftware.htmlunit.html.HtmlImageInput.click(HtmlImageInput.java:138) 
    at com.gargoylesoftware.htmlunit.html.HtmlImageInput.click(HtmlImageInput.java:99) 
    at com.tronicguard.discovery.WebsiteManipulatorImplementation.<init>(WebsiteManipulatorImplementation.java:71) 
    at Main.main(Main.java:10) 
+0

發現的HtmlUnit一個bug在您的應用程序:一個JavaScript文件不可用。如果此文件應該可用,請將其提供。如果此文件沒有任何用途,請刪除對其的引用。測試的重點是檢測並修復bug,而不是忽略它們。 – 2012-04-05 11:10:52

+0

我知道這一點,但目前我只是在不具備遠程訪問權的不同網站上嘗試使用它。 – Sim 2012-04-05 11:19:03

回答

3

請嘗試以下

webClient.setThrowExceptionOnFailingStatusCode(false); 

,應當予以受理的404(未找到)錯誤狀態。

+0

nope,仍然是相同的錯誤仍然拋出 – Sim 2012-04-05 11:30:53

+0

我想這是一個服務器錯誤,考慮到它的連接重置。你爲什麼不把它放在try catch塊中,並且優雅地處理它? – 2012-04-05 11:39:11

+0

我能否抓住它,因爲我的程序在打印堆棧跟蹤後繼續完美 – Sim 2012-04-05 11:58:23

0

您可以使用HttpUnitOptions.setScriptingEnabled(true);HttpUnit的 和禁用javascript還取決於你的日誌記錄設置HttpUnitOptions.setExceptionsThrownOnScriptError(false);

+1

[this](http://httpunit.sourceforge.net/doc/api/com/meterware/httpunit/HttpUnitOptions.html)包是未知的,我如何獲得HttpUnitOptions類/實例? – Sim 2012-04-05 12:53:31

+0

這實際上來自com.meterware.httpunit.HttpUnitOptions;所以你需要在調用HttpUnitOptions.setScriptingEnabled(true)之前下載httpunit jar; – Brijesh 2012-04-13 07:01:17

+0

這是如何引用HtmlUnit的? – Yura 2014-05-28 14:40:19

1

HtmlPage.loadExternalJavaScriptFile()將隨時登錄這個錯誤。您需要禁用該頁面的日誌記錄,或更改閾值。

例如,如果你使用log4j的,你可以設置屬性log4j.logger.com.gargoylesoftware.htmlunit.html.HtmlPage = FATAL

然而,這將隱藏登錄HtmlPage所有錯誤的日誌記錄。

2

在使用jkd1.7.0_3編譯後運行Jenkins的測試工具時,我遇到了類似的錯誤。回到JDK1.6.0_30解決了這個問題。

0

實例化的HtmlUnit DRIVER如下:

驅動=新SilentHtmlUnitDriver(能力);

添加如下嵌套類(在同一個類實例化你的驅動程序):

  protected class SilentHtmlUnitDriver extends HtmlUnitDriver { 
       SilentHtmlUnitDriver() { 
        super(); 
        this.getWebClient().setCssErrorHandler(new SilentCssErrorHandler()); 
        this.getWebClient().getOptions().setThrowExceptionOnFailingStatusCode(false); 
        this.getWebClient().getOptions().setThrowExceptionOnScriptError(false); 

      } 

      SilentHtmlUnitDriver(DesiredCapabilities capabilities) { 
       super(capabilities); 
       this.getWebClient().setCssErrorHandler(new SilentCssErrorHandler()); 
      } 
} 
1

試試這個在對的HtmlUnit禁用惱人的警告(對不起,如果代碼是不完全正確 - 我「從Clojure的翻譯」,但我希望你得到的主要思想,至少):

Import java.util.logging.Logger; 
Import java.util.logging.Level; 

Logger.getLogger("com.gargoylesoftware").setLevel(Level.OFF); 

看看Turning HtmlUnit Warnings off獲取更多信息。那裏有一個更復雜的解決方案,但這個簡單的解決方案適用於我。

1

使用此:

LogFactory.getFactory().setAttribute("org.apache.commons.logging.Log", "org.apache.commons.logging.impl.NoOpLog"); 
     java.util.logging.Logger.getLogger("com.gargoylesoftware.htmlunit").setLevel(Level.OFF); 
     java.util.logging.Logger.getLogger("org.apache.commons.httpclient").setLevel(Level.OFF);