ChromeDriver 117+强制弹出‘另存为’对话框的绕过方案(Selenium/Java)
Chrome 117+ 无痕模式下Selenium自动下载弹窗问题解决
为啥无痕模式会影响自动下载?
- Chrome无痕模式采用独立临时配置环境,和普通浏览器的用户配置完全隔离,你通过
prefs设置的下载规则属于普通profile,无痕会话根本不会继承这些设置。 - Chrome 117+对无痕模式的安全策略做了升级,默认强制开启下载确认弹窗,就算手动在无痕模式里开启自动下载,关闭会话后也会重置,自动化场景下没法靠常规偏好持久化这个设置。
保留无痕模式的解决办法
1. 修正ChromeOptions配置错误
你代码里存在冗余和过时的配置,先调整这些,再补充无痕模式专属的下载规则:
import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.chrome.ChromeDriver; import org.openqa.selenium.chrome.ChromeOptions; import org.openqa.selenium.remote.CapabilityType; import java.util.HashMap; public class FileDownloadHeadless { public static void main(String[] args) throws InterruptedException { // 推荐用ChromeDriverManager自动管理驱动版本,避免版本不匹配的坑 // WebDriverManager.chromedriver().setup(); ChromeOptions options = new ChromeOptions(); // 移除无用的os/os_version配置,保留必要的安全和会话设置 options.setCapability(CapabilityType.ACCEPT_SSL_CERTS, true); options.setCapability(CapabilityType.ForSeleniumServer.ENSURING_CLEAN_SESSION, true); // 正确添加无痕模式参数(废弃旧的chrome.switches方式) options.addArguments("--incognito"); // Chrome 112+推荐使用新无头模式,兼容性优于旧的--headless options.addArguments("--headless=new"); options.addArguments("--disable-gpu"); options.addArguments("--no-sandbox"); // 解决Windows/Linux下的权限问题 HashMap<String, Object> chromePrefs = new HashMap<>(); chromePrefs.put("profile.default_content_settings.popups", 0); chromePrefs.put("download.default_directory", "C:\\local_files"); chromePrefs.put("download.prompt_for_download", false); chromePrefs.put("download.directory_upgrade", true); // 目录存在时自动复用 // 针对无痕模式添加自动下载权限配置 chromePrefs.put("profile.content_settings.exceptions.automatic_downloads.*.setting", 1); chromePrefs.put("profile.default_content_setting_values.automatic_downloads", 1); // 关闭安全浏览提示,避免干扰下载流程 chromePrefs.put("safebrowsing.enabled", false); options.setExperimentalOption("prefs", chromePrefs); WebDriver driver = new ChromeDriver(options); driver.get("http://my_site.com/download"); driver.findElement(By.id("id_button_download")).click(); // 建议改用显式等待(比如监听下载目录的文件),比Thread.sleep更可靠 Thread.sleep(5000); driver.quit(); } }
2. 用临时配置目录绑定无痕模式
如果上述方法无效,可以指定临时目录作为无痕模式的配置存储,让下载偏好能被加载:
// 在ChromeOptions中添加以下配置 String tempProfileDir = System.getProperty("java.io.tmpdir") + "chrome_incognito_temp"; options.addArguments("--user-data-dir=" + tempProfileDir); options.addArguments("--incognito");
这个临时目录会被Chrome用于存储无痕会话的配置,你的prefs设置会被应用到该环境,不会被无痕模式的默认策略覆盖。
3. 终极方案:绕过浏览器直接下载
要是Chrome的限制实在绕不开,干脆跳过浏览器,直接用HTTP请求下载文件,彻底规避弹窗问题:
import java.io.FileOutputStream; import java.io.InputStream; import java.net.URL; import java.net.HttpURLConnection; // 从页面提取下载链接(动态链接可从按钮的href属性获取) String downloadLink = driver.findElement(By.id("id_button_download")).getAttribute("href"); HttpURLConnection conn = (HttpURLConnection) new URL(downloadLink).openConnection(); conn.setRequestMethod("GET"); // 若需要登录态,可复制浏览器的Cookie到请求头 // conn.setRequestProperty("Cookie", driver.manage().getCookieNamed("session_id").getValue()); InputStream in = conn.getInputStream(); FileOutputStream out = new FileOutputStream("C:\\local_files\\your_file.ext"); byte[] buffer = new byte[4096]; int bytesRead; while ((bytesRead = in.read(buffer)) != -1) { out.write(buffer, 0, bytesRead); } // 关闭流资源 out.close(); in.close(); conn.disconnect();
这种方法完全脱离浏览器交互,稳定性更高,适合自动化场景。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

