Jenkins中运行Selenium脚本下载文件时下载被取消的问题
问题分析与解决方案
可能的原因及修复步骤
1. Jenkins运行用户的文件系统权限问题
Jenkins的运行用户(通常为jenkins用户)可能没有权限写入你指定的tmp_downloads目录:
- 登录Jenkins节点,执行
ls -l查看下载目录的权限,确保Jenkins用户拥有读写权限; - 避免依赖
os.getcwd(),手动指定Jenkins用户有权限的绝对路径,比如/var/lib/jenkins/workspace/你的任务名/tmp_downloads。
2. 补充Chrome Headless模式的下载适配参数
Headless模式下需要额外配置才能确保下载正常完成,修改你的ChromeOptions配置:
from selenium import webdriver from selenium.webdriver.chrome.options import Options import os options = Options() download_path = "/var/lib/jenkins/workspace/your_job/tmp_downloads" # 替换为绝对路径 if not os.path.exists(download_path): os.makedirs(download_path) chrome_prefs = { "download.default_directory": download_path, "download.prompt_for_download": False, "download.directory_upgrade": True, "safebrowsing.enabled": True # 防止安全策略拦截下载 } options.add_experimental_option("prefs", chrome_prefs) options.add_argument("--headless=new") options.add_argument("--disable-dev-shm-usage") options.add_argument("--no-sandbox") # Jenkins环境必备参数 options.add_argument("--disable-gpu") options.add_argument("--enable-features=NetworkService,NetworkServiceInProcess") # 适配新版Chrome下载逻辑 driver = webdriver.Chrome(options=options)
3. 增加下载完成的等待逻辑
Jenkins环境的网络或执行速度可能慢于本地,需要等待文件下载完成后再继续执行:
import time def wait_for_download(download_path, timeout=30): end_time = time.time() + timeout while time.time() < end_time: files = os.listdir(download_path) # 过滤Chrome下载临时文件(后缀为.crdownload) completed_files = [f for f in files if not f.endswith('.crdownload')] if completed_files: return completed_files[0] time.sleep(1) raise TimeoutError("文件下载超时") # 点击下载链接后调用等待函数 wait_for_download(download_path)
4. 检查Jenkins节点的网络与代理配置
- 如果Jenkins节点使用代理,需要给Chrome配置代理参数:
options.add_argument('--proxy-server=http://你的代理地址:端口')
- 在Jenkins节点上用
curl命令测试目标下载链接是否能正常下载,排除网络访问问题。
5. 替代方案:绕过浏览器直接下载CSV
如果浏览器下载始终存在问题,可以直接获取下载链接,用requests库完成下载,避免依赖浏览器的下载机制:
import requests from selenium.webdriver.common.by import By # 获取页面上的下载链接 download_link = driver.find_element(By.LINK_TEXT, "下载CSV").get_attribute('href') # 继承浏览器的登录Cookie(如果需要权限验证) cookies = driver.get_cookies() session = requests.Session() for cookie in cookies: session.cookies.set(cookie['name'], cookie['value']) # 直接下载文件 response = session.get(download_link) with open(os.path.join(download_path, 'data.csv'), 'wb') as f: f.write(response.content)
内容的提问来源于stack exchange,提问作者bmorgs
相关产品推荐
相关产品推荐

