Java Selenium无头Chrome模式无法下载文件问题求助
Chrome无头模式在Github Actions/AWS环境下无法下载文件的排查与解决
针对你遇到的本地正常但CI/AWS环境下无头Chrome无法下载的问题,结合你的配置,给出以下排查方向和解决方案:
1. 确保下载目录存在且有权限
在服务器或CI环境中,代码指定的downloadDirectory可能不存在,或者运行进程没有写入权限。先在代码中添加目录创建逻辑:
File downloadDir = new File(downloadDirectory); if (!downloadDir.exists()) { downloadDir.mkdirs(); }
同时检查环境中该目录的读写权限,比如在Github Actions中,默认工作目录是有权限的,但自定义路径需要确认。
2. 补充无头模式下载的关键配置
新的--headless=new模式下,默认的安全策略可能拦截下载请求,需要补充以下配置:
- 添加参数禁用弹窗拦截和启用网络服务:
headlessChromeOption.addArguments("--disable-popup-blocking"); headlessChromeOption.addArguments("--enable-features=NetworkService,NetworkServiceInProcess"); - 完善下载偏好设置:
headlessChromePrefs.put("download.directory_upgrade", true); headlessChromePrefs.put("safebrowsing.enabled", false); // 关闭安全浏览检查,避免拦截未知来源文件
3. 严格匹配ChromeDriver与Chrome版本
Selenium 4.4.0对应的ChromeDriver版本范围是104.x-106.x,务必确保CI/AWS环境中安装的Chrome版本和ChromeDriver版本完全匹配。比如在Github Actions中,可以显式指定Chrome版本:
- name: Setup Chrome uses: browser-actions/setup-chrome@latest with: chrome-version: '106'
4. 移除冗余的DesiredCapabilities配置
Selenium 4+版本推荐直接使用ChromeOptions,不需要再通过DesiredCapabilities合并,你的代码中这部分可以删除,简化配置:
// 移除以下冗余代码 // DesiredCapabilities capabilities = new DesiredCapabilities(); // capabilities.setCapability(ChromeOptions.CAPABILITY, headlessChromeOption); // headlessChromeOption.merge(capabilities);
5. 启用日志排查下载请求
如果以上方法无效,开启Chrome的性能日志,查看下载请求是否被触发或拦截:
LoggingPreferences logs = new LoggingPreferences(); logs.enable(LogType.PERFORMANCE, Level.ALL); headlessChromeOption.setLoggingPreferences(logs);
之后通过driver.manage().logs().get(LogType.PERFORMANCE)获取日志,分析请求状态码和错误信息,定位具体阻塞点。
调整后的完整配置示例
HashMap<String, Object> headlessChromePrefs = new HashMap<String, Object>(); ChromeOptions headlessChromeOption = new ChromeOptions(); // 确保下载目录存在 File downloadDir = new File(downloadDirectory); if (!downloadDir.exists()) { downloadDir.mkdirs(); } // 无头模式核心参数 headlessChromeOption.addArguments("--headless=new"); headlessChromeOption.addArguments("--disable-gpu"); headlessChromeOption.addArguments("--disable-dev-shm-usage"); headlessChromeOption.addArguments("--no-sandbox"); headlessChromeOption.addArguments("--window-size=1920,1200"); headlessChromeOption.addArguments("--disable-popup-blocking"); headlessChromeOption.addArguments("--enable-features=NetworkService,NetworkServiceInProcess"); // 下载偏好设置 headlessChromePrefs.put("download.default_directory", downloadDirectory); headlessChromePrefs.put("download.prompt_for_download", false); headlessChromePrefs.put("download.directory_upgrade", true); headlessChromePrefs.put("safebrowsing.enabled", false); headlessChromeOption.setExperimentalOption("prefs", headlessChromePrefs); // 初始化Driver driver = new ChromeDriver(headlessChromeOption);
另外,还要检查CI/AWS环境的网络策略,确保目标下载地址没有被代理、防火墙或安全组拦截。
内容的提问来源于stack exchange,提问作者bitwisebro
相关产品推荐
相关产品推荐

