USB:usb_device_handle_win.cc:1020 无法从 ChromeDriver v87 / Chrome v87 在 Windows10 上使用 Selenium 的节点连接错误中读取描述符

USB: usb_device_handle_win.cc:1020 Failed to read descriptor from node connection error with ChromeDriver v87 / Chrome v87 using Selenium on Windows10

我们最近使用 ChromeDriver v87.0.4280.20 和 Chrome v87.0.4280.66 升级了我们的 Windows 10 测试环境(官方构建)(64 位)升级后,即使是最小的程序也会生成此错误日志:

[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:\WebDrivers\chromedriver.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 问题后,这里是与日志消息的显示相关的详细信息:

[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)

详情

这一切都始于 chromium 问题 Remove WebUSB's dependency on libusb on Windows 的报告:

  • 对于 Linux(也可能 Mac),WebUSB 通知和通信都正常工作(在允许用户在 udev 规则中访问设备之后)。
  • 对于Windows,libusb 似乎只适用于非标准的WinUsb 驱动程序(https://github.com/libusb/libusb/issues/255)。

当插入硬件并且 VID/PID 系统未知时,windows 10 正确加载 CDC 部分的 CDC 驱动程序和 WebUSB 部分的 WinUSB 驱动程序(版本 10) (没有危险信号)。但是,似乎 chrome 永远找不到设备,直到我在界面上手动强制使用较旧的 WinUSB 驱动程序(版本 6 - 可能也已修改)。

解决方案是按如下方式逐步实施的:

  1. Start supporting some transfers in the new Windows USB backend
  2. Fix bulk/interrupt transfers in the new Windows USB backend
  3. [usb] Read BOS descriptors from the hub driver on Windows
  4. [usb] Collect all composite devices paths during enumeration on Windows
  5. [usb] Remove out parameters in UsbServiceWin helper functions
  6. [usb] Support composite devices in the new Windows backend
  7. [usb] Detect USB functions as Windows enumerates them
  8. [usb] Support composite devices with multiple functions
  9. [usb] Hold interface requests until Windows enumerates functions
  10. [usb] Add direction parameter to ClearHalt
  11. [usb] Count references to a WINUSB_INTERFACE_HANDLE
  12. [usb] Implement blocking operations in the Windows backend

这些更改确保新后端已准备好进行测试,并且可以通过 Chrome Canary 和 chrome-dev-channel 访问,您可以通过以下方式手动访问:

chrome://flags#enable-new-usb-backend

提交了更多变更请求如下:

由于新后端的实验性启动似乎很稳定,最终默认启用了这些配置,以便向 Chrome 87 through usb: Enable new Windows USB backend by default. Revision / Commit

的所有用户推出更改

想法是,一旦此配置成为几个里程碑的默认配置,Chromium 团队 将开始从旧后端删除 Windows 特定代码,并且删除标志。


前路

Chromium 团队 已经将 revision/commit to Extend new-usb-backend flag expiration 合并到 Chrome v90 中,即将推出。


更新

根据@ReillyGrant's [Committer, WebDriver for Google Chrome]

..." it would be good to reduce the log level for these messages so they don't appear on the console by default but we haven't landed code to do that yet"...


参考资料

您可以在以下位置找到一些相关的详细讨论:

我昨天遇到了这个问题,我已经通过更新所有可用的 windows 更新修复了它。

https://support.microsoft.com/en-us/windows/what-to-try-if-your-touchscreen-doesn-t-work-f159b366-b3ef-99ad-24a4-31a4c62ab46d

对我有用的部分解决方案

我也遇到了这个错误。它正在停止我的程序 运行。

  1. 我拔掉了所有 USB 设备,运行 程序,没有错误。
  2. 重新插入设备,运行程序。我仍然收到错误,但是,程序完成时没有错误停止程序。

然而,可以通过简单的 hack 来抑制这些日志消息出现在控制台上,即通过 add_experimental_option()[=19 添加参数=]如下:

options.add_experimental_option('excludeSwitches', ['enable-logging'])

代码块:

from selenium import webdriver

options = webdriver.ChromeOptions() 
options.add_argument("start-maximized")
# to supress the error messages/logs
options.add_experimental_option('excludeSwitches', ['enable-logging'])
driver = webdriver.Chrome(options=options, executable_path=r'C:\WebDrivers\chromedriver.exe')
driver.get('https://www.google.com/')