0

我正在使用 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 主页的“日志记录”部分中指定的。

感谢您的帮助/意见。谢谢

4

2 回答 2

1

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

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

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

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

非常简单的代码在 HtmlUnit 中不起作用

(是的,那是我遇到与您相同的症状)。然而,我走得更远了,使用 jstack 来了解线程和它们在做什么的低层次概念。简而言之(作为剧透),iframe 加载循环存在某种问题。解决方案......好吧......你不会喜欢它。检查问题,你会发现:)

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

只是我的2美分。

于 2013-10-10T05:03:51.390 回答
0
driver.setJavaScriptTimeout(1000);

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

于 2017-07-11T22:52:05.767 回答