我正在使用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.7 和 HtmlUnit 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 超时。