多设备启动,端口固定,时间接口未返回
This commit is contained in:
196
permissions.py
196
permissions.py
@@ -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(示例)
|
||||
|
||||
Reference in New Issue
Block a user