feat: add configurable screenshot resolution limit

This commit is contained in:
chenmingxuan committed 2026-09-29 17:12:22 +08:00
1 parent 59f458205d
commit ab066733b8
13 files changed
+134 -4

No files matched your search

+41
View File
@@ -15,14 +15,18 @@
"""Unit tests for Unified Base Device Driver and implementations."""
import base64
from io import BytesIO
from types import SimpleNamespace
from unittest.mock import AsyncMock, MagicMock
import pytest
from PIL import Image
from artemis.drivers.base import KeyCode, ScreenData, SwipeDirection
from artemis.drivers.mock.mock_driver import MockDeviceDriver
from artemis.drivers.android.adb_driver import AndroidAdbDriver
from artemis.config.agent import ScreenshotConfig
from artemis.utils.screenshot_limit import limit_screenshot_long_edge
_ONE_PIXEL_PNG = base64.b64encode(
@@ -32,6 +36,13 @@ _ONE_PIXEL_PNG = base64.b64encode(
).decode("ascii")
def test_screenshot_limit_keeps_small_and_invalid_images_unchanged():
small_image = base64.b64decode(_ONE_PIXEL_PNG)
assert limit_screenshot_long_edge(small_image, 2048) is small_image
invalid_image = b"not an image"
assert limit_screenshot_long_edge(invalid_image, 2048) is invalid_image
@pytest.mark.asyncio
async def test_mock_driver_actions():
"""Verify MockDeviceDriver records and performs all core actions."""
@@ -141,6 +152,36 @@ async def test_android_driver_preserves_elements_from_combined_screen_data():
mock_ui_client.get_hierarchy.assert_not_called()
@pytest.mark.asyncio
@pytest.mark.parametrize("enabled", [True, False])
async def test_android_screenshot_limit_preserves_native_coordinates(enabled):
image = Image.new("RGB", (1200, 2600), "white")
buffer = BytesIO()
image.save(buffer, format="JPEG")
original = buffer.getvalue()
elements = [{"text": "目标", "bounds": "[100,200][300,400]"}]
ui_client = MagicMock()
ui_client.get_screen_data.return_value = SimpleNamespace(
base64=base64.b64encode(original).decode("ascii"),
hierarchy_xml="<hierarchy />",
elements=elements,
width=1200,
height=2600,
)
driver = AndroidAdbDriver("emulator-5554", MagicMock(), ui_adb_client=ui_client)
driver._screenshot_config = ScreenshotConfig(enabled=enabled, max_long_edge=2048)
screen = await driver.get_screen_data(skip_settling=True)
with Image.open(BytesIO(screen.screenshot_bytes)) as result:
assert result.size == ((945, 2048) if enabled else (1200, 2600))
assert screen.width == 1200 and screen.height == 2600
assert screen.ui_elements == elements
assert screen.screenshot_base64 == base64.b64encode(screen.screenshot_bytes).decode("ascii")
if not enabled:
assert screen.screenshot_bytes == original
@pytest.mark.asyncio
async def test_android_driver_parses_xml_hierarchy_fallback():
"""XML-only clients remain supported without discarding their hierarchy."""