1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
from datetime import datetime, timedelta
from time import sleep
import sys
import os
# 获取当前脚本的绝对路径
current_dir = os.path.dirname(os.path.abspath(__file__))
# 构建预定系统的绝对路径
预定系统_path = os.path.abspath(os.path.join(current_dir, '..','..','..'))
# 添加路径
sys.path.append(预定系统_path)
# 导入模块
from 预定系统.Base.base import *
# 获取当前脚本所在的目录
current_dir = os.path.dirname(os.path.abspath(__file__))
# 构建CSV文件的绝对路径
csv_file_path = os.path.join(current_dir, '../../测试数据/会议审批/会议审批操作.csv')
# 定义时间格式
time_format = "%H:%M"
class MeetingApproval_Status_000x:
tags = ['会议审批功能','预定系统功能']
"""
执行指令:
1.cd 预定系统
2.hytest --report_title 审批会议预约测试报告 --test 审批会议预约_0**
"""
ddt_cases = read_csv_data(csv_file_path)
def teststeps(self):
"""
执行测试步骤以会议室删除功能。
本函数根据参数输入会议室名称进行搜索并删除会议室,并检查删除后的提示信息是否与预期相符。
字段含义:
name:用例名称
conference_name:会议室名称
message_name:会议名称
book_start_time:会议开始时间
book_end_time:会议结束时间
check_text:检查提示文本
"""
# 初始化通知文本为空字符串
notify_text = ""
# 从全局存储中获取webdriver实例
wd = GSTORE['wd']
name = self.name
conference_name, message_name, book_start_time, book_end_time, approval_type, approval_opinion, check_text = self.para
# 在会议室列表搜索会议室
STEP(1, f"在会议室列表搜索:{conference_name}")
# 展开筛选下拉框
safe_click((By.XPATH, "//i[@class='el-collapse-item__arrow el-icon-arrow-right']"), wd)
sleep(1)
# 输入会议室名称,并点击【查询】按钮
safe_send_keys((By.XPATH, "//input[@placeholder='请输入会议室名称']"), conference_name, wd)
safe_click((By.XPATH, "//button[@type='button']//span[contains(text(),'查询')]"), wd)
sleep(1)
INFO("检查搜索结果")
# 获取搜索出的会议室名称
notify_text = elment_get_text((By.XPATH, "//span[@class='MeetingCityList_name']"), wd)
INFO(f"搜索结果为:{notify_text}")
CHECK_POINT("搜索结果是否正确", conference_name in notify_text)
# 点击【会议预定】按钮,进入会议预定界面
STEP(2, "点击【会议预定】按钮")
safe_click((By.XPATH, "//span[@class='MeetingCityList_t_btn']"), wd)
sleep(1)
INFO("检查页面标题是否正确")
# 获取页面标题
notify_text = elment_get_text((By.XPATH, "//div[@class='reserve_Title']"), wd)
INFO(f"页面标题为:{notify_text}")
CHECK_POINT("页面标题是否正确", "会议预定" in notify_text)
sleep(1)
# 在会议预定第一步界面进行数据填入
STEP(3, "会议第一步数据填写")
INFO(
f"输入会议名称:{message_name},选择会议开始时间:{book_start_time},选择会议结束时间:{book_end_time}")
# 输入会议名称
safe_send_keys((By.XPATH, "//input[@placeholder='请输入会议名称']"), message_name, wd)
# 将字符串转换为时间对象
start_time = datetime.strptime(book_start_time, time_format)
end_time = datetime.strptime(book_end_time, time_format)
# 如果需要将时间差转换为分钟数
time_diff_minutes = (end_time - start_time).total_seconds() / 60
INFO(f"时间差为:time_diff_minutes")
# 判断如果开始时间与结束时间相等,则不重复点击
if book_start_time == book_end_time:
INFO(f"开始时间与结束时间相等,选择时间块:{book_start_time}")
# 根据开始时间选择对应时间块,时间格式为:**:**
safe_click((By.XPATH, f"(//div[normalize-space()='{book_start_time}'])[1]"), wd)
elif book_start_time != book_end_time:
INFO(f"开始时间与结束时间不相等,选择时间块:{book_start_time},{book_end_time}")
# 根据开始时间选择对应时间块,时间格式为:**:**
safe_click((By.XPATH, f"(//div[normalize-space()='{book_start_time}'])[1]"), wd)
# 根据结束时间选择对应时间块,时间格式为:**:**
safe_click((By.XPATH, f"(//div[normalize-space()='{book_end_time}'])[1]"), wd)
sleep(2)
# 判断时间差是否大于最大预约时长1小时,即60分钟
if time_diff_minutes > 60:
INFO(f"时间差大于最大预约时长1小时,选择【超出预约时长】")
notify_text = get_notify_text(wd, (By.XPATH, "//p[contains(@class,'el-message__content')]"),
"Meeting_Approval", "Approval_Option", f"{name}_超出预约时长")
INFO(f"提示信息为:{notify_text}")
CHECK_POINT("超出预约时长提示是否正确", "最大预定时间 1 小时" in notify_text)
sleep(2)
# 不选时间点击【下一步】查看提示信息
INFO("不选时间点击【下一步】查看提示信息")
safe_click((By.XPATH, "//div[contains(text(),'下一步')]"), wd)
sleep(1)
notify_text = get_notify_text(wd, (By.XPATH, "//p[contains(@class,'el-message__content')]"),
"Meeting_Approval", "Approval_Option", f"{name}请选择会议时间提示信息")
INFO(f"提示信息为:{notify_text}")
CHECK_POINT("未选时间提示是否正确", "请选择会议时间" in notify_text)
sleep(1)
# 重新选择时间,将字符串转换为时间对象
time_obj = datetime.strptime(book_end_time, time_format)
time_obj_minus_5_minutes = time_obj - timedelta(minutes=30)
# 将时间对象转换回字符串
book_end_time = time_obj_minus_5_minutes.strftime(time_format)
INFO(f"重新选择结束时间为:{book_end_time}")
# 根据开始时间选择对应时间块,时间格式为:**:**
safe_click((By.XPATH, f"(//div[normalize-space()='{book_start_time}'])[1]"), wd)
# 根据结束时间选择对应时间块,时间格式为:**:**
safe_click((By.XPATH, f"(//div[normalize-space()='{book_end_time}'])[1]"), wd)
sleep(2)
STEP(4, "点击【快速预约】按钮")
safe_click((By.XPATH, "//div[@class='header_Quick']"), wd)
sleep(4)
safe_click((By.XPATH, "//button[@type='button']//span[contains(text(),'预定')]"), wd)
sleep(2)
notify_text = get_notify_text(wd, (By.XPATH, "//p[contains(@class,'el-message__content')]"),
"Meeting_Approval", "Approval_Option", f"{name}预定成功提示信息")
INFO(f"预定成功提示信息为:{notify_text}")
CHECK_POINT("预定成功提示是否正确", notify_text == check_text)
STEP(5,"检查审批会议是否创建成功")
# 进入会议审批模块
safe_click((By.XPATH, "//span[contains(text(),'会议审批')]"), wd)
sleep(2)
# 查询会议
safe_send_keys((By.XPATH, "//input[@placeholder='请输入会议名称搜索']"), message_name, wd)
send_keyboard((By.XPATH, "//input[@placeholder='请输入会议名称搜索']"), wd)
sleep(2)
# 获取审批会议名称
notify_text = elment_get_text((By.CSS_SELECTOR, "body > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1) > div:nth-child(3) > div:nth-child(2) > div:nth-child(1) > div:nth-child(1) > div:nth-child(3) > table:nth-child(1) > tbody:nth-child(2) > tr:nth-child(1) > td:nth-child(2) > div:nth-child(1)"), wd)
INFO(f"审批会议名称为:{notify_text}")
SELENIUM_LOG_SCREEN(wd, "50%", "Meeting_Approval", "Approval_Option", f"{name}_审批会议名称")
CHECK_POINT("审批会议名称是否正确", notify_text == message_name)
STEP(5, "登录审批人账号,查看是否存在需审批会议")
safe_click((By.XPATH,"//img[@title='退出登录']"),wd)
sleep(2)
# 登录审批人的账号
admin_login("admin@ZDH","Ubains@4321")
sleep(2)
# 进入会议审批模块
safe_click((By.XPATH,"//ul[@class='meeting_list']//span[contains(text(),'会议审批')]"),wd)
sleep(2)
# 查询会议
safe_send_keys((By.XPATH, "//input[@placeholder='请输入会议名称搜索']"), message_name, wd)
send_keyboard((By.XPATH, "//input[@placeholder='请输入会议名称搜索']"), wd)
sleep(2)
# 查看会议详细信息
safe_click((By.XPATH, "//button[@type='button']//span[contains(text(),'详细信息')]"),wd)
sleep(2)
SELENIUM_LOG_SCREEN(wd, "50%", "Meeting_Approval", "Approval_Option", f"{name}_审批会议信息")
safe_click((By.XPATH, "//div[@aria-label='详细信息']//span[contains(text(),'确定')]"), wd)
# 点击【审批】按钮
safe_click((By.XPATH, "//button[@type='button']//span[contains(text(),'审批')]"), wd)
sleep(1)
if approval_type == '通过':
STEP(6, "审批通过")
# 审批通过
safe_send_keys((By.XPATH, "//textarea[@placeholder='请输入审批意见']"), approval_opinion, wd)
sleep(1)
# 点击【同意】按钮
safe_click((By.XPATH, "//span[contains(text(),'同意')]"), wd)
sleep(2)
# 获取审批结果
notify_text = get_notify_text(wd, (By.XPATH, "//p[contains(@class,'el-message__content')]"),
"Meeting_Approval", "Approval_Option", f"{name}审批通过提示信息")
CHECK_POINT("审批通过提示是否正确", notify_text == "审批完成!")
INFO(f"审批结果为:{notify_text}")
else:
STEP(6, "审批不通过")
# 审批不通过,不输入审批意见
safe_click((By.XPATH, "//span[contains(text(),'驳回')]"), wd)
sleep(1)
notify_text = get_notify_text(wd, (By.XPATH, "//p[contains(@class,'el-message__content')]"),
"Meeting_Approval", "Approval_Option", f"{name}审批意见为空提示信息")
INFO(f"审批结果为:{notify_text}")
CHECK_POINT("审批意见为空提示是否正确", notify_text == "请输入审批意见")
sleep(2)
# 审批不通过,输入审批意见
safe_send_keys((By.XPATH, "//textarea[@placeholder='请输入审批意见']"), approval_opinion, wd)
sleep(1)
# 点击【驳回】按钮
safe_click((By.XPATH, "//span[contains(text(),'驳回')]"), wd)
sleep(2)
# 获取审批结果
notify_text = get_notify_text(wd, (By.XPATH, "//p[contains(@class,'el-message__content')]"),
"Meeting_Approval", "Approval_Option", f"{name}审批不通过提示信息")
INFO(f"审批结果为:{notify_text}")
CHECK_POINT("审批不通过提示是否正确", notify_text == "审批完成!")
STEP(7, "在我已审批模块查看是否存在审批操作后的会议数据")
safe_click((By.XPATH, "//div[@id='tab-third']"), wd)
sleep(1)
# 查询会议
safe_send_keys((By.XPATH, "//input[@placeholder='请输入会议名称搜索']"), message_name, wd)
send_keyboard((By.XPATH, "//input[@placeholder='请输入会议名称搜索']"), wd)
sleep(2)
# 查看审批会议的名称
notify_text = elment_get_text((By.CSS_SELECTOR, "body > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1) > div:nth-child(3) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1) > div:nth-child(3) > table:nth-child(1) > tbody:nth-child(2) > tr:nth-child(1) > td:nth-child(2) > div:nth-child(1)"), wd)
INFO(f"审批会议名称为:{notify_text}")
CHECK_POINT("审批会议名称是否正确", notify_text == message_name)
# 查看审批会议的状态
notify_text = elment_get_text((By.CSS_SELECTOR, "body > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1) > div:nth-child(3) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1) > div:nth-child(3) > table:nth-child(1) > tbody:nth-child(2) > tr:nth-child(1) > td:nth-child(7) > div:nth-child(1) > span:nth-child(1)"),wd)
INFO(f"审批会议状态为:{notify_text}")
CHECK_POINT("审批会议状态是否正确", notify_text == approval_type)
SELENIUM_LOG_SCREEN(wd, "50%", "Meeting_Approval", "Approval_Option", f"{name}_审批会议名称")
if approval_type == '通过':
STEP(8, "在抄送我的模块查看是否存在审批通过的会议数据")
safe_click((By.XPATH, "//div[@id='tab-fourth']"), wd)
sleep(1)
# 查询会议
safe_send_keys((By.XPATH, "//input[@placeholder='请输入会议名称搜索']"), message_name, wd)
send_keyboard((By.XPATH, "//input[@placeholder='请输入会议名称搜索']"), wd)
sleep(2)
# 查看审批抄送的会议名称
notify_text = elment_get_text((By.CSS_SELECTOR,
"body > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1) > div:nth-child(3) > div:nth-child(2) > div:nth-child(4) > div:nth-child(1) > div:nth-child(3) > table:nth-child(1) > tbody:nth-child(2) > tr:nth-child(1) > td:nth-child(2) > div:nth-child(1)"),
wd)
INFO(f"审批抄送的会议名称为:{notify_text}")
CHECK_POINT("审批抄送的会议名称是否正确", notify_text == message_name)
# 查看审批抄送会议的详细信息
safe_click((By.CSS_SELECTOR, "body > div:nth-child(1) > div:nth-child(1) > div:nth-child(2) > div:nth-child(3) > div:nth-child(1) > div:nth-child(3) > div:nth-child(2) > div:nth-child(4) > div:nth-child(1) > div:nth-child(3) > table:nth-child(1) > tbody:nth-child(2) > tr:nth-child(1) > td:nth-child(7) > div:nth-child(1) > button:nth-child(1) > span:nth-child(1)")
,wd)
SELENIUM_LOG_SCREEN(wd, "50%", "Meeting_Approval", "Approval_Option", f"{name}_审批抄送的会议详情")
if name == '审批会议操作_001':
# 退出当前账号,返回至普通用户账号
INFO("退出当前账号,返回至普通用户账号")
safe_click((By.XPATH, "//img[contains(@title,'退出登录')]"), wd)
admin_login("admin@user", "Ubains@4321")