java - 在 docker 中使用 Selenium-hub 下载文件,其中内容类型标头在加载时更改(Java)
问题描述
好的,所以我目前正在通过 Selenium 和 ChromeDriver 自动化一个旧的、非常奇怪的 ASP 应用程序。使用 Chrome 浏览器和最新的 ChromeDriver 可执行文件在本地运行时一切正常,但是当切换到使用 selenium-hub 在 Docker 中运行应用程序时,我遇到了这个问题。
相关文件由 ASP 应用程序根据用户当前选择的数据动态生成。用户的最新查询似乎在某处针对他们的会话 ID 进行缓存,当您单击导出按钮时,它会触发一个 JavaScript 事件,该事件执行一个 window.open 命令来加载页面。此页面查找来自当前用户的最后一个查询(存储在 cookie 中)并创建一个文件以供下载。一旦文件准备好,它将文件的内容类型头更改为不同的 MIME 类型并设置文件名,然后浏览器下载它。文件的格式更糟糕,因为他们将其下载为 XLS 文档,但它实际上是一个内部的 HTML 文档,可以很容易地被浏览器呈现。
当它在 Chrome 的普通实例中运行时,这一切都很好(好吧,尽可能好!),但是当使用基于 docker(或者实际上是本地无头)实例时,下载实际上不会发生。我尝试了以下方法:
- 手动设置下载目录
- 禁用弹出窗口阻止
- 将各种 MIME 类型设置为从不要求下载
- 在浏览器中加载文档,获取源代码,并将其写入文件(浏览器不会呈现它,因为它的 MIME 类型错误)
我当前的 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);
我在这里将头靠在砖墙上,如果有人对我如何实现这一目标有任何见解,我将不胜感激!
提前致谢!
解决方案
推荐阅读
- node.js - 如何使用 stream.write 将密码发送到 ssh2 会话中的 ttys0 会话
- amazon-web-services - 我们计算的请求签名与您提供的签名不匹配。检查您从 Salesforce 到 amazon s3 的密钥和签名方法
- r - ggpaired (boxplot) 错误地配对数据点
- angular - 在 *ngIf 中加载动态组件 - createComponent 未定义
- vb.net - DateTime.Now = 无法提供值:找不到主机值
- selenium-webdriver - Selenium Chrome WebDriver 在 .NetCore 3.0 上抛出空异常
- excel - Excel 打开时如何禁用 Worksheet.Change 事件?然后在宏运行后重新启用它
- c++ - 以下代码中的变量 b 是什么以及 c++ 中联合的可能好处是什么?
- json - PowerShell 查找并枚举嵌套 JSON 数组中的属性
- wordpress - 我收到错误“ParseError 引发语法错误,意外'<',期待文件结尾”