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

Python Selenium无头模式下无法下载SSRS报表文件的问题咨询

Python Selenium无头模式下无法下载SSRS报表文件的问题咨询

嘿,各位大佬,我最近在做一个项目,需要从SSRS的Web服务器上下载几百份报表,用Python写了个Selenium脚本。需求是要在后台下载,所以想着用无头模式来跑,但遇到了个棘手的问题:

正常模式下我的代码能正常下载报表,还解决了弹出的身份验证窗口问题,但只要一加--headless=new参数,脚本运行时控制台闪一下就关闭,报表完全没下载下来,实在搞不懂为啥会这样,有没有大佬能帮忙分析下原因呀?

下面是我的完整代码(URL做了隐私处理):

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.chrome.service import Service
from subprocess import CREATE_NO_WINDOW
import time
import datetime
import os

service = Service(executable_path=r'C:\Program Files\chromedriver_win32\chromedriver.exe')

chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument("--headless=new")
chrome_options.add_argument("--no-sandbox")
chrome_options.add_argument("--disable-extensions")
chrome_options.add_argument("--auth-server-whitelist=*")
chrome_options.add_argument("--auth-negotiate-delegate-whitelist=*")
chrome_options.add_argument("--log-level=0")

service.creation_flags = CREATE_NO_WINDOW

print('starting download')
driver=webdriver.Chrome(service=service,options=chrome_options)
driver.get("http://10.1.2.69:99/ReportServer")
time.sleep(3)
print('file downloaded')
driver.quit()

我尝试过的有效情况:

  • 去掉--headless=new参数后,脚本完全正常,能处理身份验证弹窗并成功下载报表。

我的疑问:

为什么同样的配置,无头模式下就无法完成下载?有没有什么我漏掉的配置或者无头模式特有的限制呀?


可能的原因和解决方向:

  1. 无头模式下未配置下载路径
    Chrome的无头模式默认不会使用常规的用户下载目录,也可能不会自动处理下载逻辑。可以尝试明确指定下载目录并配置相关偏好:
# 提前创建下载目录
download_dir = os.path.abspath("./ssrs_reports")
os.makedirs(download_dir, exist_ok=True)

# 添加下载配置到chrome_options
chrome_options.add_experimental_option("prefs", {
    "download.default_directory": download_dir,
    "download.prompt_for_download": False,
    "download.directory_upgrade": True,
    "safebrowsing.enabled": True  # 避免安全拦截下载
})
  1. 等待时间不足
    无头模式下页面加载、文件下载的速度可能和正常模式有差异,固定的time.sleep(3)可能不足以完成下载。建议改用显式等待,或者等待下载文件完成:
def wait_for_download_completed(download_dir, timeout=60):
    end_time = time.time() + timeout
    while time.time() < end_time:
        for filename in os.listdir(download_dir):
            # 排除Chrome的临时下载文件(.crdownload后缀)
            if not filename.endswith(".crdownload"):
                return True
        time.sleep(1)
    return False

# 在driver.get之后调用等待逻辑
driver.get("http://10.1.2.69:99/ReportServer")
if wait_for_download_completed(download_dir):
    print('file downloaded successfully')
else:
    print('download timed out')
  1. 身份验证在无头模式下的兼容性
    虽然你加了认证白名单参数,但无头模式下的认证流程可能有差异。可以尝试把认证信息直接嵌入URL(如果SSRS支持这种方式的话):
# 格式:http://username:password@server_url,注意不要硬编码账号密码,建议从配置文件读取
driver.get("http://your_username:your_password@10.1.2.69:99/ReportServer")
  1. ChromeDriver与Chrome版本不匹配
    无头模式对版本兼容性要求更高,确保你的ChromeDriver版本和本地安装的Chrome浏览器版本完全一致,版本不匹配可能导致各种异常行为。

备注:内容来源于stack exchange,提问作者aparajeya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.22 08:49:28