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

无头模式下Selenium点击a标签无效问题求助

解决无头模式下Selenium点击下载链接失效的问题

嘿,我之前碰到过一模一样的坑!无头模式下Chrome的行为和正常窗口模式确实有不少差异,尤其是下载相关的操作——这不是Selenium或者Chromedriver的bug,主要是默认配置没跟上导致的。咱们一步步来搞定它:

核心原因

你现在用的旧版--headless模式是基于一个简化版的Chrome内核,和正常浏览器的下载逻辑完全不一样:它不会自动处理下载弹窗,也没有默认的下载目录配置,所以点击链接后看似没反应,其实是下载请求被拦截或者没地方保存了。

解决方案

我给你整理几个关键修改点,按顺序调整就行:

  1. 配置默认下载目录,禁用下载弹窗
    用add_experimental_option给Chrome提前设置好下载路径,同时关闭下载时的确认提示,这样无头模式下就能自动保存文件,不会因为弹窗卡住。

  2. 改用新版无头模式参数
    Chrome 112及以上版本支持--headless=new,这个模式完全复刻正常浏览器的行为,很多旧无头模式的奇怪问题都能直接解决,强烈建议替换掉旧的--headless参数。

  3. 优化启动参数
    去掉重复的窗口最大化设置(--start-maximized和代码里的self.driver.maximize_window()二选一即可),再加个--disable-gpu兼容旧版本环境。

修改后的完整代码

import os
from selenium import webdriver
from selenium.webdriver.chrome.options import Options

class Scraper(object):
    def __init__(self, cursor):
        self.driver = None
        # 定义你的下载目录,改成你自己需要的路径
        self.download_dir = os.path.abspath("./abs_downloads")
        # 如果目录不存在就自动创建
        if not os.path.exists(self.download_dir):
            os.makedirs(self.download_dir)
    
    def create_driver(self):
        chrome_options = Options()
        # 用新版无头模式(推荐,行为更接近正常浏览器)
        chrome_options.add_argument("--headless=new")
        chrome_options.add_argument("--no-sandbox")
        chrome_options.add_argument("--window-size=1920x1080")
        chrome_options.add_argument("--disable-gpu")
        
        # 配置下载相关的核心参数
        prefs = {
            "download.default_directory": self.download_dir,
            "download.prompt_for_download": False,  # 禁用下载确认弹窗
            "download.directory_upgrade": True,
            "safebrowsing.enabled": True  # 避免安全提示拦截下载请求
        }
        chrome_options.add_experimental_option("prefs", prefs)
        
        # Selenium 4.x版本后,如果Chrome和Chromedriver版本匹配,executable_path可以省略
        self.driver = webdriver.Chrome(options=chrome_options)
    
    def go_to_website(self):
        self.driver.get('https://www.abs.gov.au/AUSSTATS/abs@.nsf/DetailsPage/6202.0Nov%202019?OpenDocument')
        link_to_click = self.driver.find_element_by_xpath("//a[contains(@href,'/log?openagent&6202012.xls&6202.0')]")
        link_to_click.click()
        # 实际项目建议用WebDriverWait等待文件下载完成,这里用sleep做示例
        import time
        time.sleep(6)
    
    def run(self):
        self.create_driver()
        self.go_to_website()
        # 记得关闭驱动释放资源
        self.driver.quit()

额外小提示

  • 一定要确保Chrome浏览器和Chromedriver的版本完全匹配,版本不兼容会引发各种莫名其妙的问题。
  • 实际项目里别用time.sleep(),建议用WebDriverWait监听下载目录里的目标文件是否出现,这样更稳定可靠。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.06 10:52:34