SeleniumHQ/selenium · error · WebDriverException

A WebDriver instance must be supplied

Error message

A WebDriver instance must be supplied

What it means

EventFiringWebDriver.__init__ wraps an existing WebDriver instance; the first argument must be a WebDriver instance (isinstance check). Anything else raises WebDriverException.

Source

Thrown at py/selenium/webdriver/support/event_firing_webdriver.py:71

        Example:
            from selenium.webdriver import Firefox
            from selenium.webdriver.support.events import EventFiringWebDriver, AbstractEventListener


            class MyListener(AbstractEventListener):
                def before_navigate_to(self, url, driver):
                    print("Before navigate to %s" % url)

                def after_navigate_to(self, url, driver):
                    print("After navigate to %s" % url)


            driver = Firefox()
            ef_driver = EventFiringWebDriver(driver, MyListener())
            ef_driver.get("http://www.google.co.in/")
        """
        if not isinstance(driver, WebDriver):
            raise WebDriverException("A WebDriver instance must be supplied")
        if not isinstance(event_listener, AbstractEventListener):
            raise WebDriverException("Event listener must be a subclass of AbstractEventListener")
        self._driver = driver
        # this is valid, but type checkers don't like dynamically assigning to a method
        self._driver._wrap_value = self._wrap_value  # type: ignore
        self._listener = event_listener

    @property
    def wrapped_driver(self) -> WebDriver:
        """Returns the WebDriver instance wrapped by this EventsFiringWebDriver."""
        return self._driver

    def get(self, url: str) -> None:
        self._dispatch("navigate_to", (url, self._driver), "get", (url,))

    def back(self) -> None:
        self._dispatch("navigate_back", (self._driver,), "back", ())

View on GitHub (pinned to aa36b38e69)

Solutions

  1. Instantiate the driver first, then wrap it.
  2. Verify isinstance(driver, WebDriver) before constructing the wrapper.

Example fix

# before
ef = EventFiringWebDriver(Firefox, MyListener())   # class, not instance

# after
ef = EventFiringWebDriver(Firefox(), MyListener())
Defensive patterns

Strategy: type-guard

Validate before calling

from selenium.webdriver.remote.webdriver import WebDriver
if not isinstance(driver, WebDriver):
    raise TypeError("first arg must be a WebDriver instance")

Type guard

from selenium.webdriver.remote.webdriver import WebDriver
def is_webdriver(v) -> bool:
    return isinstance(v, WebDriver)

Prevention

When it happens

Trigger: EventFiringWebDriver(None, listener), EventFiringWebDriver(WebDriverClass, listener) (passing the class not an instance), or passing a WebElement/Remote connection instead of a driver.

Common situations: Forgetting to instantiate the inner driver, or passing arguments in the wrong order (listener first).

Related errors


AI-assisted analysis of SeleniumHQ/selenium@aa36b38e69 (2026-08-14). Data as JSON: /api/errors/783f987818d8d3a9. Report an issue: GitHub.