SeleniumHQ/selenium · error · TypeError

{__class__.__name__}.__init__() got an invalid version: '{ve

Error message

{__class__.__name__}.__init__() got an invalid version: '{version}'

What it means

Raised as TypeError by the Server.version setter when the version string does not match the regex pattern ^\d+\.\d+\.\d+$ (exactly three dot-separated numeric components). This enforces semantic-version-like format for Selenium Grid downloads. Versions like '4.20' or 'latest' or '4.20.0-rc1' will be rejected.

Source

Thrown at py/selenium/webdriver/remote/server.py:125

    @port.setter
    def port(self, port):
        try:
            port = int(port)
        except ValueError:
            raise TypeError(f"{__class__.__name__}.__init__() got an invalid port: '{port}'")
        if not (0 <= port <= 65535):
            raise ValueError("port must be 0-65535")
        self._port = port

    @property
    def version(self):
        return self._version

    @version.setter
    def version(self, version):
        if version:
            if not re.match(r"^\d+\.\d+\.\d+$", str(version)):
                raise TypeError(f"{__class__.__name__}.__init__() got an invalid version: '{version}'")
        self._version = version

    @property
    def log_level(self):
        return self._log_level

    @log_level.setter
    def log_level(self, log_level):
        levels = ("SEVERE", "WARNING", "INFO", "CONFIG", "FINE", "FINER", "FINEST")
        if log_level not in levels:
            raise TypeError(f"log_level must be one of: {', '.join(levels)}")
        self._log_level = log_level

    @property
    def env(self):
        return self._env

    @env.setter

View on GitHub (pinned to aa36b38e69)

Solutions

  1. Use the full three-component version: Server(version='4.20.0')
  2. Remove any 'v' prefix or pre-release suffix from the version string
  3. If using a snapshot/RC build, download the jar manually and use the path parameter instead

Example fix

// before
server = Server(version='4.20')
# or
server = Server(version='v4.20.0')

// after
server = Server(version='4.20.0')
Defensive patterns

Strategy: validation

Validate before calling

import re
version = '4.20'
if not re.match(r'^\d+\.\d+\.\d+$', str(version)):
    version = version + '.0' if version.count('.') == 1 else None
server = Server(version=version)

Type guard

import re
def is_valid_version(v) -> bool:
    return bool(re.match(r'^\d+\.\d+\.\d+$', str(v)))

Try / catch

try:
    server = Server(version=version)
except TypeError:
    # fall back to local jar or latest known good version
    server = Server(path='/opt/selenium-server.jar')

Prevention

When it happens

Trigger: Calling Server(version='4.20'), Server(version='latest'), Server(version='4.20.0-rc1'), or Server(version='v4.20.0') triggers the TypeError. Only exact X.Y.Z format is accepted.

Common situations: Passing a short version like '4.20' instead of '4.20.0'. Including a 'v' prefix. Using pre-release qualifiers like '-rc1'. Passing 'latest' or a milestone tag.

Related errors


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