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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 11:30:46