From 2589e8910a08d5e289e0bb0b4e8125610dac7594 Mon Sep 17 00:00:00 2001 From: MattL1989 Date: Thu, 29 Oct 2026 22:09:30 +0000 Subject: [PATCH] fix(options): return Flutter timeout options as timedelta The flutter_element_wait_timeout and flutter_server_launch_timeout getters are annotated and documented to return a timedelta, and their setters accept one, but the getters returned the raw capability value in milliseconds. So setting timedelta(seconds=10) and reading it back gave 10000. Convert the stored milliseconds to a timedelta, like the other timeout options do. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01K6zVKi1DtwmmBpy16MQyfY --- .../flutter_element_wait_timeout_option.py | 3 ++- .../flutter_server_launch_timeout_option.py | 3 ++- .../flutter_integration_driver_test.py | 14 ++++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/appium/options/flutter_integration/flutter_element_wait_timeout_option.py b/appium/options/flutter_integration/flutter_element_wait_timeout_option.py index d367be1cd..ddd0de777 100644 --- a/appium/options/flutter_integration/flutter_element_wait_timeout_option.py +++ b/appium/options/flutter_integration/flutter_element_wait_timeout_option.py @@ -31,7 +31,8 @@ def flutter_element_wait_timeout(self) -> timedelta | None: Returns: Optional[timedelta]: The timeout value as a `timedelta` object if set, or `None` if the timeout is not defined. """ - return self.get_capability(FLUTTER_ELEMENT_WAIT_TIMEOUT) + value = self.get_capability(FLUTTER_ELEMENT_WAIT_TIMEOUT) + return None if value is None else timedelta(milliseconds=value) @flutter_element_wait_timeout.setter def flutter_element_wait_timeout(self, value: timedelta | int) -> None: diff --git a/appium/options/flutter_integration/flutter_server_launch_timeout_option.py b/appium/options/flutter_integration/flutter_server_launch_timeout_option.py index d387c3c14..4fa30a452 100644 --- a/appium/options/flutter_integration/flutter_server_launch_timeout_option.py +++ b/appium/options/flutter_integration/flutter_server_launch_timeout_option.py @@ -32,7 +32,8 @@ def flutter_server_launch_timeout(self) -> timedelta | None: Optional[timedelta]: The timeout value as a `timedelta` object if set, or `None` if the timeout is not defined. """ - return self.get_capability(FLUTTER_SERVER_LAUNCH_TIMEOUT) + value = self.get_capability(FLUTTER_SERVER_LAUNCH_TIMEOUT) + return None if value is None else timedelta(milliseconds=value) @flutter_server_launch_timeout.setter def flutter_server_launch_timeout(self, value: timedelta | int) -> None: diff --git a/test/unit/webdriver/flutter_integration/flutter_integration_driver_test.py b/test/unit/webdriver/flutter_integration/flutter_integration_driver_test.py index 0e97d81cd..7715b00ce 100644 --- a/test/unit/webdriver/flutter_integration/flutter_integration_driver_test.py +++ b/test/unit/webdriver/flutter_integration/flutter_integration_driver_test.py @@ -13,6 +13,7 @@ # limitations under the License. import json +from datetime import timedelta import httpretty @@ -58,3 +59,16 @@ def test_create_session(self): } assert request_json.get('desiredCapabilities') is None assert driver.session_id == 'session-id' + + def test_timeout_options_are_returned_as_timedelta(self): + flutterOptions = FlutterOptions() + assert flutterOptions.flutter_element_wait_timeout is None + assert flutterOptions.flutter_server_launch_timeout is None + + flutterOptions.flutter_element_wait_timeout = timedelta(seconds=10) + flutterOptions.flutter_server_launch_timeout = 120000 + + assert flutterOptions.flutter_element_wait_timeout == timedelta(seconds=10) + assert flutterOptions.flutter_server_launch_timeout == timedelta(minutes=2) + assert flutterOptions.to_capabilities()['appium:flutterElementWaitTimeout'] == 10000 + assert flutterOptions.to_capabilities()['appium:flutterServerLaunchTimeout'] == 120000