Python Selenium含本地chromedriver路径代码打包及无驱动运行咨询
问题解答
针对两个Selenium使用问题,直接给出可落地的方案:
问题1:将脚本打包为exe,在无提前安装chromedriver、无D盘固定路径的设备上运行
当前代码硬编码D:\chromedriver.exe绝对路径的写法,在其他设备上必然会因为路径不存在、文件缺失报错,按以下步骤调整即可:
- 第一步:修改路径加载逻辑,禁止硬编码绝对路径
引入路径适配逻辑,兼容PyInstaller等打包工具运行时的临时文件解压路径,示例代码如下:import os import sys from selenium import webdriver from selenium.webdriver.chrome.options import Options def get_resource_path(relative_path): # 兼容开发环境、打包后exe运行环境的路径获取 if getattr(sys, 'frozen', False): # 打包后运行时,资源文件会被解压到临时目录sys._MEIPASS下 base_path = sys._MEIPASS else: # 开发环境下,取当前脚本所在目录为基准路径 base_path = os.path.dirname(os.path.abspath(__file__)) return os.path.join(base_path, relative_path) chrome_options = Options() # 此处保留原有的chrome配置,比如无头模式、禁用沙箱等参数 # 不再写死D盘路径,直接从打包资源中读取chromedriver driver = webdriver.Chrome( options=chrome_options, executable_path=get_resource_path("chromedriver.exe") ) - 第二步:将chromedriver作为资源打包进exe
推荐使用PyInstaller做打包,把和目标设备Chrome大版本匹配的chromedriver.exe放到和脚本同目录下,执行以下打包命令:
打包完成后在dist目录下生成的单exe文件,就内置了chromedriver,运行时自动识别路径,不需要目标设备提前安装驱动、也不依赖固定盘符路径。pyinstaller -F --add-data "chromedriver.exe;." 你的脚本文件名.py注意:如果不介意目标设备首次运行需要联网,可以替换为webdriver-manager方案自动匹配驱动版本,不需要手动携带chromedriver打包,代码示例:
from selenium.webdriver.chrome.service import Service from webdriver_manager.chrome import ChromeDriverManager # 自动下载匹配当前设备Chrome版本的驱动,无需手动指定路径 driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()), options=chrome_options)
问题2:无需手动依赖chromedriver的Selenium实现方案
分两种场景说明:
- 场景1:仍然在本地启动Chrome浏览器,不想手动下载、配置chromedriver
升级Selenium到4.6及以上版本即可,官方内置了Selenium Manager工具,会自动检测本地安装的Chrome版本,自动下载匹配的chromedriver到本地缓存目录,全程不需要手动下载驱动、不需要配置executable_path参数,代码可以直接简化为:
该方案本质上还是会自动调用chromedriver,只是整个下载、路径配置流程完全自动化,使用者无感知,不需要手动维护驱动文件。from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() # 直接初始化即可,不需要传驱动路径 driver = webdriver.Chrome(options=chrome_options) - 场景2:本地完全不需要部署chromedriver、甚至不需要安装Chrome浏览器
使用Selenium Remote WebDriver连接远程部署的Selenium Grid节点即可,所有浏览器运行、驱动调用都在远程服务端完成,本地只需要发送自动化指令、接收执行结果,示例代码:from selenium import webdriver from selenium.webdriver.common.desired_capabilities import DesiredCapabilities # 连接远程Selenium服务,本地无任何浏览器、驱动依赖 driver = webdriver.Remote( command_executor='http://你的远程Selenium服务地址:4444/wd/hub', desired_capabilities=DesiredCapabilities.CHROME )
补充:如果可以脱离Selenium技术栈,Playwright、Pyppeteer等自动化框架直接基于Chrome DevTools协议和浏览器通信,不需要单独下载对应版本的驱动,安装时会自动匹配内置浏览器,依赖处理更简单。
内容的提问来源于stack exchange,提问作者Minh Long Duong
相关产品推荐
相关产品推荐

