我需要使用Java中的无头网络浏览器下载文件。我检查了HtmlUnit,我可以在一些简单的情况下下载文件,但是当Ajax初始化下载时我无法下载(实际上它更复杂,因为有两个请求,第一个下载第二个请求实际下载文件的URL来自给定的URL)。我用Selenium取代了HtmlUnit。我已经检查了两个WebDrivers,HtmlUnitDriver和ChromeDriver。
ChromeDriver - 我能够以可见模式下载文件,但是当我打开无头模式时,不再下载文件
ChromeOptions lChromeOptions = new ChromeOptions();
HashMap<String, Object> lChromePrefs = new HashMap<String, Object>();
lChromePrefs.put("profile.default_content_settings.popups", 0);
lChromePrefs.put("download.default_directory", _PATH_TO_DOWNLOAD_DIR);
lChromeOptions.setExperimentalOption("prefs", lChromePrefs);
lChromeOptions.addArguments("--headless");
return new ChromeDriver(lChromeOptions);
我知道由于安全原因,无头模式下载文件已关闭,但必须有一些解决方法
之前我使用过2.28 httpunit,几分钟前我开始使用2.29但仍然看起来Ajax功能停在某处。这是我在点击并期望文件数据后检索数据的方式:_link.click()。getWebResponse()。getContentAsStream()
WebConnectionWrapper是否显示在网站上发出的所有请求/响应?您知道我如何调试这个以获得更好的洞察力?我看到点击链接后Ajax函数的第一部分被正确调用(此函数中有2个http请求)。在WebConnectionWrapper -> getResponse
内提取第一个响应后,我甚至尝试创建自定义http请求以检索数据/文件,但它返回404错误,表示第二个请求已经以某种方式完成但我没有看到任何日志/调试信息在_link.click().getWebResponse().getContentAsStream()
和WebConnectionWrapper -> getResponse()
答案 0 :(得分:0)
关于HtmlUnit,你可以试试这个:
在dom元素上调用click()是同步调用。这意味着,在检索和处理此调用的响应之后,这将返回。通常所有的JS库都在那里做一些异步魔法(比如用各种(好的)原因开始使用setTimeout(,10)进行一些处理。你的代码会意识到这一点。
更好的方法是做这样的事情
Page page = _link.click();
webClient.waitForBackgroundJavaScript(1000);
有时,Ajax请求正在重定向到新内容。我们必须通过检查当前窗口内容来解决这个新问题
page = page.getEnclosingWindow().getEnclosedPage();
或者更好 在下载的情况下,(二进制)响应可能在新窗口中打开
WebWindow tmpWebWindow = webClient.getCurrentWindow();
tmpWebWindow = tmpWebWindow.getTopWindow();
page = tmpWebWindow.getEnclosedPage();
这可能是您正在寻找的回应。
page.getWebResponse().getContentAsStream();
猜测Web应用程序的运行情况有点棘手。如果您愿意,可以通过私人邮件联系我或在HtmlUnit用户邮件列表中讨论。