2012-04-05 107 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); 
相关问题