{"record":{"id":"803990bbc78f30b1","repo":"SeleniumHQ/selenium","slug":"service-args-must-be-a-sequence-803990","errorCode":null,"errorMessage":"service_args must be a sequence","messagePattern":"service_args must be a sequence","errorType":"validation","errorClass":"TypeError","httpStatus":null,"severity":"error","filePath":"py/selenium/webdriver/firefox/service.py","lineNumber":95,"sourceCode":"        )\n\n        # Set a port for CDP\n        if \"--connect-existing\" not in self._service_args:\n            self._service_args.append(\"--websocket-port\")\n            self._service_args.append(f\"{utils.free_port()}\")\n\n    def command_line_args(self) -> list[str]:\n        return [\"--port\", f\"{self.port}\"] + self._service_args\n\n    @property\n    def service_args(self) -> Sequence[str]:\n        \"\"\"Returns the sequence of service arguments.\"\"\"\n        return self._service_args\n\n    @service_args.setter\n    def service_args(self, value: Sequence[str]):\n        if isinstance(value, str) or not isinstance(value, Sequence):\n            raise TypeError(\"service_args must be a sequence\")\n        self._service_args = list(value)\n","sourceCodeStart":77,"sourceCodeEnd":97,"githubUrl":"https://github.com/SeleniumHQ/selenium/blob/aa36b38e696a0909e973bdf5e2f9031ffe842c4b/py/selenium/webdriver/firefox/service.py#L77-L97","documentation":"Raised as TypeError by the FirefoxService.service_args setter when the value is a bare str or not a Sequence type. The check explicitly rejects str because a string is technically a Sequence of characters, which would be incorrectly unpacked into individual character arguments. Only list or tuple (or other non-str Sequence) of argument strings is valid.","triggerScenarios":"Passing service_args='--verbose' (a single string instead of a list), service_args=42 (an int), or service_args=None triggers the TypeError. The value must be a list/tuple of strings.","commonSituations":"Developers who pass a single CLI argument as a string rather than wrapping it in a list. Passing a space-separated argument string expecting it to be split.","solutions":["Wrap arguments in a list: service_args=['--verbose']","Use a tuple if preferred: service_args=('--verbose',)","Split a space-separated string with shlex.split() before passing"],"exampleFix":"// before\nservice = Service(service_args='--verbose --marionette-port 2828')\n\n// after\nservice = Service(service_args=['--verbose', '--marionette-port', '2828'])","handlingStrategy":"type-guard","validationCode":"args = '--verbose'\nif isinstance(args, str):\n    import shlex\n    args = shlex.split(args)\nservice = Service(service_args=args)","typeGuard":"from collections.abc import Sequence\ndef is_arg_sequence(v) -> bool:\n    return not isinstance(v, str) and isinstance(v, Sequence)","tryCatchPattern":"try:\n    service.service_args = args\nexcept TypeError:\n    service.service_args = [args] if isinstance(args, str) else list(args)","preventionTips":["Always pass service_args as a list or tuple of strings","Use shlex.split() to convert a string to an argument list","Never pass a bare string to service_args"],"tags":["firefox","type-validation","service","arguments","sequence"],"backgroundTag":null,"analyzedSha":"aa36b38e696a0909e973bdf5e2f9031ffe842c4b","analyzedAt":"2026-08-14T02:32:32.244Z","schemaVersion":2},"datasetVersion":"2026-08-14T05:17:29.042Z"}