SeleniumHQ/selenium · error · WebDriverException

Event listener must be a subclass of AbstractEventListener

Error message

Event listener must be a subclass of AbstractEventListener

What it means

Second constructor guard for EventFiringWebDriver: the listener must be an instance of AbstractEventListener. A plain object, dict, or function raises WebDriverException.

Source

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

            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", ())

    def forward(self) -> None:
        self._dispatch("navigate_forward", (self._driver,), "forward", ())

View on GitHub (pinned to aa36b38e69)

Solutions

  1. Subclass AbstractEventListener (or inherit it) and pass an instance.
  2. Verify isinstance(listener, AbstractEventListener) before constructing.

Example fix

# before
class MyListener:                 # no base class
    def after_get(self, d): ...
ef = EventFiringWebDriver(driver, MyListener())

# after
from selenium.webdriver.support.abstract_event_listener import AbstractEventListener
class MyListener(AbstractEventListener):
    def after_get(self, d): ...
ef = EventFiringWebDriver(driver, MyListener())
Defensive patterns

Strategy: type-guard

Validate before calling

from selenium.webdriver.support.abstract_event_listener import AbstractEventListener
if not isinstance(listener, AbstractEventListener):
    raise TypeError("listener must extend AbstractEventListener")

Type guard

from selenium.webdriver.support.abstract_event_listener import AbstractEventListener
def is_event_listener(v) -> bool:
    return isinstance(v, AbstractEventListener)

Prevention

When it happens

Trigger: EventFiringWebDriver(driver, some_function), passing a dict, or a listener class that does not inherit AbstractEventListener.

Common situations: Writing an ad-hoc listener without extending the base class, or passing a listener factory instead of an instance.

Related errors


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