Python 自动安装 Chrome 插件:策略强制 vs 开发者模式加载

写脚本自动帮机器装个 Chrome 插件——听着简单。Chrome 团队故意不让你静默装本地 crx(安全策略,不是技术问题)。想绕开有几条现实可行的路。

路线一:企业策略强制安装(Web Store 上架的插件)

Chrome 支持通过 Windows 注册表 / macOS plist / Linux JSON 策略,指定”必须自动装某扩展”。这是 IT 部门批量部署的标准做法。

前提是扩展在 Chrome Web Store 上架——策略只接受 update URL 拉取,不认本地 crx。

Windows 注册表方式

import winreg

EXT_ID     = "aapocclcgogkmnckokdopfmhonfmgoek"   # 举例:Google Docs Offline
UPDATE_URL = "https://clients2.google.com/service/update2/crx"

path = r"SOFTWARE\Policies\Google\Chrome\ExtensionInstallForcelist"

key = winreg.CreateKey(winreg.HKEY_LOCAL_MACHINE, path)
winreg.SetValueEx(key, "1", 0, winreg.REG_SZ, f"{EXT_ID};{UPDATE_URL}")
winreg.CloseKey(key)

写完重启 Chrome,扩展会自动安装、无法卸载

注意:

  • 需要管理员权限
  • ExtensionInstallForcelist 的编号("1""2" …)要不重复
  • 只支持 Web Store 上架的扩展;企业内部扩展需要自建 update.xml

配套删除:

import winreg
key = winreg.OpenKey(winreg.HKEY_LOCAL_MACHINE, path, 0, winreg.KEY_WRITE)
winreg.DeleteValue(key, "1")

路线二:Selenium 启动时加载本地插件

不做正式安装,只是启动 Chrome 时把插件目录加载进来——最适合自动化脚本、爬虫、批量测试。

加载解压后的目录(源码形式)

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

opts = Options()
opts.add_argument(r"--load-extension=D:\extensions\my-plugin")

driver = webdriver.Chrome(options=opts)
driver.get("https://example.com")

加载已打包的 crx

opts = Options()
opts.add_extension(r"D:\extensions\my-plugin.crx")

局限:

  • 不会真的”安装”,关闭浏览器就没了
  • 需要 Selenium 控制的 Chrome,不影响用户日常浏览器
  • Chrome 每次启动会有”以开发者模式使用未打包扩展”警告条

路线三:Playwright 加载扩展

Playwright 加载扩展要用 persistent context,且必须用 Chromium(Chrome 分发版不能通过所有测试):

from playwright.sync_api import sync_playwright

with sync_playwright() as p:
    ctx = p.chromium.launch_persistent_context(
        user_data_dir="D:/tmp/pw-profile",
        headless=False,
        args=[
            "--disable-extensions-except=D:\\extensions\\my-plugin",
            "--load-extension=D:\\extensions\\my-plugin",
        ],
    )
    page = ctx.new_page()
    page.goto("https://example.com")

不推荐的路线

UI 自动化拖 crx 到 chrome://extensions/:Chrome 会弹确认框、快捷键会变、chrome 版本升级后经常挂。别在这个方向上死磕。

改本地 Extensions 目录里的 Preferences JSON:Chrome 会检测校验和,第二次启动直接把你写进去的扩展禁用掉。

场景对应

目的用什么
公司/网吧批量部署 Web Store 扩展策略强制安装
爬虫 / 自动化脚本用自己写的扩展Selenium 加载
需要长期挂着扩展,用户不能卸载策略强制
只是测试自己开发中的插件Chrome 开发者模式手动

一句话总结

要”真安装”就上企业策略(Web Store 扩展)要”临时加载”就 Selenium/Playwright --load-extension。Chrome 就是不让你静默装本地 crx,别硬撞。