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

Deb*_*anB 10 python selenium google-chrome selenium-chromedriver webusb

我们最近使用 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)
Run Code Online (Sandbox Code Playgroud)

最小代码块:

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/')
Run Code Online (Sandbox Code Playgroud)

控制台输出:

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)
Run Code Online (Sandbox Code Playgroud)

有人面临同样的问题吗?ChromeDriver/Chrome v87 相对于 ChromeDriver/Chrome v86 有什么变化吗?有什么线索吗?

Deb*_*anB 22

但是,可以通过简单的hack来禁止这些日志消息出现在控制台上,即通过添加参数,add_experimental_option()如下所示:

options.add_experimental_option('excludeSwitches', ['enable-logging'])
Run Code Online (Sandbox Code Playgroud)

代码块:

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/')
Run Code Online (Sandbox Code Playgroud)


Rei*_*ant 15

我为日志垃圾邮件道歉。如果您在使用 WebUSB 连接到设备时没有问题,您可以忽略这些警告。它们由 Chrome 尝试读取当前挂起的 USB 设备的属性触发。

  • 无论如何,我们不能在日志中显示或隐藏它吗? (3认同)

Deb*_*anB 12

经过多次讨论,这里的文档和 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)
Run Code Online (Sandbox Code Playgroud)

细节

这一切都始于报告问题在 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 似乎从未找到该设备。

该解决方案分步实施,如下所示:

  1. 开始支持新的 Windows USB 后端中的一些传输
  2. 修复新的 Windows USB 后端中的批量/中断传输
  3. [usb] 从 Windows 上的集线器驱动程序读取 BOS 描述符
  4. [usb] 在 Windows 上枚举期间收集所有复合设备路径
  5. [usb] 移除 UsbServiceWin 辅助函数中的参数
  6. [usb] 在新的 Windows 后端支持复合设备
  7. [usb] 在 Windows 枚举 USB 功能时检测它们
  8. [usb] 支持多功能复合设备
  9. [usb] 保持接口请求直到 Windows 枚举函数
  10. [usb] 向 ClearHalt 添加方向参数
  11. [usb] 计算对 WINUSB_INTERFACE_HANDLE 的引用
  12. [usb] 在 Windows 后端实现阻塞操作

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

chrome://flags#enable-new-usb-backend
Run Code Online (Sandbox Code Playgroud)

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

由于新后端的实验性发布似乎是稳定的,最终这些配置默认启用,以便通过USB向所有Chrome 87用户推出更改:默认启用新的 Windows USB 后端修订/提交

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


前面的路

Chromium 团队已经在Chrome v90中合并了修订/提交扩展 new-usb-backend 标志到期,这将很快可用。


更新

根据@ReillyGrant的 [Committer, WebDriver for Google Chrome]评论

......“最好降低这些消息的日志级别,这样它们默认不会出现在控制台上,但我们还没有登陆代码来做到这一点”......


参考

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