Selenium自动下载浏览器驱动

news2025/6/7 9:00:47

为什么需要自动下载浏览器驱动?

血泪场景重现

  1. 新人入职第一天

    • 花3小时配置Chrome/Firefox驱动
    • 版本不匹配导致SessionNotCreatedException
  2. 浏览器自动更新后

    • 所有测试脚本突然崩溃
    • 手动查找驱动耗时长

终极解决方案:自动下载驱动

✅ 动态检测浏览器版本
✅ 下载匹配的驱动程序
✅ 自动设置环境变量


3行代码极简解决方案(Python版)

安装必备库
pip install webdriver-manager  # 核心神器
自动下载驱动示例
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager
from webdriver_manager.firefox import GeckoDriverManager

# Chrome自动下载(会返回驱动路径)
driver_path = ChromeDriverManager().install()  

# 创建浏览器实例(无需手动指定路径)
driver = webdriver.Chrome(executable_path=driver_path)
driver.get("https://www.baidu.com")

# Firefox同样简单
firefox_path = GeckoDriverManager().install()
driver = webdriver.Firefox(executable_path=firefox_path)
执行效果
[WDM] - Current google-chrome version is 124.0.6367
[WDM] - Get LATEST driver version for 124.0.6367
[WDM] - Driver [C:\Users\Sam\.wdm\drivers\chromedriver\win64\124.0.6367.78\chromedriver.exe] found in cache

核心原理拆解(文字版流程图)

1. 检测已安装的浏览器版本
   │
   ├── Windows:查询注册表 `HKEY_CURRENT_USER\Software\Google\Chrome\BLBeacon`
   ├── macOS:执行 `/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --version`
   ├── Linux:解析 `google-chrome --version` 输出
   │
2. 访问官方驱动仓库(无需翻墙镜像)
   │
   ├── Chrome:https://chromedriver.storage.googleapis.com
   ├── Firefox:https://github.com/mozilla/geckodriver/releases
   │
3. 下载匹配版本驱动
   │
   ├── 自动识别操作系统(Win/Mac/Linux)
   ├── 解压压缩包到缓存目录
   │
4. 返回驱动绝对路径

进阶实战:自定义控制方案

场景1:强制更新最新驱动
# 忽略缓存强制下载
ChromeDriverManager(version="latest").install()
场景2:指定特定版本
# 下载指定版本驱动(兼容旧浏览器)
ChromeDriverManager(version="114.0.5735.90").install()
场景3:设置代理和镜像源
import os

# 方法1:设置环境变量
os.environ["WDM_PROXY"] = "http://company-proxy:8080"

# 方法2:代码配置
ChromeDriverManager(
    proxy="http://user:pass@proxy:8080",  # 代理
    url="https://npm.taobao.org/mirrors/chromedriver"  # 国内镜像
).install()
场景4:自定义缓存路径
# 修改默认存储位置
ChromeDriverManager(cache_valid_range=30,  # 缓存有效期30天
                    path="/tmp/my_drivers" # 自定义目录
                   ).install()

跨语言支持方案

语言库名称安装命令
Javawebdrivermanagermvn io.github.bonigarcia:webdrivermanager:5.6.3
NodeJSwebdriver-managernpm install webdriver-manager
C#WebDriverManager.Netdotnet add package WebDriverManager
Java示例(Spring Boot)
import io.github.bonigarcia.wdm.WebDriverManager;

public class AutoDriverTest {
    public static void main(String[] args) {
        // 自动下载Chrome驱动
        WebDriverManager.chromedriver().setup();
        
        // 创建浏览器实例
        WebDriver driver = new ChromeDriver();
        driver.get("https://baidu.com");
    }
}

常见故障排除指南

  1. 下载速度慢

    • 解决方案:使用国内镜像源
      ChromeDriverManager(url="https://registry.npmmirror.com/-/binary/chromedriver").install()
      
  2. 公司网络禁止访问

    • 解决方案:先手动下载驱动,再指定路径
      driver = webdriver.Chrome(executable_path="D:/drivers/chromedriver.exe")
      
  3. 证书验证错误

    • 解决方案:关闭SSL验证(仅限测试环境)
      ChromeDriverManager(ssl_verify=False).install()
      
  4. 权限不足

    • Linux/Mac解决方案:
      sudo chmod +x /path/to/chromedriver
      

完整代码

默认是Chrome,会自动下载安装对应的版本Driver

# Selenium 4.33.0

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options
from common.tools import get_project_path, sep


class DriverConfig:
    def driver_config(self):
        """
        浏览器驱动配置
        :return: 配置好的WebDriver实例
        """
        # 创建ChromeOptions并配置
        chrome_options = Options()
        chrome_options.add_argument("window-size=1920,1080")
        # 去除"Chrome正受到自动测试软件的控制"的提示
        chrome_options.add_experimental_option("excludeSwitches", ["enable-automation"])
        # 解决selenium无法访问https的问题
        chrome_options.add_argument("--ignore-certificate-errors")
        # 允许忽略localhost上的TLS/SSL错误
        chrome_options.add_argument("--allow-insecure-localhost")
        # 设置无痕模式
        # chrome_options.add_argument("--incognito")
        # 设置为无头模式
        # chrome_options.add_argument("--headless")
        # 解决卡顿:GPU加速
        chrome_options.add_argument("--disable-gpu")
        # 解决卡顿:禁用 Chrome 的沙箱安全机制。
        chrome_options.add_argument("--no-sandbox")
        # 解决卡顿:测试用例一多的化,可能会导致内存溢出,要加上这个
        chrome_options.add_argument("--disable-dev-shm-usage")

        # Selenium 4.10+ 版本后无需手动指定driver路径,会自动管理
        # 但如果需要指定自定义路径,可以使用以下方式
        # service = Service(executable_path="/path/to/chromedriver")

        # 使用默认的驱动管理功能
        service = Service()

        # 使用Service和Options初始化Chrome WebDriver
        driver = webdriver.Chrome(service=service, options=chrome_options)

        # 删除所有cookies
        driver.delete_all_cookies()

        return driver

如果是Firefox,需要修改参数:


#!/usr/bin/python3
# coding=utf-8
# @Time: 2025/6/5 18:18
# @Author: Sam

from selenium import webdriver
from selenium.webdriver.firefox.service import Service
from selenium.webdriver.firefox.options import Options
from common.tools import get_project_path, sep

class DriverConfig:
    def driver_config(self):
        """
        浏览器驱动配置
        :return: 配置好的WebDriver实例
        """
        # 创建FirefoxOptions并配置
        firefox_options = Options()
        firefox_options.add_argument("--width=1920")
        firefox_options.add_argument("--height=1080")
        # 去除"Firefox正受到自动测试软件的控制"的提示
        # Firefox默认不会显示此提示
        # 解决selenium无法访问https的问题
        firefox_options.accept_insecure_certs = True
        # 设置为无头模式
        # firefox_options.add_argument("--headless")
        # 解决卡顿:禁用GPU加速
        firefox_options.add_argument("--disable-gpu")
        # 解决卡顿:禁用沙箱安全机制
        firefox_options.add_argument("--no-sandbox")
        # 解决卡顿:禁用共享内存使用
        firefox_options.add_argument("--disable-dev-shm-usage")

        # Selenium 4.10+ 版本后无需手动指定driver路径,会自动管理
        # 使用默认的驱动管理功能
        service = Service()
        
        # 使用Service和Options初始化Firefox WebDriver
        driver = webdriver.Firefox(service=service, options=firefox_options)

        # 删除所有cookies
        driver.delete_all_cookies()

        return driver

「小贴士」:点击头像→【关注】按钮,获取更多软件测试的晋升认知不迷路! 🚀

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2402699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Redis 过期了解

Redis 版本:5.0 : 一:过期监听: Spring Data Redis 封装了 Redis 的 Pub/Sub 功能,提供了对 key 过期事件的监听支持。 1. 核心类:KeyExpirationEventMessageListener 这个抽象类是 Spring 提供的&#x…

JAVA理论-JAVA基础知识

1.Java 基础 知识 1.1 面向对象的特征(了解) 面向对象的特征:封装、继承、多态、抽象 封装:就是把对象的属性和行为(数据)结合为一个独立的整体,并尽量隐藏对象的内部细节,公开我希…

免费无限使用GPT Plus、Claude Pro、Grok Super、Deepseek满血版

渗透智能-ShirtAI,可以免费无限使用GPT Plus、Claude Pro、Grok Super、Deepseek满血版、除此之外还能免费使用AI搜索、Gemini AI、AI照片修复、AI橡皮擦、AI去背景、AI智能抠图、AI证件照、OCR识别、在线思维导图、在线绘图工具、PDF工具箱、PDF翻译。 传送入口&a…

SoloSpeech - 高质量语音处理模型,一键提取指定说话人音频并提升提取音频清晰度和质量 本地一键整合包下载

视频教程: 一个强大的语音分离和降噪软件 SoloSpeech 是由约翰霍普金斯大学、香港中文大学、南洋理工大学、清华大学及布拉格理工大学等多所高校共同主导开源的一个创新的语音处理项目,旨在解决在多人同时说话的环境中,准确提取并清晰呈现特定…

深入解析 Java ClassLoader:揭开 JVM 动态加载的神秘面纱

大家好,这里是架构资源栈!点击上方关注,添加“星标”,一起学习大厂前沿架构! Java 之所以能实现“一次编写,到处运行”,很大程度得益于其虚拟机(JVM)强大的跨平台能力。…

CICD实战(一) -----Jenkins的下载与安装

服务器IPJenkins192.168.242.153gitlab192.168.242.154 1、安装工具(可选,如果有就不需要安装) sudo yum install wget net-tools 2、关闭防火墙 #关闭防火墙(如果是云服务器部署,去安全组放通对应的端口即可) systemctl stop firewalld …

Devops系列---python基础篇二

1、列表 1.1 概念 格式: 名称 [ “元素1”,“元素2”,…] #定义一个列表 computer ["主机","键盘","显示器","鼠标"]类型方法用途查index(“元素”)查看元素索引位置count(“元素”)统计元素出现的次数reverse()倒序排…

​​TLV4062-Q1​​、TLV4082-Q1​​迟滞电压比较器应用笔记

文章目录 主要作用应用场景关键优势典型应用示意图TLV4062-Q1 和 TLV4082-Q1 的主要作用及应用场景如下: 主要作用 精密电压监测:是一款双通道、低功耗比较器,用于监测输入电压是否超过预设阈值。 集成高精度基准电压源(阈值精度1%),内置60mV迟滞功能,可避免因噪声导致的…

DHCP介绍

DHCP介绍 1 DHCP简述2 DHCP协议分析2.1 主要流程2.2 DHCP全部报文介绍2.3 IP租用更新报文2.4 DHCP协议抓包分析 3 DHCP应用3.1 DNSmasq参数配置3.2 DNSmasq框架代码3.2.1 创建socket监听67端口3.2.2 监听67端口3.2.3 处理DHCP请求 3.3 DNSmasq模块排障方法 4 常见问题排查4.1 问…

[蓝桥杯]耐摔指数

耐摔指数 题目描述 X 星球的居民脾气不太好,但好在他们生气的时候唯一的异常举动是:摔手机。 各大厂商也就纷纷推出各种耐摔型手机。X 星球的质监局规定了手机必须经过耐摔测试,并且评定出一个耐摔指数来,之后才允许上市流通。…

2024年第十五届蓝桥杯青少Scratch初级组-国赛—画矩形

2024年第十五届蓝桥杯青少Scratch初级组-国赛—画矩形 题目点下方,支持在线编程,在线获取源码和素材~ 画矩形_scratch_少儿编程题库学习中心-嗨信奥 程序演示可点下方,支持源码获取~ 画矩形-scratch作品-少儿编程题库…

JMM初学

文章目录 1,线程间的同步和通信1.1, 共享内存并发模型 (Shared Memory Model)线程通信机制线程同步机制特点 1.2, 消息传递并发模型 (Message Passing Model)线程通信机制线程同步机制特点 适用场景对比 2,Java内存模型JMM2.0,Java内存模型的基础(1)内存…

构建云原生安全治理体系:挑战、策略与实践路径

📝个人主页🌹:一ge科研小菜鸡-CSDN博客 🌹🌹期待您的关注 🌹🌹 一、引言:从传统安全走向“云原生安全” 随着企业 IT 架构从传统单体系统向容器化、微服务和云原生平台转型&#xf…

vcs仿真产生fsdb波形的两种方式

目录 方法一: 使用verilog自带的系统函数 方法二: 使用UCLI command 2.1 需要了解什么是vcs的ucli,怎么使用ucli? 2.2 使用ucli dump波形的方法 使用vcs仿真产生fsdb波形有两种方式,本文参考《vcs user guide 20…

Go语言底层(三): sync 锁 与 对象池

1. 背景 在并发编程中,正确地管理共享资源是构建高性能程序的关键。Go 语言标准库中的 sync 包提供了一组基础而强大的并发原语,用于实现安全的协程间同步与资源控制。本文将简要介绍 sync 包中常用的类型和方法: sync 锁 与 对象池,帮助开发…

2025年06月06日Github流行趋势

项目名称:agent-zero 项目地址url:https://github.com/frdel/agent-zero项目语言:Python历史star数:8958今日star数:324项目维护者:frdel, 3clyp50, linuztx, evrardt, Jbollenbacher项目简介:A…

动态规划 熟悉30题 ---上

本来是要写那个二维动态规划嘛,但是我今天在问题时候,一个大佬就把他初一时候教练让他练dp的30题发出来了(初一,啊虽然知道计算机这一专业,很多人从小就学了,但是我每次看到一些大佬从小学还是会很羡慕吧或…

Linux系统:ELF文件的定义与加载以及动静态链接

本节重点 ELF文件的概念与结构可执行文件,目标文件ELF格式的区别ELF文件的形成过程ELF文件的加载动态链接与静态链接动态库的编址与方法调用 一、ELF文件的概念与结构 1.1 文件概述 ELF(Executable and Linkable Format)即“可执行与可链…

【国产化适配】如何选择高效合规的安全数据交换系统?

一、安全数据交换系统的核心价值与国产化需求 在数字化转型浪潮中,企业数据流动的频率与规模呈指数级增长,跨网文件传输已成为日常运营的刚需,所以安全数据交换系统也是企业必备的工具。然而,数据泄露事件频发、行业合规要求趋严…

简化复杂系统的优雅之道:深入解析 Java 外观模式

一、外观模式的本质与核心价值 在软件开发的世界里,我们经常会遇到这样的场景:一个复杂的子系统由多个相互协作的类组成,这些类之间可能存在错综复杂的依赖关系和交互逻辑。当外部客户端需要使用这个子系统时,往往需要了解多个类…