如何在Python/Selenium中操作Chrome的USB设备配对弹窗?
解决Chrome USB设备配对弹窗的自动化方案
WebUSB API的可行性
WebUSB API完全可以用于浏览器与USB设备的直接连接,它是浏览器提供的JavaScript API,允许网页绕过系统原生配对弹窗,直接与兼容的USB设备通信,非常适合自动化测试场景。不过需要满足两个前提:
- 测试网页需运行在HTTPS环境下(本地
localhost例外) - 目标USB设备需支持WebUSB规范(可通过设备厂商文档确认)
方案1:Selenium+Chrome DevTools Protocol(CDP)干预USB权限与配对
Chrome的原生USB配对弹窗无法通过常规Selenium方法操作,但可以通过CDP直接控制USB设备的权限和配对流程,彻底避免弹窗出现:
步骤与示例代码
- 启动Chrome时启用CDP支持,并配置必要参数:
from selenium import webdriver from selenium.webdriver.chrome.options import Options chrome_options = Options() # 允许本地HTTP页面使用WebUSB(如果测试环境是HTTP) chrome_options.add_argument("--unsafely-treat-insecure-origin-as-secure=http://your-test-domain.com") # 启用USB调试支持 chrome_options.add_argument("--enable-usb-detection") driver = webdriver.Chrome(options=chrome_options)
- 使用CDP授予目标站点USB权限,并模拟设备连接:
# 授予目标域名USB设备访问权限 driver.execute_cdp_cmd("usb.grantPermissions", { "origin": "http://your-test-domain.com", "permissions": ["usb"] }) # 模拟指定VID/PID的设备已连接(替换为你的设备VID和PID,十六进制) driver.execute_cdp_cmd("usb.setDeviceOverride", { "vendorId": 0x1234, "productId": 0x5678, "deviceName": "Your Device Name" })
方案2:直接通过Selenium执行WebUSB API代码
如果你的Web App本身支持WebUSB,可以直接在测试中通过Selenium执行JavaScript代码,调用WebUSB API完成设备连接,绕过系统弹窗:
示例代码
# 执行JS代码调用WebUSB API,请求指定设备 device = driver.execute_script(""" return navigator.usb.requestDevice({ filters: [{ vendorId: 0x1234, // 替换为你的设备VID productId: 0x5678 // 替换为你的设备PID }] }).then(device => device); """) # 可继续执行设备初始化操作(如发送指令) driver.execute_script(""" arguments[0].open().then(() => { // 这里添加设备通信逻辑 }); """, device)
方案3:Chrome命令行参数自动允许设备
启动Chrome时添加--usb-device-filter参数,可自动允许指定VID/PID的USB设备,完全跳过配对弹窗:
示例启动参数
chrome_options.add_argument("--usb-device-filter=0x1234:0x5678") # 替换为你的设备VID:PID
此方法适合不需要动态切换设备的场景,配置后Chrome会自动识别并允许目标设备。
各方案对比
- 对比pyautogui的键盘模拟:以上方案均不依赖界面元素位置,稳定性更高,不会因弹窗布局变化、系统分辨率差异导致测试失败。
- CDP方案:适合需要完全控制USB设备权限和模拟设备的场景。
- WebUSB API方案:适合Web App本身已集成WebUSB功能的测试场景。
- 命令行参数方案:适合固定设备的自动化测试,配置简单。
内容的提问来源于stack exchange,提问作者ShinjiruPP
相关产品推荐
相关产品推荐

