如何使用无头(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 中启用闪存

如何在 selenium 中使用无头 Chrome 启用 JavaScript

您如何将无头 Chrome 与 Selenium 一起使用?

如何使用 Java 和 Selenium 为我的驱动程序传递无头选项?

如何在 Selenium 的无头 Firefox 中使用 --screenshot 和 python

如何使用phantomjs无头浏览器处理selenium中的警报