166 lines
5.9 KiB
Python
166 lines
5.9 KiB
Python
import re
|
||
import time
|
||
|
||
import pytest
|
||
from playwright.async_api import async_playwright
|
||
|
||
from common.base_page_test import BasePageTest
|
||
from common.config import Config
|
||
|
||
|
||
class NoticeManagementTest(BasePageTest):
|
||
"""通知公告管理测试类"""
|
||
|
||
def generate_notice_data(self) -> dict:
|
||
"""生成测试数据"""
|
||
timestamp = int(time.time())
|
||
return {
|
||
'notice_title': f'test_notice_{timestamp}',
|
||
'updated_title': f'updated_notice_{timestamp}',
|
||
}
|
||
|
||
async def create_notice(self, notice_title: str, notice_type: int = 1, notice_content: str = '测试内容') -> None:
|
||
"""创建通知公告"""
|
||
# 点击新增按钮
|
||
await self.page.get_by_role('button', name='新增').first.click()
|
||
|
||
# 等待对话框
|
||
dialog = self.page.get_by_role('dialog')
|
||
await dialog.wait_for()
|
||
|
||
# 填写公告信息
|
||
await dialog.get_by_role('textbox', name='公告标题').fill(notice_title)
|
||
|
||
# 选择公告类型
|
||
# 根据codegen脚本,点击下拉框触发器
|
||
await self.page.locator('div').filter(has_text=re.compile(r'^请选择$')).nth(4).click()
|
||
# 选择对应类型选项,1为通知,2为公告
|
||
if notice_type == 1:
|
||
await self.page.get_by_role('option', name='通知').click()
|
||
else:
|
||
await self.page.get_by_role('option', name='公告').click()
|
||
|
||
# 填写公告内容
|
||
await self.page.locator('.ql-container').click()
|
||
await self.page.locator('.ql-editor').fill(notice_content)
|
||
|
||
# 等待一段时间确保输入完成
|
||
await self.page.wait_for_timeout(500)
|
||
|
||
# 点击确认按钮
|
||
await self.page.get_by_role('button', name='确 定').first.click()
|
||
|
||
# 等待一段时间确保请求发送
|
||
await self.page.wait_for_timeout(1000)
|
||
|
||
# 等待新增成功提示
|
||
await self.wait_for_selector('div:has-text("新增成功")', timeout=10000)
|
||
|
||
async def search_notice(self, notice_title: str) -> None:
|
||
"""搜索通知公告"""
|
||
# 在查询表单中输入公告标题进行查询
|
||
await self.page.get_by_role('textbox', name='公告标题').fill(notice_title)
|
||
|
||
# 点击搜索按钮
|
||
await self.page.get_by_role('button', name='搜索').first.click()
|
||
|
||
# 等待搜索结果加载
|
||
await self.page.wait_for_timeout(1000)
|
||
|
||
async def edit_notice(self, updated_title: str, updated_content: str = '更新的测试内容') -> None:
|
||
"""编辑通知公告"""
|
||
# 点击编辑按钮
|
||
await self.page.locator('tbody').get_by_role('button', name='修改').nth(0).click()
|
||
|
||
# 等待对话框
|
||
dialog = self.page.get_by_role('dialog')
|
||
await dialog.wait_for()
|
||
|
||
# 修改公告标题
|
||
await dialog.get_by_role('textbox', name='公告标题').fill(updated_title)
|
||
|
||
# 修改公告内容
|
||
await self.page.locator('.ql-editor').fill(updated_content)
|
||
|
||
# 点击确认按钮
|
||
await self.page.get_by_role('button', name='确 定').first.click()
|
||
|
||
# 等待编辑成功提示
|
||
await self.wait_for_selector('div:has-text("修改成功")', timeout=10000)
|
||
|
||
async def delete_notice(self) -> None:
|
||
"""删除通知公告"""
|
||
# 点击删除按钮
|
||
await self.page.locator('tbody').get_by_role('button', name='删除').nth(0).click()
|
||
|
||
# 确认删除
|
||
await self.page.get_by_role('button', name='确定').first.click()
|
||
|
||
# 等待删除成功提示
|
||
await self.wait_for_selector('div:has-text("删除成功")', timeout=10000)
|
||
|
||
# 重置查询表单,确保能看到所有公告
|
||
await self.page.get_by_role('button', name='重置').click()
|
||
|
||
# 等待列表刷新
|
||
await self.page.wait_for_timeout(1000)
|
||
|
||
async def test_notice_crud_operations(self) -> None:
|
||
"""测试通知公告的增删查改功能"""
|
||
# 访问通知公告页面
|
||
await self.goto_page(Config.frontend_url + '/system/notice')
|
||
|
||
# 等待页面加载完成
|
||
await self.wait_for_page_title('通知公告', timeout=10000)
|
||
await self.page.wait_for_timeout(1000) # 等待列表刷新
|
||
|
||
# 记录初始公告数量
|
||
initial_notice_count = await self.get_table_total_rows()
|
||
|
||
# 生成测试数据
|
||
data = self.generate_notice_data()
|
||
|
||
# 创建公告
|
||
await self.create_notice(data['notice_title'])
|
||
|
||
# 验证公告已添加到列表中
|
||
await self.page.wait_for_timeout(1000) # 等待列表刷新
|
||
new_notice_count = await self.get_table_total_rows()
|
||
assert new_notice_count > initial_notice_count, '新增公告后数量应该增加'
|
||
|
||
# 搜索公告
|
||
await self.search_notice(data['notice_title'])
|
||
|
||
# 验证搜索结果中包含新增的公告
|
||
search_result_count = await self.get_table_total_rows()
|
||
assert search_result_count >= 1, '搜索结果应该至少包含一个公告'
|
||
|
||
# 编辑公告
|
||
await self.edit_notice(data['updated_title'])
|
||
|
||
# 验证编辑成功
|
||
await self.page.wait_for_timeout(1000) # 等待列表刷新
|
||
|
||
# 重新搜索以验证修改结果
|
||
await self.search_notice(data['updated_title'])
|
||
|
||
# 删除公告
|
||
await self.delete_notice()
|
||
|
||
# 验证公告已从列表中删除
|
||
await self.page.wait_for_timeout(1000) # 等待列表刷新
|
||
final_notice_count = await self.get_table_total_rows()
|
||
assert final_notice_count == initial_notice_count, '删除公告后数量应该恢复到初始值'
|
||
|
||
|
||
@pytest.mark.asyncio
|
||
async def test_notice_management_page() -> None:
|
||
"""测试通知公告页面功能"""
|
||
async with async_playwright() as p:
|
||
test_instance = NoticeManagementTest()
|
||
await test_instance.setup(p)
|
||
try:
|
||
await test_instance.test_notice_crud_operations()
|
||
finally:
|
||
await test_instance.teardown()
|