初始提交
This commit is contained in:
@@ -0,0 +1,87 @@
|
||||
import re
|
||||
|
||||
from playwright.async_api._context_manager import PlaywrightContextManager
|
||||
|
||||
from common.login_helper import LoginHelper
|
||||
|
||||
|
||||
class BasePageTest:
|
||||
browser = None
|
||||
context = None
|
||||
page = None
|
||||
token = None
|
||||
|
||||
async def setup(self, playwright: PlaywrightContextManager) -> None:
|
||||
"""初始化浏览器和登录"""
|
||||
# 首先登录获取token
|
||||
helper = LoginHelper()
|
||||
self.token = helper.login(username='admin', password='admin123')
|
||||
assert self.token is not None, '登录应该成功'
|
||||
|
||||
# 启动浏览器
|
||||
self.browser = await playwright.chromium.launch(headless=True)
|
||||
self.context = await self.browser.new_context()
|
||||
# 设置认证token
|
||||
await self.context.add_cookies(
|
||||
[
|
||||
{
|
||||
'name': 'Admin-Token',
|
||||
'value': self.token,
|
||||
'domain': 'localhost',
|
||||
'path': '/',
|
||||
'httpOnly': False,
|
||||
'secure': False,
|
||||
}
|
||||
]
|
||||
)
|
||||
self.page = await self.context.new_page()
|
||||
|
||||
async def teardown(self) -> None:
|
||||
"""清理资源"""
|
||||
if self.context:
|
||||
await self.context.close()
|
||||
if self.browser:
|
||||
await self.browser.close()
|
||||
|
||||
async def goto_page(self, url: str) -> None:
|
||||
"""访问指定页面"""
|
||||
await self.page.goto(url)
|
||||
|
||||
async def wait_for_page_title(self, title_text: str, timeout: int = 10000) -> None:
|
||||
"""等待页面标题出现"""
|
||||
await self.page.wait_for_selector(f'div:has-text("{title_text}")', timeout=timeout)
|
||||
page_title = await self.page.inner_text(f'div:has-text("{title_text}")')
|
||||
assert title_text in page_title
|
||||
|
||||
async def wait_for_selector(self, selector: str, timeout: int = 10000) -> None:
|
||||
"""等待选择器出现"""
|
||||
await self.page.wait_for_selector(selector, timeout=timeout)
|
||||
|
||||
async def query_selector(self, selector: str) -> any:
|
||||
"""查询选择器元素"""
|
||||
return await self.page.query_selector(selector)
|
||||
|
||||
async def click_button(self, button_text: str) -> None:
|
||||
"""点击按钮"""
|
||||
button = await self.page.wait_for_selector(f'text="{button_text}"', timeout=5000)
|
||||
await button.click()
|
||||
|
||||
async def fill_input(self, selector: str, value: str) -> None:
|
||||
"""填充输入框"""
|
||||
await self.page.fill(selector, value)
|
||||
|
||||
async def get_text_content(self, selector: str) -> str:
|
||||
"""获取元素文本内容"""
|
||||
element = await self.page.query_selector(selector)
|
||||
if element:
|
||||
return await element.text_content()
|
||||
return None
|
||||
|
||||
async def get_table_total_rows(self) -> int:
|
||||
"""获取表格总行数"""
|
||||
element = self.page.locator('span.el-pagination__total').first
|
||||
text = await element.text_content()
|
||||
|
||||
# 提取数字
|
||||
number = re.search(r'\d+', text).group()
|
||||
return int(number)
|
||||
@@ -0,0 +1,3 @@
|
||||
class Config:
|
||||
frontend_url = 'http://localhost:80'
|
||||
backend_url = 'http://localhost:9099'
|
||||
@@ -0,0 +1,57 @@
|
||||
import requests
|
||||
|
||||
from common.config import Config
|
||||
|
||||
|
||||
class LoginHelper:
|
||||
"""
|
||||
登录辅助类
|
||||
"""
|
||||
|
||||
def __init__(self, base_url: str = Config.frontend_url) -> None:
|
||||
self.base_url = base_url
|
||||
self.session = requests.Session()
|
||||
|
||||
def login(self, username: str = 'admin', password: str = 'admin123', max_retries: int = 3) -> str | None:
|
||||
"""
|
||||
执行登录操作(在测试环境中,验证码已禁用)
|
||||
"""
|
||||
for _attempt in range(max_retries):
|
||||
# 在测试环境中,验证码已禁用,所以直接登录
|
||||
login_data = {'username': username, 'password': password}
|
||||
|
||||
headers = {'Content-Type': 'application/x-www-form-urlencoded', 'Referer': f'{self.base_url}/login'}
|
||||
|
||||
response = self.session.post(f'{Config.backend_url}/login', data=login_data, headers=headers)
|
||||
|
||||
http_ok = 200
|
||||
if response.status_code == http_ok:
|
||||
result = response.json()
|
||||
# 检查登录是否成功 - 可能是 code=200 或 success=true
|
||||
if result.get('code') == http_ok or result.get('success'):
|
||||
# 尝试从不同可能的位置获取token
|
||||
token = result.get('token') # 直接在根级别
|
||||
if not token:
|
||||
token = result.get('data', {}).get('token') # 在data对象内
|
||||
|
||||
if token:
|
||||
print('登录成功')
|
||||
return token
|
||||
print(f'登录失败: 响应中未找到token - {result}')
|
||||
else:
|
||||
print(f'登录失败: {result.get("msg", "未知错误")}')
|
||||
else:
|
||||
print(f'登录请求失败: 状态码 {response.status_code}')
|
||||
|
||||
print('登录失败,已达到最大重试次数')
|
||||
return None
|
||||
|
||||
|
||||
# 使用示例
|
||||
if __name__ == '__main__':
|
||||
helper = LoginHelper()
|
||||
token = helper.login()
|
||||
if token:
|
||||
print(f'获取到token: {token}')
|
||||
else:
|
||||
print('登录失败')
|
||||
Reference in New Issue
Block a user