如何使用无头(gui-less)Selenium WebDriver下载文件
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用无头(gui-less)Selenium WebDriver下载文件相关的知识,希望对你有一定的参考价值。
我需要使用Java中的无头网络浏览器下载文件。我检查了htmlUnit,在一些简单的情况下我能够下载文件但是当Ajax初始化下载时我无法下载(实际上它更复杂,因为有两个请求,第一个下载第二个请求实际下载文件的URL来自给定的URL)。我用Selenium取代了HtmlUnit。我已经检查了两个WebDrivers,HtmlUnitDriver和ChromeDriver。
- HtmlUnitDriver - 类似HtmlUnit的行为
- 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()
都没有看到任何日志/调试信息
关于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用户邮件列表中讨论。
以上是关于如何使用无头(gui-less)Selenium WebDriver下载文件的主要内容,如果未能解决你的问题,请参考以下文章
如何在 selenium 中使用无头 Chrome 启用 JavaScript
您如何将无头 Chrome 与 Selenium 一起使用?
如何使用 Java 和 Selenium 为我的驱动程序传递无头选项?