提交 3102a32a authored 作者: 陈泽健's avatar 陈泽健

refactor(预定系统):

- 更新展厅巡检结尾步骤,增加腾讯会议、讯飞转录以及SMC选项
上级 34f8058a
...@@ -328,4 +328,6 @@ ...@@ -328,4 +328,6 @@
- 删除原函数,避免混淆。 - 删除原函数,避免混淆。
- read_xlsx_data函数优化,调试兰州中石化项目自动化测试。 - read_xlsx_data函数优化,调试兰州中石化项目自动化测试。
97. 2025-07-01: 97. 2025-07-01:
- feat(预定系统): 更新脚本支持多环境配置,新增 JSON 配置文件,支持不同环境的配置,重构代码,实现环境配置的动态加载- 添加命令行参数,允许选择更新环境,优化日志输出,提高错误处理能力。 - feat(预定系统): 更新脚本支持多环境配置,新增 JSON 配置文件,支持不同环境的配置,重构代码,实现环境配置的动态加载- 添加命令行参数,允许选择更新环境,优化日志输出,提高错误处理能力。
\ No newline at end of file 98. 2025-08-20:
- 更新展厅巡检结尾步骤,增加腾讯会议、讯飞转录以及SMC选项。
\ No newline at end of file
...@@ -28,53 +28,53 @@ class ExhibitionMeetingControl: ...@@ -28,53 +28,53 @@ class ExhibitionMeetingControl:
执行测试步骤以自动化测试腾讯会议应用的登录和会议加入流程。 执行测试步骤以自动化测试腾讯会议应用的登录和会议加入流程。
该方法初始化应用驱动,等待应用加载,定位并点击会议按钮,加入会议,并截取会议画面。 该方法初始化应用驱动,等待应用加载,定位并点击会议按钮,加入会议,并截取会议画面。
""" """
app_drive = None # app_drive = None
try: # try:
# 初始化应用驱动,连接到指定的设备和应用 # # 初始化应用驱动,连接到指定的设备和应用
app_drive = app_setup_driver("Android", "5.1.1", "UT-12", "com.ubains.gviewer.develop", # app_drive = app_setup_driver("Android", "5.1.1", "UT-12", "com.ubains.gviewer.develop",
"com.ubains.gviewer.activity.SplashActivity", "192.168.5.142:5555") # "com.ubains.gviewer.activity.SplashActivity", "192.168.5.142:5555")
app_drive.implicitly_wait(60) # 设置缺省等待时间 # app_drive.implicitly_wait(60) # 设置缺省等待时间
logging.info("等待登录页加载...") # logging.info("等待登录页加载...")
sleep(20) # sleep(20)
#
# 点击左上角logo进入后台 # # 点击左上角logo进入后台
enter_back_button = app_drive.find_element(AppiumBy.XPATH, # enter_back_button = app_drive.find_element(AppiumBy.XPATH,
"/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.Button[1]") # "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.Button[1]")
logging.info("点击左上角logo进入后台") # logging.info("点击左上角logo进入后台")
enter_back_button.click() # enter_back_button.click()
sleep(10) # sleep(10)
#
# 点击【系统关】按钮 # # 点击【系统关】按钮
system_off_button = app_drive.find_element(AppiumBy.XPATH, # system_off_button = app_drive.find_element(AppiumBy.XPATH,
"/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout[2]/android.widget.Button[9]") # "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout[2]/android.widget.Button[9]")
logging.info("点击【系统关】按钮") # logging.info("点击【系统关】按钮")
system_off_button.click() # system_off_button.click()
sleep(10) # sleep(10)
#
# 点击【主页】按钮 # # 点击【主页】按钮
home_button = app_drive.find_element(AppiumBy.XPATH, # home_button = app_drive.find_element(AppiumBy.XPATH,
"/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout[2]/android.widget.Button[1]") # "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout[2]/android.widget.Button[1]")
logging.info("点击【主页】按钮,返回主页界面") # logging.info("点击【主页】按钮,返回主页界面")
home_button.click() # home_button.click()
sleep(10) # sleep(10)
#
# 点击【离开模式】按钮 # # 点击【离开模式】按钮
quit_button = app_drive.find_element(AppiumBy.XPATH, # quit_button = app_drive.find_element(AppiumBy.XPATH,
"/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout[3]/android.widget.Button[15]") # "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout[3]/android.widget.Button[15]")
logging.info("点击【离开模式】按钮") # logging.info("点击【离开模式】按钮")
quit_button.click() # quit_button.click()
sleep(10) # sleep(10)
#
# 点击【确定】按钮 # # 点击【确定】按钮
safe_click_button = app_drive.find_element(AppiumBy.XPATH, # safe_click_button = app_drive.find_element(AppiumBy.XPATH,
"/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout[4]/android.widget.Button[1]") # "/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.widget.FrameLayout/android.widget.RelativeLayout[4]/android.widget.Button[1]")
logging.info("点击【确定】按钮,展厅会议室环境设备已断电。") # logging.info("点击【确定】按钮,展厅会议室环境设备已断电。")
safe_click_button.click() # safe_click_button.click()
sleep(10) # sleep(10)
#
except Exception as e: # except Exception as e:
# 捕获并记录任何发生的错误 # # 捕获并记录任何发生的错误
logging.error(f"发生错误: {e}", exc_info=True) # logging.error(f"发生错误: {e}", exc_info=True)
# 补充预定系统会议创建 # 补充预定系统会议创建
# 初始化通知文本为空字符串 # 初始化通知文本为空字符串
...@@ -102,20 +102,22 @@ class ExhibitionMeetingControl: ...@@ -102,20 +102,22 @@ class ExhibitionMeetingControl:
# 在会议预定第一步界面进行数据填入 # 在会议预定第一步界面进行数据填入
STEP(3, "会议第一步数据填写") STEP(3, "会议第一步数据填写")
INFO( INFO(
f"输入会议名称:{message_name},选择会议类型:视讯融合会议,选择预约类型:{book_type}") f"输入会议名称:{message_name},选择会议类型:视讯融合会议,SMC3.0视频会议,腾讯会议,选择预约类型:{book_type}")
# 输入会议名称 # 输入会议名称
safe_send_keys((By.XPATH, "//input[@placeholder='请输入会议名称']"), message_name, wd) safe_send_keys((By.XPATH, "//input[@placeholder='请输入会议名称']"), message_name, wd)
# 判断会议类型 # 判断会议类型
safe_click((By.XPATH,
"//div[@class='reserve_input']//span[@class='el-checkbox__label'][normalize-space()='SMC3.0视频会议']"),
wd)
safe_click((By.XPATH, safe_click((By.XPATH,
f"//div[@class='reserve_input']//span[@class='el-checkbox__label'][normalize-space()='讯飞语音转录']"), f"//div[@class='reserve_input']//span[@class='el-checkbox__label'][normalize-space()='讯飞语音转录']"),
wd) wd)
safe_click((By.XPATH,
f"//div[@class='reserve_input']//span[@class='el-checkbox__label'][normalize-space()='腾讯会议']"),
wd)
sleep(2) sleep(2)
# 选择普通会议
safe_click((By.XPATH, f"//span[contains(text(),'{book_type}')]"), wd)
sleep(1)
# 选择签到时间 # 选择签到时间
INFO("选择提前30分钟开始签到") INFO("选择提前30分钟开始签到")
safe_click((By.XPATH, "(//span[@class='el-switch__core'])[2]"), wd) safe_click((By.XPATH, "(//span[@class='el-switch__core'])[2]"), wd)
...@@ -127,6 +129,9 @@ class ExhibitionMeetingControl: ...@@ -127,6 +129,9 @@ class ExhibitionMeetingControl:
current_time = get_current_time_formatted() current_time = get_current_time_formatted()
INFO(f"获取当前的时间{current_time}") INFO(f"获取当前的时间{current_time}")
safe_click((By.XPATH, f"//div[normalize-space()='{current_time}']"), wd) safe_click((By.XPATH, f"//div[normalize-space()='{current_time}']"), wd)
sleep(2)
# 选择会议结束时间
safe_click((By.XPATH, "//div[normalize-space()='09:00']"), wd)
sleep(1) sleep(1)
# 在会议预定第二步界面进行数据填入 # 在会议预定第二步界面进行数据填入
......
...@@ -49,103 +49,28 @@ class Login: ...@@ -49,103 +49,28 @@ class Login:
safe_send_keys((locator_type, locator_value), element_value, wd) safe_send_keys((locator_type, locator_value), element_value, wd)
sleep(1) sleep(1)
elif element_type == 'click': elif element_type == "click":
INFO("点击【登录】按钮")
safe_click((locator_type, locator_value), wd) safe_click((locator_type, locator_value), wd)
sleep(2) sleep(2)
if "成功" in expected_result: SELENIUM_LOG_SCREEN(wd, "75")
# 获取登录成功提示信息
notify_text = elment_get_text((By.CSS_SELECTOR, "div[class='meeting_t'] span:nth-child(1)"), wd)
# 截屏并记录日志
SELENIUM_LOG_SCREEN(wd, '50%', 'Login', 'Login_Pwd', "检查登录成功提示信息")
# 记录提示信息
INFO(f"Alert text: {notify_text}")
CHECK_POINT('检查是否出现提示弹窗', "欢迎" in notify_text)
# 检查提示信息是否包含“欢迎”
# if CHECK_POINT('检查是否出现提示弹窗', "欢迎" in notify_text):
# # 如果提示信息不正确,记录为失败
# write_xlsx_data(
# xlsx_file_path,
# "登录页面",
# name,
# f"失败,提示{notify_text}",
# r"D:\GithubData\自动化\ubains-module-test\预定系统\reports\imgs\Login\Login_Pwd\检查登录成功提示信息.png"
# )
# else:
# # 如果提示信息正确,记录为成功
# write_xlsx_data(
# xlsx_file_path,
# "登录页面",
# name,
# f"成功,正确提示:{notify_text}",
# r"D:\GithubData\自动化\ubains-module-test\预定系统\reports\imgs\Login\Login_Pwd\检查登录成功提示信息.png"
# )
# 点击退出登录按钮
safe_click((By.XPATH, "//img[@title='退出登录']"), wd)
sleep(2)
elif "错误" in expected_result: elif element_type == "login":
# 获取登录错误提示信息 # 退出系统登录
notify_text = get_notify_text( safe_click((By.XPATH, "//div[@class='quit']"), wd)
wd, sleep(2)
(By.XPATH, "//p[@class='el-message__content']"), INFO(f"开始登录,账号为:{element_value[0]},密码为:{element_value[1]}")
'Login', user_login(element_value[0],element_value[1])
'Login_Pwd', sleep(2)
f"检查{expected_result}登录的提示信息"
) elif element_type == "getTips":
# 记录获取到的结果 notify_text = get_notify_text(wd, (locator_type, locator_value))
INFO(f"获取到的结果:{notify_text}") INFO(f"获取到的提示信息为:{notify_text}")
CHECK_POINT('检查是否出现提示弹窗', expected_result in notify_text) sleep(2)
# 检查提示信息是否包含预期的错误信息 CHECK_POINT(f"获取到的提示信息为:{notify_text}", expected_result in notify_text)
# if CHECK_POINT('检查是否出现提示弹窗', expected_result in notify_text): SELENIUM_LOG_SCREEN(wd, "75")
# # 如果提示信息不正确,记录为失败
# write_xlsx_data(
# xlsx_file_path,
# "登录页面",
# name,
# f"失败,提示:{notify_text}",
# r"D:\GithubData\自动化\ubains-module-test\预定系统\reports\imgs\Login\Login_Pwd\检查登录成功提示信息.png"
# )
# else:
# # 如果提示信息正确,记录为成功
# write_xlsx_data(
# xlsx_file_path,
# "登录页面",
# name,
# f"成功,正确提示:{notify_text}",
# r"D:\GithubData\自动化\ubains-module-test\预定系统\reports\imgs\Login\Login_Pwd\检查登录成功提示信息.png"
# )
sleep(2)
elif "请输入" in expected_result: elif element_type == "getText":
# 获取登录提示信息 text = elment_get_text((locator_type, locator_value), wd)
notify_text = get_notify_text( INFO(f"获取到的文本信息为:{text}")
wd, CHECK_POINT(f"获取到的文本信息为:{text}", expected_result in text)
(By.XPATH, "//p[@class='el-message__content']"), SELENIUM_LOG_SCREEN(wd, "75")
'Login', \ No newline at end of file
'Login_Pwd',
f"检查{expected_result}登录的提示信息"
)
# 记录获取到的结果
INFO(f"获取到的结果:{notify_text}")
CHECK_POINT('检查是否出现提示弹窗', expected_result in notify_text)
# 检查提示信息是否包含预期的提示信息
# if CHECK_POINT('检查是否出现提示弹窗', expected_result in notify_text):
# # 如果提示信息不正确,记录为失败
# write_xlsx_data(
# xlsx_file_path,
# "登录页面",
# name,
# f"失败,提示:{notify_text}",
# r"D:\GithubData\自动化\ubains-module-test\预定系统\reports\imgs\Login\Login_Pwd\检查登录成功提示信息.png"
# )
# else:
# # 如果提示信息正确,记录为成功
# write_xlsx_data(
# xlsx_file_path,
# "登录页面",
# name,
# f"成功,正确提示:{notify_text}",
# r"D:\GithubData\自动化\ubains-module-test\预定系统\reports\imgs\Login\Login_Pwd\检查登录成功提示信息.png"
# )
sleep(2)
\ No newline at end of file
...@@ -3,7 +3,7 @@ import os ...@@ -3,7 +3,7 @@ import os
from hytest import * from hytest import *
# 获取 Base 目录的绝对路径,并加入 sys.path # 获取 Base 目录的绝对路径,并加入 sys.path
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..', '..' , '..'))) sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..', '..')))
from 预定系统.Base.base import * from 预定系统.Base.base import *
def suite_setup(): def suite_setup():
......
...@@ -2,14 +2,14 @@ import sys ...@@ -2,14 +2,14 @@ import sys
import os import os
# 获取 Base 目录的绝对路径,并加入 sys.path # 获取 Base 目录的绝对路径,并加入 sys.path
sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..', '..' , '..'))) sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..', '..', '..', '..')))
from 预定系统.Base.base import * from 预定系统.Base.base import *
# 构建XLSX文件的绝对路径 # 构建XLSX文件的绝对路径
# 获取当前脚本所在的目录
current_dir = os.path.dirname(os.path.abspath(__file__)) current_dir = os.path.dirname(os.path.abspath(__file__))
xlsx_file_path = os.path.join(current_dir, '..', '..', '..', '..', '测试数据', '会议预定测试用例.xlsx') # 获取当前脚本所在的目录
# xlsx_file_path = os.path.join(预定系统_path, '测试数据', '长安大学测试用例.xlsx') xlsx_file_path = os.path.join(current_dir, '..', '..', '..', '测试数据', '会议预定测试用例.xlsx')
# xlsx_file_path = os.path.join(预定系统_path, '测试数据', '兰州中石化项目测试用例.xlsx')
class ChangAnMessageApproval: class ChangAnMessageApproval:
tags = ['长安大学取消审批测试'] tags = ['长安大学取消审批测试']
......
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论