From dda3e6c1d369394343cff224887d2f88f6a41cb2 Mon Sep 17 00:00:00 2001 From: zhentao zhu <480694856@qq.com> Date: Fri, 30 Jan 2026 15:57:32 +0800 Subject: [PATCH] Add support for string array in multipart fields --- playwright/_impl/_fetch.py | 9 +++++++++ playwright/_impl/_helper.py | 3 +++ playwright/async_api/_generated.py | 4 +--- 3 files changed, 13 insertions(+), 3 deletions(-) diff --git a/playwright/_impl/_fetch.py b/playwright/_impl/_fetch.py index 50bf4ad4a..bc08c4498 100644 --- a/playwright/_impl/_fetch.py +++ b/playwright/_impl/_fetch.py @@ -40,6 +40,7 @@ async_readfile, async_writefile, is_file_payload, + is_file_array_payload, locals_to_params, object_to_array, to_impl, @@ -394,6 +395,14 @@ async def _inner_fetch( multipart_data.append( FormField(name=name, file=file_payload_to_json(payload)) ) + elif is_file_array_payload(value): + for item in value: + payload = cast(FilePayload, item) + assert isinstance(payload["buffer"], bytes) + multipart_data.append(FormField(name=name, file=file_payload_to_json(payload))) + elif isinstance(value, list): + for item in value: + multipart_data.append(FormField(name=name, value=str(item))) elif isinstance(value, str): multipart_data.append(FormField(name=name, value=value)) if ( diff --git a/playwright/_impl/_helper.py b/playwright/_impl/_helper.py index 1d7e4f67b..6ca9f7d30 100644 --- a/playwright/_impl/_helper.py +++ b/playwright/_impl/_helper.py @@ -561,6 +561,9 @@ def is_file_payload(value: Optional[Any]) -> bool: and "buffer" in value ) +def is_file_array_payload(value: Optional[Any]) -> bool: + return isinstance(value, list) and all(is_file_payload(x) for x in value) + TEXTUAL_MIME_TYPE = re.compile( r"^(text\/.*?|application\/(json|(x-)?javascript|xml.*?|ecmascript|graphql|x-www-form-urlencoded)|image\/svg(\+xml)?|application\/.*?(\+json|\+xml))(;\s*charset=.*)?$" diff --git a/playwright/async_api/_generated.py b/playwright/async_api/_generated.py index 469046b21..d7d99e006 100644 --- a/playwright/async_api/_generated.py +++ b/playwright/async_api/_generated.py @@ -18229,9 +18229,7 @@ async def delete( headers: typing.Optional[typing.Dict[str, str]] = None, data: typing.Optional[typing.Union[typing.Any, str, bytes]] = None, form: typing.Optional[typing.Dict[str, typing.Union[str, float, bool]]] = None, - multipart: typing.Optional[ - typing.Dict[str, typing.Union[bytes, bool, float, str, FilePayload]] - ] = None, + multipart: typing.Dict[str,typing.Union[bytes,bool,float,str,FilePayload,typing.List[typing.Union[str, FilePayload]]]] = None, timeout: typing.Optional[float] = None, fail_on_status_code: typing.Optional[bool] = None, ignore_https_errors: typing.Optional[bool] = None,