88 lines
2.9 KiB
Python
88 lines
2.9 KiB
Python
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)
|