{"record":{"id":"cd6cd0e492532cff","repo":"SeleniumHQ/selenium","slug":"class-name-init-got-an-invalid-ver","errorCode":null,"errorMessage":"{__class__.__name__}.__init__() got an invalid version: '{version}'","messagePattern":"(.+?)\\.__init__\\(\\) got an invalid version: '(.+?)'","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"py/selenium/webdriver/remote/server.py","lineNumber":125,"sourceCode":"    @port.setter\n    def port(self, port):\n        try:\n            port = int(port)\n        except ValueError:\n            raise TypeError(f\"{__class__.__name__}.__init__() got an invalid port: '{port}'\")\n        if not (0 <= port <= 65535):\n            raise ValueError(\"port must be 0-65535\")\n        self._port = port\n\n    @property\n    def version(self):\n        return self._version\n\n    @version.setter\n    def version(self, version):\n        if version:\n            if not re.match(r\"^\\d+\\.\\d+\\.\\d+$\", str(version)):\n                raise TypeError(f\"{__class__.__name__}.__init__() got an invalid version: '{version}'\")\n        self._version = version\n\n    @property\n    def log_level(self):\n        return self._log_level\n\n    @log_level.setter\n    def log_level(self, log_level):\n        levels = (\"SEVERE\", \"WARNING\", \"INFO\", \"CONFIG\", \"FINE\", \"FINER\", \"FINEST\")\n        if log_level not in levels:\n            raise TypeError(f\"log_level must be one of: {', '.join(levels)}\")\n        self._log_level = log_level\n\n    @property\n    def env(self):\n        return self._env\n\n    @env.setter","sourceCodeStart":107,"sourceCodeEnd":143,"githubUrl":"https://github.com/SeleniumHQ/selenium/blob/aa36b38e696a0909e973bdf5e2f9031ffe842c4b/py/selenium/webdriver/remote/server.py#L107-L143","documentation":"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.","triggerScenarios":"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.","commonSituations":"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.","solutions":["Use the full three-component version: Server(version='4.20.0')","Remove any 'v' prefix or pre-release suffix from the version string","If using a snapshot/RC build, download the jar manually and use the path parameter instead"],"exampleFix":"// before\nserver = Server(version='4.20')\n# or\nserver = Server(version='v4.20.0')\n\n// after\nserver = Server(version='4.20.0')","handlingStrategy":"validation","validationCode":"import re\nversion = '4.20'\nif not re.match(r'^\\d+\\.\\d+\\.\\d+$', str(version)):\n    version = version + '.0' if version.count('.') == 1 else None\nserver = Server(version=version)","typeGuard":"import re\ndef is_valid_version(v) -> bool:\n    return bool(re.match(r'^\\d+\\.\\d+\\.\\d+$', str(v)))","tryCatchPattern":"try:\n    server = Server(version=version)\nexcept TypeError:\n    # fall back to local jar or latest known good version\n    server = Server(path='/opt/selenium-server.jar')","preventionTips":["Always use full X.Y.Z three-component version strings","Remove 'v' prefixes and pre-release suffixes","If using non-standard versions, download the jar manually and use path instead"],"tags":["remote","server","version","validation","type-error","regex"],"backgroundTag":null,"analyzedSha":"aa36b38e696a0909e973bdf5e2f9031ffe842c4b","analyzedAt":"2026-08-14T02:32:32.244Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}