fix(android): launch apps with checked activity manager commands
This commit is contained in:
1 parent
ef7af9988e
commit
f86db1ced6
8 files changed
+334
-15
No files matched your search
@@ -28,6 +28,7 @@ from artemis.controllers.platform_specific_commands_controller import (
|
||||
)
|
||||
from artemis.controllers.unified_controller import UnifiedMobileController
|
||||
from artemis.data_engine.trace import TraceSpan
|
||||
from artemis.drivers.errors import AppLaunchError
|
||||
from artemis.utils.logger import get_logger
|
||||
|
||||
logger = get_logger(__name__)
|
||||
@@ -285,6 +286,7 @@ async def launch_app_with_retries(
|
||||
Tuple of (success: bool, error_message: str | None)
|
||||
"""
|
||||
|
||||
last_error: str | None = None
|
||||
for attempt in range(1, max_retries + 1):
|
||||
logger.info(f"Launch attempt {attempt}/{max_retries} for app {app_package}")
|
||||
|
||||
@@ -304,13 +306,32 @@ async def launch_app_with_retries(
|
||||
await controller.terminate_app(app_package)
|
||||
await asyncio.sleep(1.0)
|
||||
|
||||
launch_success = await controller.launch_app(app_package)
|
||||
launch_error: AppLaunchError | None = None
|
||||
try:
|
||||
launch_success = await controller.launch_app(app_package)
|
||||
except AppLaunchError as exc:
|
||||
launch_success = False
|
||||
launch_error = exc
|
||||
span.payload["retryable"] = exc.retryable
|
||||
span.payload["launch_error"] = str(exc)
|
||||
if exc.may_have_started:
|
||||
logger.warning(f"{exc};先核对应用是否已进入前台,避免重复启动。")
|
||||
ready, _ = await _poll_for_app_ready(ctx, app_package, max_poll_seconds)
|
||||
if ready:
|
||||
span.status = "success"
|
||||
span.result = "App is ready (launch acknowledgement was unavailable)"
|
||||
return True, None
|
||||
if not launch_success:
|
||||
error_msg = f"Failed to execute launch command for {app_package}"
|
||||
error_msg = (
|
||||
str(launch_error)
|
||||
if launch_error
|
||||
else (f"Failed to execute launch command for {app_package}")
|
||||
)
|
||||
last_error = error_msg
|
||||
logger.error(error_msg)
|
||||
span.status = "failed"
|
||||
span.error = error_msg
|
||||
if attempt == max_retries:
|
||||
if attempt == max_retries or (launch_error and not launch_error.retryable):
|
||||
return False, error_msg
|
||||
await asyncio.sleep(2)
|
||||
continue
|
||||
@@ -326,12 +347,15 @@ async def launch_app_with_retries(
|
||||
|
||||
span.status = "failed"
|
||||
span.error = error_msg
|
||||
last_error = error_msg
|
||||
|
||||
if attempt < max_retries:
|
||||
logger.warning(f"Attempt {attempt} failed: {error_msg}. Retrying...")
|
||||
await asyncio.sleep(1)
|
||||
|
||||
error_msg = f"Failed to launch {app_package} after {max_retries} attempts"
|
||||
if last_error:
|
||||
error_msg += f": {last_error}"
|
||||
logger.error(error_msg)
|
||||
return False, error_msg
|
||||
|
||||
|
||||
Reference in new issue
Block a user