1. 为什么需要手动配置浏览器驱动?

做自动化测试的朋友们肯定都遇到过这样的场景:明明昨天还能正常运行的Selenium脚本,今天突然报错说找不到浏览器驱动了。这种情况十有八九是因为浏览器自动更新了版本,而驱动没有及时跟上。我刚开始用Selenium的时候,这个问题困扰了我整整一周,后来才发现是Edge浏览器偷偷更新了版本。

浏览器和驱动的版本必须严格匹配,这是Selenium工作的基本要求。Chrome和Edge这类基于Chromium的浏览器,它们的驱动版本号必须与浏览器主版本号一致。比如Edge 120.0.2210.91版本,就必须使用120.x.x.x系列的msedgedriver。如果版本不匹配,轻则功能异常,重则直接报错。

Selenium 4虽然引入了Selenium Manager来自动管理驱动,但在实际使用中我发现它有几个局限:一是国内网络环境下载经常失败;二是某些企业版浏览器无法被正确识别;三是对测试环境的版本控制不够灵活。所以掌握手动配置驱动的技能还是很有必要的。

2. 确认浏览器版本的方法

2.1 Edge浏览器版本确认

Edge浏览器查看版本最简单的方法是在地址栏输入:

edge://settings/help

页面会显示类似"Microsoft Edge 版本 120.0.2210.91 (正式版本) (64 位)"的信息。这里120就是主版本号,我们需要记住这个数字。

如果你需要通过代码获取版本,可以试试这个Python方法:

import win32api
import win32con

def get_edge_version():
    try:
        key = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE, 
                                r"SOFTWARE\Microsoft\Edge\BLBeacon")
        version = win32api.RegQueryValueEx(key, "version")[0]
        return version.split('.')[0]  # 返回主版本号
    except Exception as e:
        print(f"获取Edge版本失败: {e}")
        return None

2.2 Chrome浏览器版本确认

Chrome查看版本的地址是:

chrome://settings/help

或者直接在地址栏输入:

chrome://version/

后者会显示更详细的信息,包括完整的版本号如"120.0.6099.199"。

代码获取版本的方式与Edge类似:

def get_chrome_version():
    try:
        key = win32api.RegOpenKey(win32con.HKEY_LOCAL_MACHINE,
                                r"SOFTWARE\Google\Chrome\BLBeacon")
        version = win32api.RegQueryValueEx(key, "version")[0]
        return version.split('.')[0]  # 返回主版本号
    except Exception as e:
        print(f"获取Chrome版本失败: {e}")
        return None

3. 手动下载匹配的浏览器驱动

3.1 Edge驱动下载

Edge驱动的官方下载地址是:

https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/

这里有个小技巧:页面默认显示的是最新稳定版驱动。如果你需要历史版本,可以修改URL中的版本号。比如要下载120版本的驱动,可以把URL改成:

https://msedgedriver.azureedge.net/120.0.2210.91/edgedriver_win64.zip

下载时要注意系统架构(32位或64位)。现在的电脑基本都是64位了,但如果你不确定,可以在Windows设置→系统→关于中查看系统类型。

3.2 Chrome驱动下载

Chrome驱动的官方下载比较复杂,有多个来源:

  1. 传统下载地址(适用于115以下版本):
https://chromedriver.storage.googleapis.com/index.html
  1. Chrome for Testing版本(推荐):
https://googlechromelabs.github.io/chrome-for-testing/

国内用户可能会遇到下载慢的问题,可以使用清华镜像源:

https://registry.npmmirror.com/binary.html?path=chromedriver/

下载时要注意:

  • 主版本号必须与浏览器一致
  • 优先选择"stable"标签的版本
  • 如果找不到完全匹配的版本,选择最接近的次版本

4. 驱动路径配置的三种方式

4.1 方法一:放在Python解释器目录

这是最简单的配置方式,适合个人开发环境。首先获取Python解释器路径:

import sys
print(sys.executable)

然后把下载的驱动文件(msedgedriver.exe或chromedriver.exe)复制到该目录下。

优点是简单直接,缺点是如果使用虚拟环境,切换环境时需要重新复制。

4.2 方法二:添加到系统PATH环境变量

更规范的做法是把驱动所在目录加入系统PATH:

  1. 创建一个专门存放驱动的目录,比如C:\WebDrivers
  2. 把下载的驱动文件放入该目录
  3. 添加系统环境变量:
    • 右键"此电脑"→属性→高级系统设置→环境变量
    • 在系统变量的Path中添加C:\WebDrivers

验证是否配置成功:

import os
print(os.getenv('PATH'))  # 检查PATH是否包含驱动目录

4.3 方法三:代码中指定驱动路径(推荐)

这是最灵活的方式,特别适合团队协作和持续集成环境。示例代码如下:

Edge驱动指定:

from selenium import webdriver
from selenium.webdriver.edge.service import Service

service = Service(executable_path=r'C:\WebDrivers\msedgedriver.exe')
driver = webdriver.Edge(service=service)

Chrome驱动指定:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service

service = Service(executable_path=r'C:\WebDrivers\chromedriver.exe')
driver = webdriver.Chrome(service=service)

我特别喜欢这种方式的原因是:

  1. 不同项目可以使用不同版本的驱动
  2. 配置文件可以统一管理路径
  3. 方便与CI/CD工具集成

5. 常见问题排查与解决

5.1 驱动版本不匹配错误

典型错误信息:

SessionNotCreatedException: Message: session not created: This version of ChromeDriver only supports Chrome version 114
Current browser version is 120.0.6099.199

解决方法:

  1. 检查浏览器版本
  2. 下载对应版本的驱动
  3. 清理浏览器缓存(有时浏览器会残留旧版本信息)

5.2 浏览器自动关闭问题

添加detach选项可以防止浏览器闪退:

options = webdriver.EdgeOptions()
options.add_experimental_option("detach", True)
driver = webdriver.Edge(options=options, service=service)

5.3 企业版浏览器特殊处理

有些企业定制的Chrome/Edge浏览器版本号可能与标准版不同。这时可以尝试:

  1. 使用浏览器文件属性中的版本号
  2. 下载相近版本的驱动测试
  3. 联系IT部门获取专用驱动

5.4 权限问题处理

如果遇到权限错误,可以尝试:

  1. 以管理员身份运行IDE/命令行
  2. 检查驱动文件是否有执行权限
  3. 关闭杀毒软件临时测试(记得测完再打开)

6. 自动化管理驱动的进阶方案

对于需要频繁切换浏览器版本的项目,手动管理驱动会很麻烦。这里分享几个进阶方案:

6.1 使用webdriver-manager

安装:

pip install webdriver-manager

使用示例:

from selenium import webdriver
from webdriver_manager.microsoft import EdgeChromiumDriverManager

driver = webdriver.Edge(EdgeChromiumDriverManager().install())

优点是自动下载匹配版本,缺点是国内下载可能较慢。

6.2 自定义驱动管理工具

我们可以自己实现一个智能驱动管理工具,主要功能包括:

  1. 自动检测浏览器版本
  2. 检查本地是否有匹配驱动
  3. 无匹配时自动下载
  4. 更新驱动缓存

核心代码结构:

class DriverManager:
    def __init__(self):
        self.cache_dir = os.path.expanduser("~/.webdrivers")
        
    def get_driver_path(self, browser_type):
        # 实现版本检测和驱动管理逻辑
        pass

6.3 使用Docker容器

对于复杂的测试环境,可以考虑使用Docker预先配置好浏览器和驱动:

FROM selenium/standalone-chrome:120.0
# 自定义配置...

这样就能保证环境一致性,避免本地配置问题。

7. 最佳实践与经验分享

经过多个项目的实践,我总结出以下几点经验:

  1. 版本锁定:在测试环境中固定浏览器版本,避免自动更新带来的意外
  2. 驱动归档:建立公司内部的驱动归档库,方便团队共享
  3. 错误处理:在代码中添加完善的错误处理,提示明确的解决方案
  4. 日志记录:记录浏览器和驱动版本信息,方便问题排查
  5. 环境检查:在测试开始时自动检查环境配置

一个实用的环境检查函数示例:

def check_environment(browser_type):
    try:
        if browser_type == "chrome":
            version = get_chrome_version()
            driver_path = find_driver("chromedriver", version)
        elif browser_type == "edge":
            version = get_edge_version()
            driver_path = find_driver("msedgedriver", version)
        
        if not driver_path:
            download_driver(browser_type, version)
            driver_path = find_driver(...)
            
        return driver_path
    except Exception as e:
        logging.error(f"环境检查失败: {str(e)}")
        raise

最后提醒一点:无论是手动还是自动管理驱动,都要定期检查更新。浏览器安全更新很频繁,对应的驱动也需要及时跟进,才能保证自动化测试的稳定性和安全性。

更多推荐