ShiErFeng/shierfeng-fastapi-test/system/test_role_management.py
2026-07-24 09:43:10 +08:00

149 lines
5.1 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 RoleManagementTest(BasePageTest):
"""角色管理测试类"""
def generate_role_data(self) -> dict:
"""生成测试数据"""
timestamp = int(time.time())
return {
'role_name': f'test_role_{timestamp}',
'role_key': f'test_{timestamp}',
}
async def create_role(self, role_name: str, role_key: str, role_sort: int = 3) -> None:
"""创建角色"""
# 点击新增按钮
await self.page.get_by_role('button', name='新增').click()
# 等待对话框
dialog = self.page.get_by_role('dialog')
await dialog.wait_for()
# 填写信息
await dialog.get_by_role('textbox', name='角色名称').fill(role_name)
await dialog.get_by_role('textbox', name='权限字符').fill(role_key)
await dialog.get_by_role('spinbutton', name='角色顺序').fill(str(role_sort))
# 选择菜单权限 (点击第一个复选框)
await self.page.locator('.el-tree-node__content .el-checkbox').first.click()
# 确定
await self.page.get_by_role('button', name='确 定').click()
# 等待成功提示
await self.wait_for_selector('div:has-text("新增成功")', timeout=10000)
async def search_role(self, role_name: str, role_key: str) -> None:
"""搜索角色"""
search_form = self.page.locator('form').first
await search_form.get_by_placeholder('请输入角色名称').fill(role_name)
await search_form.get_by_placeholder('请输入权限字符').fill(role_key)
await search_form.get_by_role('button', name='搜索').click()
# 等待加载
await self.page.wait_for_timeout(1000)
async def edit_role(self, new_remark: str) -> None:
"""编辑角色"""
# 点击修改按钮 (第一行)
# 按钮没有文字,只有图标,所以使用 nth(0)
row = self.page.locator('tbody tr').first
await row.get_by_role('button').nth(0).click()
dialog = self.page.get_by_role('dialog')
await dialog.wait_for()
# 修改备注
await dialog.get_by_role('textbox', name='备注').fill(new_remark)
# 确定
await self.page.get_by_role('button', name='确 定').click()
# 等待成功提示
await self.wait_for_selector('div:has-text("修改成功")', timeout=10000)
async def change_role_status(self) -> None:
"""修改角色状态"""
# 点击开关 (第一行)
# 使用 .el-switch__core 或者 role=switch
# script.py uses .el-switch__action, let's try .el-switch
switch = self.page.locator('.el-switch').first
await switch.click()
# 确认对话框
await self.page.get_by_role('button', name='确定').click()
await self.wait_for_selector('div:has-text("成功")', timeout=5000)
# 再次点击恢复
await self.page.wait_for_timeout(1000)
await switch.click()
await self.page.get_by_role('button', name='确定').click()
await self.wait_for_selector('div:has-text("成功")', timeout=5000)
async def delete_role(self) -> None:
"""删除角色"""
# 点击删除按钮 (第一行第二个按钮)
row = self.page.locator('tbody tr').first
await row.get_by_role('button').nth(1).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_role_crud_operations(self) -> None:
"""测试角色管理CRUD"""
# 访问页面
await self.goto_page(Config.frontend_url + '/system/role')
await self.wait_for_page_title('角色管理', timeout=10000)
# 生成测试数据
data = self.generate_role_data()
# 1. 新增
await self.create_role(data['role_name'], data['role_key'])
# 验证新增结果
await self.search_role(data['role_name'], data['role_key'])
rows = await self.get_table_total_rows()
assert rows >= 1, '新增后搜索应有结果'
# 2. 修改状态
await self.change_role_status()
# 3. 编辑
await self.edit_role('Updated remark')
# 4. 删除
await self.delete_role()
# 验证删除结果
await self.search_role(data['role_name'], data['role_key'])
rows_after = await self.get_table_total_rows()
assert rows_after == 0, '删除后搜索应无结果'
@pytest.mark.asyncio
async def test_role_management_page() -> None:
"""测试角色管理页面功能"""
async with async_playwright() as p:
test_instance = RoleManagementTest()
await test_instance.setup(p)
try:
await test_instance.test_role_crud_operations()
finally:
await test_instance.teardown()