
Chrome 117 起,无痕模式(incognito)默认启用新版下载浮层(download-bubble),导致 Selenium 自动下载失败并弹出保存提示;需通过 localState 禁用 download-bubble 和 download-bubble-v2 两个实验性功能方可恢复静默下载。
chrome 117 起,无痕模式(incognito)默认启用新版下载浮层(download-bubble),导致 selenium 自动下载失败并弹出保存提示;需通过 `localstate` 禁用 `download-bubble` 和 `download-bubble-v2` 两个实验性功能方可恢复静默下载。
自 Chrome 117 版本起,Google 引入了基于 Chromium 实验性标志(flags)的全新下载 UI —— Download Bubble(含 v1 和 v2),尤其在无痕模式下默认强制启用。该机制会覆盖传统 download.default_directory 和 download.prompt_for_download 的配置逻辑,导致 Selenium 无法自动保存文件,而是弹出系统级下载确认对话框,从而中断自动化流程。
虽然关闭 incognito 模式可临时绕过此问题(因普通模式下 bubble 默认未启用),但真实测试场景常需复现用户隐私浏览行为,因此必须在保留无痕模式的前提下修复下载逻辑。
✅ 正确解法是:通过 ChromeOptions 的 localState 实验性选项,显式禁用相关 flag:
import java.util.*;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
public class TestDownload {
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "D:\driver\117\chromedriver.exe");
Map<String, Object> prefs = new HashMap<>();
prefs.put("download.default_directory", "D:\driver");
prefs.put("download.prompt_for_download", false);
prefs.put("profile.default_content_settings.popups", 0);
ChromeOptions options = new ChromeOptions();
options.addArguments("--incognito"); // 推荐使用带 "--" 前缀的标准写法
options.setExperimentalOption("prefs", prefs);
// ? 关键修复:禁用 download-bubble 相关实验特性
Map<String, Object> localState = new HashMap<>();
List<String> experiments = Arrays.asList("download-bubble@2", "download-bubble-v2@2");
localState.put("browser.enabled_labs_experiments", experiments);
options.setExperimentalOption("localState", localState);
WebDriver driver = new ChromeDriver(options);
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
driver.manage().window().maximize();
driver.get("https://www.selenium.dev/downloads/");
WebElement downloadLink = driver.findElement(By.linkText("4.12.1 (September 4, 2023)"));
downloadLink.click();
// ✅ 建议添加等待与验证逻辑(生产环境必备)
try {
Thread.sleep(5000); // 简单等待下载完成(实际建议轮询文件系统)
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
driver.quit();
}
}⚠️ 注意事项:
-
localState中的@2表示「禁用」状态(@1为启用,@2为禁用),这是 Chromium flags 的标准编码约定; - 必须使用
--incognito(带双横线)而非"incognito",以确保参数被正确识别; - Selenium 3.141.59 对
localState支持有限,强烈建议升级至 Selenium 4.8.0 或更高版本(如答案中所示),否则setExperimentalOption("localState", ...)可能被忽略; - 验证方式:启动浏览器后访问
chrome://flags/#download-bubble,确认两项 flag 显示为 Disabled(可通过调试器断点 + 手动打开验证); - 若仍失败,请检查目标 URL 是否触发跨域下载(如 iframe 内嵌或 blob: 协议),此类场景需额外处理
Content-Disposition或启用--unsafely-treat-insecure-origin-as-secure(仅限测试环境)。
总结:Chrome 117+ 的无痕下载问题本质是 UI 层级变更,非 Selenium 配置失效。通过 localState 精准控制底层实验特性,即可在保持测试真实性的同时,稳定实现自动化文件下载。


















