136 lines
4.7 KiB
Python
136 lines
4.7 KiB
Python
import time
|
||
|
||
import pytest
|
||
from playwright.async_api import async_playwright
|
||
|
||
from common.base_page_test import BasePageTest
|
||
from common.config import Config
|
||
|
||
|
||
class DeptManagementTest(BasePageTest):
|
||
"""部门管理页面测试类"""
|
||
|
||
def generate_dept_data(self) -> dict:
|
||
"""生成测试数据"""
|
||
timestamp = int(time.time())
|
||
return {
|
||
'dept_name': f'测试部门_{timestamp}',
|
||
'order_num': '3',
|
||
'leader_name': '年糕',
|
||
}
|
||
|
||
async def create_dept(self, dept_name: str, order_num: str) -> None:
|
||
"""创建部门"""
|
||
# 点击新增按钮
|
||
await self.page.get_by_role('button', name='新增').first.click()
|
||
|
||
# 等待对话框
|
||
dialog = self.page.get_by_role('dialog')
|
||
await dialog.wait_for()
|
||
|
||
# 上级部门
|
||
# 使用 label 定位父级 form-item,再点击内部的 wrapper
|
||
await dialog.locator('div.el-form-item').filter(has_text='上级部门').locator('.el-select__wrapper').click()
|
||
# 选择 "集团总公司" (根节点)
|
||
# 使用 .el-popper 定位下拉框中的内容
|
||
await self.page.locator('.el-popper:visible').get_by_text('集团总公司').click()
|
||
|
||
# 填写部门名称
|
||
await dialog.get_by_role('textbox', name='部门名称').fill(dept_name)
|
||
|
||
# 填写显示排序
|
||
# el-input-number 通常是一个 spinbutton 或者 input
|
||
await dialog.get_by_role('spinbutton', name='显示排序').fill(order_num)
|
||
|
||
# 点击确定
|
||
await self.page.get_by_role('button', name='确 定').click()
|
||
# 等待成功消息
|
||
await self.wait_for_selector("div:has-text('成功')", timeout=10000)
|
||
|
||
async def search_dept(self, dept_name: str) -> None:
|
||
"""搜索部门"""
|
||
search_form = self.page.locator('form').first
|
||
await search_form.get_by_role('textbox', name='部门名称').fill(dept_name)
|
||
# 点击搜索按钮
|
||
await self.page.get_by_role('button', name='搜索').first.click()
|
||
|
||
# 等待加载
|
||
await self.page.wait_for_timeout(1000)
|
||
|
||
async def edit_dept(self, leader_name: str) -> None:
|
||
"""编辑部门"""
|
||
# 点击修改按钮 (第一行)
|
||
# 树形表格结构可能不同,但通常也是在 tbody 的 row 中
|
||
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(leader_name)
|
||
|
||
# 确定
|
||
await self.page.get_by_role('button', name='确 定').click()
|
||
|
||
# 等待成功提示
|
||
await self.wait_for_selector('div:has-text("修改成功")', timeout=10000)
|
||
|
||
async def delete_dept(self) -> None:
|
||
"""删除部门"""
|
||
# 点击删除按钮
|
||
await self.page.locator('tbody').get_by_role('button', name='删除').nth(0).click()
|
||
|
||
# 确认删除
|
||
await self.page.get_by_role('button', name='确定').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_dept_crud_operations(self) -> None:
|
||
"""测试部门管理增删查改"""
|
||
# 访问页面
|
||
await self.goto_page(Config.frontend_url + '/system/dept')
|
||
await self.wait_for_page_title('部门管理', timeout=10000)
|
||
|
||
# 生成测试数据
|
||
data = self.generate_dept_data()
|
||
|
||
# 1. 新增
|
||
await self.create_dept(data['dept_name'], data['order_num'])
|
||
|
||
# 验证新增
|
||
await self.search_dept(data['dept_name'])
|
||
# 树形表格,只要有行显示即可
|
||
rows = await self.page.query_selector_all('.el-table__row')
|
||
assert len(rows) >= 1, '新增后搜索应有结果'
|
||
|
||
# 2. 编辑
|
||
await self.edit_dept(data['leader_name'])
|
||
|
||
# 重新搜索以验证修改结果
|
||
await self.search_dept(data['dept_name'])
|
||
|
||
# 3. 删除
|
||
await self.delete_dept()
|
||
|
||
# 验证删除
|
||
await self.search_dept(data['dept_name'])
|
||
rows_after = await self.page.query_selector_all('.el-table__row')
|
||
assert len(rows_after) == 0, '删除后搜索应无结果'
|
||
|
||
|
||
@pytest.mark.asyncio
|
||
async def test_dept_management_page() -> None:
|
||
"""测试部门管理页面功能"""
|
||
async with async_playwright() as p:
|
||
test_instance = DeptManagementTest()
|
||
await test_instance.setup(p)
|
||
try:
|
||
await test_instance.test_dept_crud_operations()
|
||
finally:
|
||
await test_instance.teardown()
|