SeleniumHQ/selenium · error · WebDriverException

Detector has to be instance of FileDetector

Error message

Detector has to be instance of FileDetector

What it means

Raised by the file_detector setter when the value is non-None and truthy but is not an instance of FileDetector. The setter enforces the FileDetector contract so downstream send_keys logic can rely on the detector's API. This guard runs after the None check, so it only fires for objects that exist but are the wrong type.

Source

Thrown at py/selenium/webdriver/remote/webdriver.py:1116

    @property
    def file_detector(self) -> FileDetector:
        return self._file_detector

    @file_detector.setter
    def file_detector(self, detector) -> None:
        """Set the file detector for keyboard input.

        By default, this is set to a file detector that does nothing.
        See FileDetector, LocalFileDetector, and UselessFileDetector.

        Args:
            detector: The detector to use. Must not be None.
        """
        if not detector:
            raise WebDriverException("You may not set a file detector that is null")
        if not isinstance(detector, FileDetector):
            raise WebDriverException("Detector has to be instance of FileDetector")
        self._file_detector = detector

    @property
    def orientation(self) -> dict:
        """Gets the current orientation of the device.

        Example:
            `orientation = driver.orientation`
        """
        return self.execute(Command.GET_SCREEN_ORIENTATION)["value"]

    @orientation.setter
    def orientation(self, value) -> None:
        """Sets the current orientation of the device.

        Args:
            value: Orientation to set it to.

View on GitHub (pinned to aa36b38e69)

Solutions

  1. Subclass FileDetector and instantiate it: from selenium.webdriver.remote.file_detector import FileDetector, LocalFileDetector.
  2. Make sure you assign an instance (LocalFileDetector()), not the class (LocalFileDetector).
  3. For tests/mocks, have the test double inherit from FileDetector rather than being a bare object.

Example fix

# before
driver.file_detector = LocalFileDetector  # class, not instance

# after
from selenium.webdriver.remote.file_detector import LocalFileDetector
driver.file_detector = LocalFileDetector()
Defensive patterns

Strategy: type-guard

Validate before calling

from selenium.webdriver.remote.file_detector import FileDetector
if not isinstance(detector, FileDetector):
    raise TypeError('detector must be a FileDetector instance')
driver.file_detector = detector

Type guard

from selenium.webdriver.remote.file_detector import FileDetector
def is_file_detector(d) -> bool:
    return isinstance(d, FileDetector)

Try / catch

from selenium.common.exceptions import WebDriverException
try:
    driver.file_detector = detector
except WebDriverException:
    # likely wrong type; instantiate the correct class
    driver.file_detector = LocalFileDetector()

Prevention

When it happens

Trigger: Assigning driver.file_detector to a plain object, a string, a bool, or a custom class that does not extend selenium.webdriver.remote.file_detector.FileDetector. Note: assigning True or 1 passes the None check (truthy) but fails isinstance, so it lands here.

Common situations: A developer passes a configuration object or a mock that does not subclass FileDetector. Or assigns LocalFileDetector (the class) instead of LocalFileDetector() (an instance) — the class object itself is not an instance of FileDetector.

Related errors


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