首页 > 解决方案 > 在 docker 中使用 Selenium-hub 下载文件,其中内容类型标头在加载时更改(Java)

问题描述

好的,所以我目前正在通过 Selenium 和 ChromeDriver 自动化一个旧的、非常奇怪的 ASP 应用程序。使用 Chrome 浏览器和最新的 ChromeDriver 可执行文件在本地运行时一切正常,但是当切换到使用 selenium-hub 在 Docker 中运行应用程序时,我遇到了这个问题。

相关文件由 ASP 应用程序根据用户当前选择的数据动态生成。用户的最新查询似乎在某处针对他们的会话 ID 进行缓存,当您单击导出按钮时,它会触发一个 JavaScript 事件,该事件执行一个 window.open 命令来加载页面。此页面查找来自当前用户的最后一个查询(存储在 cookie 中)并创建一个文件以供下载。一旦文件准备好,它将文件的内容类型头更改为不同的 MIME 类型并设置文件名,然后浏览器下载它。文件的格式更糟糕,因为他们将其下载为 XLS 文档,但它实际上是一个内部的 HTML 文档,可以很容易地被浏览器呈现。

当它在 Chrome 的普通实例中运行时,这一切都很好(好吧,尽可能好!),但是当使用基于 docker(或者实际上是本地无头)实例时,下载实际上不会发生。我尝试了以下方法:

我当前的 chrome 选项如下所示:

HashMap<String, Object> chromePrefs = new HashMap<String, Object>();
chromePrefs.put("profile.default_content_settings.popups", 0);
chromePrefs.put("download.default_directory", directoryName);
chromePrefs.put("helperApps.neverAsk.saveToDisk", Arrays.asList("text/plain", "application/xls", "application/csv", "application/force-download", "application/octet-stream", "application/vnd.ms-excel"));
ChromeOptions options = new ChromeOptions();
options.addArguments("--browser.helperApps.neverAsk.saveToDisk=text/plain");
options.addArguments("--browser.helperApps.neverAsk.saveToDisk=application/csv");
options.addArguments("--browser.helperApps.neverAsk.saveToDisk=application/xls");
options.addArguments("--browser.helperApps.neverAsk.saveToDisk=application/force-download");
options.addArguments("--browser.helperApps.neverAsk.saveToDisk=application/octet-stream");
options.addArguments("--browser.helperApps.neverAsk.saveToDisk=application/vnd.ms-excel");

options.addArguments("--browser.download.dir="+directoryName);

options.setExperimentalOption("excludeSwitches",  Arrays.asList("enable-automation", "disable-popup-blocking"));
options.setExperimentalOption("useAutomationExtension", false);

options.setExperimentalOption("prefs", chromePrefs);

我在这里将头靠在砖墙上,如果有人对我如何实现这一目标有任何见解,我将不胜感激!

提前致谢!

标签: javadockerseleniumselenium-webdriverselenium-chromedriver

解决方案


推荐阅读