提交 91f02204 authored 作者: 陈泽健's avatar 陈泽健

处理展厅巡检预定系统创建会议因议题文件上传的路径错误导致的异常问题,优化app_init和app_quit的代码,补充adb路径配置,增加对应异常的日志打印。

上级 e88a9b54
/预定系统/reports/
/预定系统/log/
/日志监测/error_log/
/预定配套件/中控门口屏/reports/
/预定配套件/中控门口屏/log/
\ No newline at end of file
......@@ -751,57 +751,196 @@ def command_centre_control(rtsp_url, app_drive, wd):
# app设备初始化adb连接函数
import subprocess
from venv import logger
def app_init(device_ip, port=5555):
"""
初始化浏览器设置和实例。
此函数旨在初始化程序与app设备之间的adb连接,判断adb连接状态是否可控
def app_init(device_ip, port=5555, adb_path=r"C:\Program Files\androidsdk\androidsdk\platform-tools\adb.exe"):
"""
# 标记初始化过程的开始
INFO("'----------' 正在初始化ADB连接 '----------'")
初始化 ADB 连接并检查设备状态
参数:
- device_ip: 设备 IP 地址
- port: ADB 端口号,默认 5555
- adb_path: ADB 工具的可执行文件完整路径(可选)
例如: r"C:\platform-tools\adb.exe"
如果不提供,则默认使用系统PATH中的adb
返回:
- True: 连接成功且设备可用
- False: 连接失败或设备不可用
"""
通过 ADB 连接设备并检查设备状态
:param device_ip: 设备的 IP 地址
:param port: 端口号,默认为 5555
"""
# 标记初始化过程
INFO("---------- ADB 连接初始化开始 ----------")
INFO(f"目标设备: {device_ip}:{port}")
INFO(f"使用ADB路径: {adb_path if adb_path else '系统PATH'}")
try:
# 构建设备地址
device_address = f"{device_ip}:{port}"
# 连接设备
subprocess.run(['adb', 'connect', device_address], check=True)
INFO(f"尝试连接到设备: {device_address}")
# 检查设备状态
result = subprocess.run(['adb', 'devices'], capture_output=True, text=True, check=True)
devices = result.stdout.strip().split('\n')[1:] # 去掉标题行
# 确定adb命令
adb_cmd = [adb_path] if adb_path else ['adb']
# 1. 验证ADB可用性
try:
version_result = subprocess.run(
[*adb_cmd, '--version'],
capture_output=True,
text=True,
check=True
)
logging.debug(f"ADB版本信息:\n{version_result.stdout}")
except Exception as e:
logging.error(f"ADB验证失败,请检查路径是否正确: {e}")
if not adb_path:
logging.error("建议:请通过adb_path参数指定完整的adb.exe路径")
return False
# 2. 尝试连接设备
INFO(f"尝试 ADB 连接到设备: {device_address}")
connect_result = subprocess.run(
[*adb_cmd, 'connect', device_address],
capture_output=True,
text=True,
check=False # 改为不抛出异常,手动处理
)
INFO(f"ADB连接命令返回码: {connect_result.returncode}")
INFO(f"ADB连接命令输出: {connect_result.stdout.strip()}")
if connect_result.stderr.strip():
logging.warning(f"ADB连接错误输出: {connect_result.stderr.strip()}")
# 3. 检查设备状态
INFO("获取设备列表验证连接状态...")
devices_result = subprocess.run(
[*adb_cmd, 'devices'],
capture_output=True,
text=True,
check=True
)
logging.debug(f"完整 adb devices 输出:\n{devices_result.stdout}")
# 解析设备列表
devices = devices_result.stdout.strip().split('\n')[1:] # 去掉标题行
INFO(f"找到 {len(devices)} 个设备")
for device in devices:
ip, status = device.split()
if ip == device_address and status == 'device':
INFO(f"设备 {device_address} 已连接并可用")
return True
elif ip == device_address and status == 'offline':
INFO(f"设备 {device_address} 处于 offline 状态,当前设备不可控制,请检查设备网络状态")
return False
elif ip == device_address and status == 'unauthorized':
logger.error(f"设备 {device_address} 未授权调试")
return False
INFO(f"设备 {device_address} 未找到,请检查设备IP是否正确!")
if not device.strip():
continue
try:
parts = device.split()
if len(parts) >= 2: # 处理可能存在的额外列
ip, status = parts[0], parts[1]
else:
logging.warning(f"设备信息格式异常: {device}")
continue
INFO(f"检测到设备: IP={ip}, 状态={status}")
if ip == device_address:
if status == 'device':
INFO(f"设备 {device_address} 已连接并可用")
return True
elif status == 'offline':
logging.warning(f"设备 {device_address} 处于离线状态,请检查:")
logging.warning("1. 设备网络连接")
logging.warning("2. 设备是否开启ADB调试")
logging.warning("3. 防火墙是否阻止了5555端口")
return False
elif status == 'unauthorized':
logging.error(f"设备 {device_address} 未授权调试:")
logging.error("请在设备上检查并允许USB调试授权提示")
return False
else:
logging.warning(f"设备 {device_address} 处于未知状态: {status}")
return False
except Exception as e:
logging.warning(f"设备信息解析失败: {device}, 错误: {e}")
# 未找到目标设备
logging.error(f"设备 {device_address} 未在设备列表中找到,可能原因:")
logging.error("1. 设备IP地址不正确")
logging.error("2. 设备未开启网络ADB调试")
logging.error("3. 设备未与测试机在同一网络")
logging.error("4. 防火墙阻止了连接")
return False
except subprocess.CalledProcessError as e:
INFO(f"连接设备失败: {e}")
logging.error(f"ADB命令执行失败:")
logging.error(f"命令: {' '.join(e.cmd)}")
logging.error(f"返回码: {e.returncode}")
logging.error(f"错误输出: {e.stderr.strip()}")
return False
except Exception as e:
logging.error(f"发生未知错误: {str(e)}", exc_info=True)
return False
# if __name__ == '__main__':
# # 使用示例:
# device_ip = '192.168.5.156'
#
# # 方式1:使用系统PATH中的adb
# # app_init(device_ip)
#
# # 方式2:指定adb路径
# app_init(
# device_ip,
# )
# app设备退出adb连接函数
def app_quit(device_ip,port=5555):
def app_quit(device_ip, port=5555, adb_path=r"C:\Program Files\androidsdk\androidsdk\platform-tools\adb.exe"):
"""
退出浏览器并释放资源。
断开 ADB 连接并释放资源
该函数从全局存储中获取设备adb连接状态
参数:
- device_ip: 设备 IP 地址
- port: ADB 端口号,默认 5555
- adb_path: ADB 工具的可执行文件完整路径(可选)
例如: r"C:\platform-tools\adb.exe"
如果不提供,则默认使用系统PATH中的adb
"""
# 断开特定 IP 和端口的 ADB 连接
device_address = f"{device_ip}:{port}"
subprocess.run(['adb', 'disconnect', device_address])
INFO(f"ADB 连接已断开: {device_address}")
try:
# 标记断开过程
INFO("---------- ADB 连接断开开始 ----------")
INFO(f"目标设备: {device_ip}:{port}")
INFO(f"使用ADB路径: {adb_path if adb_path else '系统PATH'}")
# 构建设备地址
device_address = f"{device_ip}:{port}"
# 确定adb命令
adb_cmd = [adb_path] if adb_path else ['adb']
# 尝试断开连接
INFO(f"尝试断开 ADB 连接: {device_address}")
disconnect_result = subprocess.run(
[*adb_cmd, 'disconnect', device_address],
capture_output=True,
text=True,
check=False # 避免因断开失败而抛出异常
)
INFO(f"ADB断开命令返回码: {disconnect_result.returncode}")
INFO(f"ADB断开命令输出: {disconnect_result.stdout.strip()}")
if disconnect_result.stderr.strip():
WARN(f"ADB断开错误输出: {disconnect_result.stderr.strip()}")
# 验证是否断开成功
if "disconnected" in disconnect_result.stdout:
INFO(f"ADB 连接已成功断开: {device_address}")
return True
else:
WARN(f"ADB 连接断开失败: {device_address}")
return False
except Exception as e:
ERROR(f"断开ADB连接时发生错误: {str(e)}", exc_info=True)
return False
# app截屏函数
def get_screenshot_with_retry(wd,app_drive, module_name, function_name, step_name, max_retries=3, retry_delay=5):
......
......@@ -78,9 +78,9 @@ def browser_init(login_type):
# 拯救者电脑
# service = Service(r'C:\Users\29194\AppData\Local\Programs\Python\Python310\Scripts\chromedriver.exe')
# EDY电脑
# service = Service(r'C:\Program Files\Python310\Scripts\chromedriver.exe')
service = Service(r'C:\Users\EDY\AppData\Local\Programs\Python\Python310\Scripts\chromedriver.exe')
# 云电脑
service = Service(r'E:\Python\Scripts\chromedriver.exe')
# service = Service(r'E:\Python\Scripts\chromedriver.exe')
# 尝试创建WebDriver实例并执行初始化操作
try:
# 创建WebDriver实例
......@@ -276,11 +276,8 @@ def issue_send_and_upload(wd, issue_num, issue_name):
# 议题文件的路径列表
issue_file_path = [
r"D:\GithubData\自动化\ubains-module-test\预定系统\reports\issue_file\5.164Scan 安全报告.pdf",
r"D:\GithubData\自动化\ubains-module-test\预定系统\reports\issue_file\IdeaTop软件配置&操作说明文档.docx",
r"D:\GithubData\自动化\ubains-module-test\预定系统\reports\issue_file\ideaTop部署配置视频.mp4",
r"D:\GithubData\自动化\ubains-module-test\预定系统\reports\issue_file\IdeaTop软件配置&操作说明文档.docx",
r"D:\GithubData\自动化\ubains-module-test\预定系统\reports\issue_file\议题图片.png"
r"C:\PycharmData\ubains-module-test\预定系统\reports\issue_file\5.164Scan 安全报告.pdf",
r"C:\PycharmData\ubains-module-test\预定系统\reports\issue_file\议题图片.png"
]
# 打印并输入议题名称
......@@ -309,9 +306,10 @@ def issue_send_and_upload(wd, issue_num, issue_name):
sleep(15)
# 截取上传完成后的屏幕日志
SELENIUM_LOG_SCREEN(wd, "50%", "Exhibit_Inspect", "Meeting_Message", "添加议题文件")
sleep(60)
SELENIUM_LOG_SCREEN(wd, "75%", "Exhibit_Inspect", "Meeting_Message", "添加议题文件")
sleep(20)
# 点击【确定】按钮完成上传
logging.info("点击【确定】按钮完成上传")
safe_click((By.XPATH,"//div[@aria-label='会议文件上传']//div[@class='el-dialog__footer']//div//span[contains(text(),'确定')]"),wd)
sleep(2)
......
......@@ -313,4 +313,5 @@
90. 2025-06-05:
- 兰州中石化项目输出角色权限组的部分JSON数据,调试自动化运行。排查展厅自动化失败问题,处理chrome版本升级后,chromedriver版本没对上问题。
91. 2025-06-10:
- 兰州中石化项目输出议题申报流程的JSON数据,调试自动化运行。补充代办事宜模块流程的JSON数据自动化测试。
\ No newline at end of file
- 兰州中石化项目输出议题申报流程的JSON数据,调试自动化运行。补充代办事宜模块流程的JSON数据自动化测试。
- 处理展厅巡检预定系统创建会议因议题文件上传的路径错误导致的异常问题,优化app_init和app_quit的代码,补充adb路径配置,增加对应异常的日志打印。
\ No newline at end of file
......@@ -88,7 +88,7 @@ class Exhibition_hall_inspection:
# 调用函数添加议题
INFO("添加议题文件")
issue_send_and_upload(wd, 5, issue_name)
issue_send_and_upload(wd, 2, issue_name)
sleep(2)
# 选择签到时间
......
......@@ -2,11 +2,11 @@ from 预定系统.Base.app_base import *
import logging
import time
class same_screen_share_000x:
class SameScreenShare:
"""
执行指令:
1.cd 预定系统
2.hytest --report_title 无纸化同屏测试报告 --report_url_prefix http://nat.ubainsyun.com:31133 --tag 无纸化同屏
2.hytest --report_title 无纸化2.0同屏测试报告 --report_url_prefix http://nat.ubainsyun.com:31133 --tag 无纸化2.0同屏
"""
tags = ['无纸化2.0同屏', '展厅巡检', '无纸化2.0测试']
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
This source diff could not be displayed because it is too large. You can view the blob instead.
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论