From 62cc0bfacdb1f1fc6cf0bc9c5f925ae644fde913 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9A=B0=EC=98=81?= Date: Wed, 10 Sep 2025 22:38:30 +0900 Subject: [PATCH 1/5] refact: _adjust_image_payload --- appium/webdriver/extensions/images_comparison.py | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/appium/webdriver/extensions/images_comparison.py b/appium/webdriver/extensions/images_comparison.py index cae80168..4e3a35d4 100644 --- a/appium/webdriver/extensions/images_comparison.py +++ b/appium/webdriver/extensions/images_comparison.py @@ -1,5 +1,5 @@ #!/usr/bin/env python - +import binascii # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -14,6 +14,8 @@ from typing import Any, Dict, Union +import base64 + from appium.protocols.webdriver.can_execute_commands import CanExecuteCommands from ..mobilecommand import MobileCommand as Command @@ -147,4 +149,13 @@ def _add_commands(self) -> None: def _adjust_image_payload(payload: Base64Payload) -> str: - return payload if isinstance(payload, str) else payload.decode('utf-8') + if isinstance(payload, str): + return payload + try: + b64_str = payload.decode('ascii') + base64.b64decode(payload,validate=True) + return b64_str + except (UnicodeDecodeError, binascii.Error): + return base64.b64encode(payload).decode('ascii') + + From 5f153e39caa5dba934ff39879f5c18f3ff248656 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9A=B0=EC=98=81?= Date: Wed, 10 Sep 2025 23:05:17 +0900 Subject: [PATCH 2/5] style: move import binascii --- appium/webdriver/extensions/images_comparison.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/appium/webdriver/extensions/images_comparison.py b/appium/webdriver/extensions/images_comparison.py index 4e3a35d4..085b397a 100644 --- a/appium/webdriver/extensions/images_comparison.py +++ b/appium/webdriver/extensions/images_comparison.py @@ -1,5 +1,5 @@ #!/usr/bin/env python -import binascii + # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at @@ -16,6 +16,8 @@ import base64 +import binascii + from appium.protocols.webdriver.can_execute_commands import CanExecuteCommands from ..mobilecommand import MobileCommand as Command From 9c46a64a64db841ce9bcbb40b48d3e5c64a22081 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9A=B0=EC=98=81?= <160103260+wooyoung294@users.noreply.github.com> Date: Thu, 11 Sep 2025 14:36:19 +0900 Subject: [PATCH 3/5] refactor: raise helpful ValueError on UnicodeDecodeError --- appium/webdriver/extensions/images_comparison.py | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) diff --git a/appium/webdriver/extensions/images_comparison.py b/appium/webdriver/extensions/images_comparison.py index 085b397a..4aa7052b 100644 --- a/appium/webdriver/extensions/images_comparison.py +++ b/appium/webdriver/extensions/images_comparison.py @@ -14,10 +14,6 @@ from typing import Any, Dict, Union -import base64 - -import binascii - from appium.protocols.webdriver.can_execute_commands import CanExecuteCommands from ..mobilecommand import MobileCommand as Command @@ -151,13 +147,8 @@ def _add_commands(self) -> None: def _adjust_image_payload(payload: Base64Payload) -> str: - if isinstance(payload, str): - return payload try: - b64_str = payload.decode('ascii') - base64.b64decode(payload,validate=True) - return b64_str - except (UnicodeDecodeError, binascii.Error): - return base64.b64encode(payload).decode('ascii') - + return payload if isinstance(payload, str) else payload.decode('utf-8') + except UnicodeDecodeError as e: + raise ValueError('The image payload cannot be serialized to a string. Make sure to base64-encode it first') From b7a51e451cf4cda3e87a6cc8fd21d9c309f09b73 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=EC=9A=B0=EC=98=81?= <160103260+wooyoung294@users.noreply.github.com> Date: Thu, 11 Sep 2025 15:01:15 +0900 Subject: [PATCH 4/5] refactor: add from e --- appium/webdriver/extensions/images_comparison.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/appium/webdriver/extensions/images_comparison.py b/appium/webdriver/extensions/images_comparison.py index 4aa7052b..cf5dad5e 100644 --- a/appium/webdriver/extensions/images_comparison.py +++ b/appium/webdriver/extensions/images_comparison.py @@ -150,5 +150,5 @@ def _adjust_image_payload(payload: Base64Payload) -> str: try: return payload if isinstance(payload, str) else payload.decode('utf-8') except UnicodeDecodeError as e: - raise ValueError('The image payload cannot be serialized to a string. Make sure to base64-encode it first') + raise ValueError('The image payload cannot be serialized to a string. Make sure to base64-encode it first') from e From 2482d3c216d4b2fc113adb32e3098093556b367f Mon Sep 17 00:00:00 2001 From: wooyoung Date: Thu, 11 Sep 2025 20:30:22 +0900 Subject: [PATCH 5/5] style: ruff formatting --- appium/webdriver/extensions/images_comparison.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/appium/webdriver/extensions/images_comparison.py b/appium/webdriver/extensions/images_comparison.py index cf5dad5e..04b8f114 100644 --- a/appium/webdriver/extensions/images_comparison.py +++ b/appium/webdriver/extensions/images_comparison.py @@ -148,7 +148,6 @@ def _add_commands(self) -> None: def _adjust_image_payload(payload: Base64Payload) -> str: try: - return payload if isinstance(payload, str) else payload.decode('utf-8') - except UnicodeDecodeError as e: + return payload if isinstance(payload, str) else payload.decode('utf-8') + except UnicodeDecodeError as e: raise ValueError('The image payload cannot be serialized to a string. Make sure to base64-encode it first') from e -