USB:usb_device_handle_win.cc:1020使用Windows10上的Selenium使用ChromeDriverv87/Chromev87无法从节点连接错误中读取描述符
我们最近使用 ChromeDriver v87.0.4280.20 和 Chrome v87.0.4280.66(官方版本)(64 位)升级了我们的Windows 10测试环境,升级后即使是最小的程序也会产生此错误日志:
[9848:10684:1201/013233.169:ERROR:device_event_log_impl.cc(211)] [01:32:33.170] USB: usb_device_handle_win.cc:1020 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F)
[9848:10684:1201/013233.169:ERROR:device_event_log_impl.cc(211)] [01:32:33.170] USB: usb_device_handle_win.cc:1020 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F)
最小代码块:
from selenium import webdriver
options = webdriver.ChromeOptions()
options.add_argument("start-maximized")
driver = webdriver.Chrome(options=options, executable_path=r'C:WebDriverschromedriver.exe')
driver.get('https://www.google.com/')
控制台输出:
DevTools listening on ws://127.0.0.1:64170/devtools/browser/2fb4bb93-79ab-4131-9e4a-3b65c08dbffb
[9848:10684:1201/013233.169:ERROR:device_event_log_impl.cc(211)] [01:32:33.170] USB: usb_device_handle_win.cc:1020 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F)
[9848:10684:1201/013233.172:ERROR:device_event_log_impl.cc(211)] [01:32:33.173] USB: usb_device_handle_win.cc:1020 Failed to read descriptor from node connection: A device attached to the system is not functioning. (0x1F)
有人面临同样的问题吗?ChromeDriver/Chrome v87 相对于 ChromeDriver/Chrome v86 有什么变化吗?有什么线索吗?
回答
我为日志垃圾邮件道歉。如果您在使用 WebUSB 连接到设备时没有问题,您可以忽略这些警告。它们由 Chrome 尝试读取当前挂起的 USB 设备的属性触发。
回答
经过多次讨论,这里的文档和 Chromium 问题是与日志消息显示相关的详细信息:
细节
这一切都始于报告铬问题在 Windows 上删除 WebUSB 对 libusb 的依赖为:
- 对于 Linux(也可能是 Mac),WebUSB 通知和通信都可以正常工作(在 udev 规则中允许用户访问设备之后)。
- 对于 Windows,似乎 libusb 仅适用于非标准 WinUsb 驱动程序 ( https://github.com/libusb/libusb/issues/255 )。
当插入硬件并且系统未知 VID/PID 时,Windows 10 会正确加载 CDC 部分的 CDC 驱动程序和 WebUSB 部分的 WinUSB 驱动程序(版本 10)(无红旗)。但是,在我在界面上手动强制使用较旧的 WinUSB 驱动程序(版本 6 - 可能也已修改)之前,chrome 似乎从未找到该设备。
该解决方案分步实施,如下所示:
- 开始支持新的 Windows USB 后端中的一些传输
- 修复新的 Windows USB 后端中的批量/中断传输
- [usb] 从 Windows 上的集线器驱动程序读取 BOS 描述符
- [usb] 在 Windows 上枚举期间收集所有复合设备路径
- [usb] 移除 UsbServiceWin 辅助函数中的参数
- [usb] 在新的 Windows 后端支持复合设备
- [usb] 在 Windows 枚举 USB 功能时检测它们
- [usb] 支持多功能复合设备
- [usb] 保持接口请求直到 Windows 枚举函数
- [usb] 向 ClearHalt 添加方向参数
- [usb] 计算对 WINUSB_INTERFACE_HANDLE 的引用
- [usb] 在 Windows 后端实现阻塞操作
这些更改确保新后端已准备好进行测试,并可通过Chrome Canary和 chrome-dev-channel 使用,您可以通过以下方式手动访问:
chrome://flags#enable-new-usb-backend
提交的更多变更请求如下:
- [usb] 将调用 SetupDiGetDeviceProperty 标记为潜在阻塞:根据挂起报告,此函数执行 RPC 调用,可能需要一些时间才能完成。使用 base::ScopedBlockingCall 标记调用,以便线程池知道此任务可能会忙碌一段时间。
- 变化:在现场试验测试配置中启用 NewUsbBackend:此标志是实验性的,因为 beta-channel 使用此更改配置作为测试的默认值。
由于新后端的实验性发布似乎是稳定的,最终这些配置默认启用,以便通过USB向所有Chrome 87用户推出更改:默认启用新的 Windows USB 后端。修订/提交
我们的想法是,一旦此配置成为一些里程碑的默认配置,Chromium 团队将开始从旧后端删除特定于 Windows 的代码并删除标志。
前面的路
Chromium 团队已经在Chrome v90中合并了修订/提交以扩展 new-usb-backend 标志到期,这将很快可用。
更新
根据@ReillyGrant的 [Committer, WebDriver for Google Chrome]评论:
......“最好降低这些消息的日志级别,这样它们默认不会出现在控制台上,但我们还没有登陆代码来做到这一点”......
参考
您可以在以下位置找到一些相关的详细讨论:
- 无法从节点连接读取描述符:在 Windows 操作系统上使用 ChromeDriver Selenium 时,连接到系统的设备无法运行错误
- 无法从节点连接读取描述符:通过 Selenium 使用 ChromeDriver Chrome 连接到系统的设备无法运行错误