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
- Subclass AbstractEventListener (or inherit it) and pass an instance.
- 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
- Always extend AbstractEventListener when writing listeners.
- Pass a listener instance, not a class or factory.
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
- A WebDriver instance must be supplied
- Event '{event}' not found. Available events: {self._availabl
- Unexpected compiled output format. Expected it to start with
- Unexpected compiled output format. Expected it to start with
- Unexpected compiled output format. Expected it to start with
AI-assisted analysis of SeleniumHQ/selenium@aa36b38e69 (2026-08-14).
Data as JSON: /api/errors/d617b6ba9328be0f.
Report an issue: GitHub.