You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在Jenkins中使用Selenium ChromeDriver下载文件的问题求助

解决Jenkins上Selenium自动下载xlsx文件找不到的问题

嗨,这个问题我之前帮朋友排查过好几次,本质上是服务器环境下Selenium的默认下载路径和你本地用户的路径完全不一样,而且Jenkins运行的用户权限也有讲究。下面给你一步步解决的方案:

为什么本地能找到但Jenkins不行?

你本地运行时,Selenium用的是你当前登录用户的默认下载目录(比如~/Downloads),但Jenkins在服务器上是用专门的jenkins系统用户运行的,它的默认下载目录是这个系统用户的Downloads文件夹,比如:

  • Linux服务器:/var/lib/jenkins/Downloads
  • Windows服务器:C:\Users\jenkins\Downloads
    这个目录你可能没权限访问,或者根本没注意到它的存在。不过更稳妥的方式是主动指定下载文件夹到Jenkins工作区,这样后续找文件、加邮件附件都方便。

步骤1:在Selenium代码中指定自定义下载目录

直接在初始化浏览器的时候配置下载路径,建议用Jenkins工作区的子目录,这样路径固定,也方便邮件插件访问。下面是Chrome和Firefox的代码示例:

Chrome浏览器配置

// 定义下载目录:Jenkins工作区下的downloads文件夹
String downloadDir = System.getProperty("user.dir") + "/downloads";
// 确保文件夹存在,不存在就创建
File downloadFolder = new File(downloadDir);
if (!downloadFolder.exists()) {
    downloadFolder.mkdirs();
}

// 配置Chrome的下载偏好
ChromeOptions chromeOptions = new ChromeOptions();
Map<String, Object> prefs = new HashMap<>();
prefs.put("download.default_directory", downloadDir); // 指定下载路径
prefs.put("download.prompt_for_download", false); // 禁止弹出下载确认框
prefs.put("download.directory_upgrade", true); // 允许升级下载目录
prefs.put("profile.default_content_settings.popups", 0); // 禁用弹窗
// 针对xlsx文件设置自动下载(指定mime类型)
prefs.put("browser.helperApps.neverAsk.saveToDisk", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");

chromeOptions.setExperimentalOption("prefs", prefs);
// Jenkins上必须加无头模式参数(如果之前没加的话)
chromeOptions.addArguments("--headless=new");
chromeOptions.addArguments("--no-sandbox");
chromeOptions.addArguments("--disable-dev-shm-usage");

// 初始化驱动
WebDriver driver = new ChromeDriver(chromeOptions);

Firefox浏览器配置

String downloadDir = System.getProperty("user.dir") + "/downloads";
File downloadFolder = new File(downloadDir);
if (!downloadFolder.exists()) {
    downloadFolder.mkdirs();
}

FirefoxOptions firefoxOptions = new FirefoxOptions();
FirefoxProfile profile = new FirefoxProfile();
profile.setPreference("browser.download.folderList", 2); // 2表示使用自定义目录
profile.setPreference("browser.download.dir", downloadDir);
// 设置xlsx文件自动下载的mime类型
profile.setPreference("browser.helperApps.neverAsk.saveToDisk", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
profile.setPreference("browser.download.manager.showWhenStarting", false); // 隐藏下载管理器窗口

firefoxOptions.setProfile(profile);
firefoxOptions.addArguments("--headless");
firefoxOptions.addArguments("--no-sandbox");

WebDriver driver = new FirefoxDriver(firefoxOptions);

步骤2:等待文件下载完成(关键!)

Selenium点击下载按钮后会立即执行后续代码,但文件下载需要时间,所以必须加一段等待逻辑,确保文件已经生成:

// 替换成你实际的文件名,或者用通配符匹配(比如找最新生成的文件)
String filePath = downloadDir + "/target-file.xlsx";
File downloadedFile = new File(filePath);

// 最多等待30秒,每隔1秒检查一次
int waitSeconds = 0;
while (!downloadedFile.exists() && waitSeconds < 30) {
    Thread.sleep(1000);
    waitSeconds++;
}

if (downloadedFile.exists()) {
    System.out.println("文件已成功下载到:" + downloadedFile.getAbsolutePath());
} else {
    throw new RuntimeException("文件下载超时,未找到目标文件");
}

步骤3:配置Jenkins邮件附件

因为我们把文件下载到了Jenkins工作区的downloads文件夹里,所以邮件插件可以直接访问这个路径:

  1. 在Jenkins的邮件配置中,找到“附件”选项
  2. 填写路径:**/downloads/*.xlsx(匹配所有xlsx文件)或者具体的文件路径downloads/target-file.xlsx
  3. 保存配置即可

额外:如果非要找默认下载路径怎么排查?

如果你想确认Jenkins用户的默认下载目录,可以在Jenkins job中添加一个“执行shell”(Linux)或“执行Windows批处理命令”(Windows)步骤:

  • Linux:执行 echo $HOME,默认下载路径就是$HOME/Downloads
  • Windows:执行 echo %USERPROFILE%,默认下载路径是%USERPROFILE%\Downloads
    然后去服务器上对应的目录找文件就行,但还是建议用自定义路径更可靠,避免权限问题。

内容的提问来源于stack exchange,提问作者VladH

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 08:45:18