多设备启动,端口固定,时间接口未返回

This commit is contained in:
2026-02-04 10:58:46 +08:00
parent cc59e8b8da
commit 9ce1dbadc1
22 changed files with 1344 additions and 297 deletions

View File

@@ -2,6 +2,7 @@
import subprocess
import logging
import time
import os
# 配置日志
logging.basicConfig(level=logging.INFO, format="%(asctime)s - %(levelname)s: %(message)s")
@@ -83,90 +84,143 @@ def grant_single_permission(device_id: str, package: str, permission: str) -> bo
logging.error(f"设备 {device_id}:处理 {package} 时发生未知错误:{str(e)}")
return False
# def grant_appium_permissions(device_id: str, require_all: bool = False) -> bool:
# """
# 为 Appium UiAutomator2 服务授予权限
# :param device_id: 设备 ID
# :param require_all: 是否要求所有权限都成功授予
# :return: 权限授予是否成功根据require_all参数判断
# """
# # 首先检查设备连接
# if not check_device_connection(device_id):
# return False
# packages_to_grant = [
# "io.appium.settings",
# "io.appium.uiautomator2.server",
# "io.appium.uiautomator2.server.test"
# ]
# # 权限列表(按优先级排序)
# permissions_to_grant = [
# "android.permission.SET_ANIMATION_SCALE",
# "android.permission.CHANGE_CONFIGURATION",
# "android.permission.WRITE_SETTINGS",
# "android.permission.DISABLE_KEYGUARD",
# ]
# success_count = 0
# total_attempted = 0
# package_results = {}
# # 检查并授予权限
# for package in packages_to_grant:
# package_results[package] = {"installed": False, "permissions": {}}
# if not is_package_installed(device_id, package):
# logging.warning(f"设备 {device_id}:包 {package} 未安装,跳过权限授予")
# package_results[package]["installed"] = False
# continue
# package_results[package]["installed"] = True
# package_success = 0
# package_attempted = 0
# for permission in permissions_to_grant:
# total_attempted += 1
# package_attempted += 1
# result = grant_single_permission(device_id, package, permission)
# package_results[package]["permissions"][permission] = result
# if result:
# success_count += 1
# package_success += 1
# # 记录每个包的授权结果
# logging.info(f"设备 {device_id}:包 {package} 权限授予结果: {package_success}/{package_attempted}")
# # 统计和报告
# logging.info(f"设备 {device_id}:权限授予完成")
# logging.info(f"总计: 尝试 {total_attempted} 次,成功 {success_count} 次")
# # 检查每个包的关键权限
# critical_permission = "android.permission.WRITE_SECURE_SETTINGS"
# critical_failures = []
# for package, info in package_results.items():
# if info["installed"] and critical_permission in info["permissions"]:
# if not info["permissions"][critical_permission]:
# critical_failures.append(package)
# if critical_failures:
# logging.warning(f"设备 {device_id}:以下包的关键权限 {critical_permission} 授予失败: {', '.join(critical_failures)}")
# logging.warning("这可能会影响某些自动化功能,但基础测试通常不受影响")
# # 根据require_all参数返回结果
# if require_all:
# # 要求所有权限都成功
# if critical_failures:
# logging.error("关键权限授予失败无法继续require_all=True")
# return False
# return success_count == total_attempted
# else:
# # 不要求所有权限只要设备连接正常就返回True
# logging.info(f"设备 {device_id}权限授予过程完成建议重启设备或Appium服务使更改生效")
# return True
def grant_appium_permissions(device_id: str, require_all: bool = False) -> bool:
"""
为 Appium UiAutomator2 服务授予权限
:param device_id: 设备 ID
:param require_all: 是否要求所有权限都成功授予
:return: 权限授予是否成功根据require_all参数判断
修复版:为 Appium 授予权限(使用正确的方法)
"""
# 首先检查设备连接
if not check_device_connection(device_id):
return False
logging.info(f"设备 {device_id}开始设置Appium权限")
packages_to_grant = [
"io.appium.settings",
"io.appium.uiautomator2.server",
"io.appium.uiautomator2.server.test"
]
# 权限列表(按优先级排序)
permissions_to_grant = [
"android.permission.WRITE_SECURE_SETTINGS",
"android.permission.CHANGE_CONFIGURATION",
"android.permission.DUMP",
# 1. 使用系统设置命令替代原来的pm grant尝试
logging.info("使用系统设置命令...")
system_commands = [
["adb", "-s", device_id, "shell", "settings", "put", "global", "window_animation_scale", "0"],
["adb", "-s", device_id, "shell", "settings", "put", "global", "transition_animation_scale", "0"],
["adb", "-s", device_id, "shell", "settings", "put", "global", "animator_duration_scale", "0"],
["adb", "-s", device_id, "shell", "settings", "put", "system", "screen_off_timeout", "86400000"],
]
success_count = 0
total_attempted = 0
package_results = {}
# 检查并授予权限
for package in packages_to_grant:
package_results[package] = {"installed": False, "permissions": {}}
if not is_package_installed(device_id, package):
logging.warning(f"设备 {device_id}:包 {package} 未安装,跳过权限授予")
package_results[package]["installed"] = False
continue
package_results[package]["installed"] = True
package_success = 0
package_attempted = 0
for permission in permissions_to_grant:
total_attempted += 1
package_attempted += 1
result = grant_single_permission(device_id, package, permission)
package_results[package]["permissions"][permission] = result
if result:
for cmd in system_commands:
try:
result = subprocess.run(cmd, capture_output=True, text=True, timeout=10)
if result.returncode == 0:
success_count += 1
package_success += 1
# 记录每个包的授权结果
logging.info(f"设备 {device_id}:包 {package} 权限授予结果: {package_success}/{package_attempted}")
logging.info(f" 成功: {' '.join(cmd[3:])}")
else:
logging.warning(f" 失败: {' '.join(cmd[3:])}")
except:
logging.warning(f" 异常: {' '.join(cmd[3:])}")
# 统计和报告
logging.info(f"设备 {device_id}:权限授予完成")
logging.info(f"总计: 尝试 {total_attempted} 次,成功 {success_count}")
# 2. 授予可自动授予的权限
logging.info("授予基础权限...")
grantable = [
"android.permission.INTERNET",
"android.permission.ACCESS_NETWORK_STATE",
"android.permission.ACCESS_WIFI_STATE",
]
# 检查每个包的关键权限
critical_permission = "android.permission.WRITE_SECURE_SETTINGS"
critical_failures = []
for perm in grantable:
cmd = ["adb", "-s", device_id, "shell", "pm", "grant", "io.appium.settings", perm]
result = subprocess.run(cmd, capture_output=True, text=True, timeout=10)
if result.returncode == 0:
success_count += 1
logging.info(f" 成功授予: {perm.split('.')[-1]}")
else:
logging.debug(f" 跳过: {perm.split('.')[-1]}")
for package, info in package_results.items():
if info["installed"] and critical_permission in info["permissions"]:
if not info["permissions"][critical_permission]:
critical_failures.append(package)
# 3. 返回结果
logging.info(f"设置完成,成功项数: {success_count}")
if critical_failures:
logging.warning(f"设备 {device_id}:以下包的关键权限 {critical_permission} 授予失败: {', '.join(critical_failures)}")
logging.warning("这可能会影响某些自动化功能,但基础测试通常不受影响")
# 根据require_all参数返回结果
if require_all:
# 要求所有权限都成功
if critical_failures:
logging.error("关键权限授予失败无法继续require_all=True")
return False
return success_count == total_attempted
return success_count == (len(system_commands) + len(grantable))
else:
# 不要求所有权限,只要设备连接正常就返回True
logging.info(f"设备 {device_id}权限授予过程完成建议重启设备或Appium服务使更改生效")
return True
return success_count > 0 # 只要有成功项就返回True
def check_appium_compatibility(device_id: str) -> dict:
"""
检查Appium兼容性
@@ -217,6 +271,8 @@ def check_appium_compatibility(device_id: str) -> dict:
logging.error(f"检查兼容性时出错: {str(e)}")
return {"device_id": device_id, "error": str(e)}
# 使用示例
if __name__ == "__main__":
# 获取设备ID示例