pythongoogle-chromeselenium-webdriverselenium-chromedriverwebusb

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


We recently upgraded our Windows 10 test environment with ChromeDriver v87.0.4280.20 and Chrome v87.0.4280.66 (Official Build) (64-bit) and after the up-gradation even the minimal program is producing this ERROR log:

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

Minimum Code Block:

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/')

Console Output:

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)

Anyone facing the same? Was there any change in ChromeDriver/Chrome v87 with respect to ChromeDriver/Chrome v86?

Any clues will be helpful.


Solution

  • After going through quite a few discussions, documentations and Chromium issues here are the details related to the surfacing of the log message:

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

    Details

    It all started with the reporting of chromium issue Remove WebUSB's dependency on libusb on Windows as:

    When the hardware is inserted and the VID/PID is unknown to the system, windows 10 correctly loads it's CDC driver for the CDC part and the WinUSB driver (version 10) for the WebUSB part (no red flags). However, it seems that chrome never finds the device until I manually force an older WinUSB driver (version 6 - probably modified also) on the interface.

    The solution was implemented in a step-wise manner as follows:

    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

    These changes ensured that the new backend was ready to be tested and was available through Chrome Canary and chrome-dev-channel which you can access manually through:

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

    More change requests were submitted as follows:

    As the experimental launch of the new backend appeared to be stable, finally these configuration was enabled by default so that the chanege rolls out to all users of Chrome 87 through usb: Enable new Windows USB backend by default. Revision / Commit

    The idea was once this configuration becomes the default for a few milestones, Chromium Team will start removing the Windows-specific code from the old back-end and remove the flag.


    Road Ahead

    Chromium Team have already merged the revision/commit to Extend new-usb-backend flag expiration within Chrome v90 which will be available soon.


    Update

    As per @ReillyGrant's [Committer, WebDriver for Google Chrome] comment :

    ..." 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"...


    References

    You can find a couple of relevant detailed discussions in: