HtmlUnit 超时调试



我正在使用HtmlUnit登录网站。尽管设置了连接超时和 Javascript 超时,脚本在尝试登录站点时仍会挂起。本网站是一个不向网络开放的内部页面。

以下是我正在使用的 webClient 配置:

      RefreshHandler rh = new RefreshHandler() 
      {
            public void handleRefresh( final Page page, final URL url, final int seconds ) 
            {
            }
      };
    webClient.setRefreshHandler(rh);
    webClient.getOptions().setTimeout(90000);  //Set Connection Timeout to 1.5 minute 
    webClient.setJavaScriptTimeout(45000);     //Set JavaScript Timeout to 0.75 minute
    webClient.getOptions().setCssEnabled(false);
    webClient.getOptions().setJavaScriptEnabled(true);
    webClient.setAjaxController(new NicelyResynchronizingAjaxController());
    webClient.getCookieManager().setCookiesEnabled(true);
    webClient.getOptions().setThrowExceptionOnFailingStatusCode(false);
    webClient.getOptions().setThrowExceptionOnScriptError(false);
    webClient.getOptions().setPrintContentOnFailingStatusCode(false);
    webClient.getOptions().setRedirectEnabled(true);
     System.setProperty("https.protocols", "SSLv3,SSLv2Hello");

注意:我使用的是 IBM Jdk 1.7HtmlUnit 2.12(最新的(。我已经将所有 21 个依赖项 jar 包含在项目的构建路径中。它不使用任何日志记录机制。它使用 println 语句在控制台上打印出所有内容。

我正在尝试弄清楚以下内容:

为什么脚本挂起并且不超时?我在这个论坛上研究过这个问题。我知道人们已经遇到过它,但没有来指责任何具体的解决方案。sourceforge上也没有任何内容表明HtmlUnit中存在"开放"错误。

有没有办法确保脚本永远不会挂起?我认为设置上面的两个超时就可以了。除了网络/连接问题和无响应的javascript之外,可能还有其他原因会使脚本永远等待?

我知道HtmlUnit使用Apache HttpClient进行http调用。我想在不从源代码构建的情况下调试此问题(我想将其作为我的最后一个选择,因为我对 java 相当陌生(。有没有办法在调试/详细模式下运行 Htmlunit/HttpClient,以便它将所有内容打印到控制台上。HtmUnit API 是否支持此功能?

我使用了下面给出的所有 3 个,但似乎都不起作用:

System.getProperties().put("org.apache.commons.logging.simplelog.defaultlog", "debug");  
java.util.logging.Logger.getLogger("com.gargoylesoftware").setLevel(Level.All);
java.util.logging.Logger.getLogger("org.apache.http").setLevel(Level.All);

第一个是在HtmlUnit主页的"日志记录"部分中指定的。

感谢您的帮助/评论。谢谢

由于我不太清楚以下行的作用,我将回答,因为它不存在:

System.setProperty("https.protocols", "SSLv3,SSLv2Hello");

您应该首先尝试尽可能简化代码以获得最小的情况(例如:您尚未澄清您的应用程序是否在禁用 javascript 的情况下挂起。

完成此操作后,您应该仔细查看要获取的HtmlPage。检查页面正在获取的其他对象,尤其是 iframe。然后看看这个问题和答案:

极其简单的代码在 HtmlUnit 中不起作用

(是的,那是我和你经历的症状(。但是,我走得更远,并使用jstack来了解线程及其在做什么。简而言之(作为剧透(,关于 iframe 负载循环存在某种问题。解决方案...井。。。你不会喜欢的。检查问题,你会发现:)

作为旁注,尝试启用所有日志记录,将throwException*标志设置为 true,删除任何特定的日志记录命令(如果您正在设置.setLevel(Level.All)并且您没有得到任何东西,一定是出了问题......但由于 HtmlUnit 默认提供相当多的日志记录,您可能不需要添加更多(。

只有我的2美分。

driver.setJavaScriptTimeout(1000);

HtmlUnit 使用 driver.setJavaScriptTimeout(1000) 来设置 JavaScript 超时。

相关内容

  • 没有找到相关文章

最新更新