149 lines
5.1 KiB
Python
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()
|