08ea5fbe98
添加用户管理视图、API和状态管理文件
119 lines
3.1 KiB
Python
119 lines
3.1 KiB
Python
"""
|
|
截图辅助工具模块
|
|
|
|
提供测试截图功能,支持多种截图模式。
|
|
"""
|
|
|
|
import os
|
|
from pathlib import Path
|
|
from typing import Optional
|
|
from datetime import datetime
|
|
from playwright.sync_api import Page
|
|
|
|
|
|
class ScreenshotHelper:
|
|
"""截图辅助工具"""
|
|
|
|
def __init__(self, screenshot_dir: str = "reports/screenshots"):
|
|
self.screenshot_dir = Path(screenshot_dir)
|
|
self.screenshot_dir.mkdir(parents=True, exist_ok=True)
|
|
|
|
def take_screenshot(
|
|
self,
|
|
page: Page,
|
|
name: str,
|
|
full_page: bool = False,
|
|
selector: Optional[str] = None,
|
|
) -> str:
|
|
"""
|
|
截取页面截图
|
|
|
|
Args:
|
|
page: Playwright页面对象
|
|
name: 截图文件名
|
|
full_page: 是否截取整个页面
|
|
selector: 特定元素选择器
|
|
|
|
Returns:
|
|
截图文件路径
|
|
"""
|
|
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
|
|
filename = f"{name}_{timestamp}.png"
|
|
filepath = self.screenshot_dir / filename
|
|
|
|
try:
|
|
if selector:
|
|
# 截取特定元素
|
|
element = page.locator(selector)
|
|
element.screenshot(path=str(filepath))
|
|
else:
|
|
# 截取页面
|
|
page.screenshot(path=str(filepath), full_page=full_page)
|
|
|
|
print(f"📸 截图已保存: {filepath}")
|
|
return str(filepath)
|
|
except Exception as e:
|
|
print(f"❌ 截图失败: {e}")
|
|
return ""
|
|
|
|
def take_screenshot_on_failure(
|
|
self, page: Page, test_name: str, full_page: bool = True
|
|
) -> str:
|
|
"""
|
|
测试失败时截取截图
|
|
|
|
Args:
|
|
page: Playwright页面对象
|
|
test_name: 测试名称
|
|
full_page: 是否截取整个页面
|
|
|
|
Returns:
|
|
截图文件路径
|
|
"""
|
|
return self.take_screenshot(
|
|
page, f"{test_name}_failed", full_page=full_page
|
|
)
|
|
|
|
def take_comparison_screenshot(
|
|
self, page: Page, name: str, baseline_dir: str = "screenshots/baseline"
|
|
) -> tuple:
|
|
"""
|
|
截取对比截图
|
|
|
|
Args:
|
|
page: Playwright页面对象
|
|
name: 截图名称
|
|
baseline_dir: 基线截图目录
|
|
|
|
Returns:
|
|
(当前截图路径, 基线截图路径)
|
|
"""
|
|
current_path = self.take_screenshot(page, name, full_page=True)
|
|
|
|
baseline_path = Path(baseline_dir) / f"{name}.png"
|
|
|
|
return current_path, str(baseline_path)
|
|
|
|
def cleanup_old_screenshots(self, days: int = 7) -> int:
|
|
"""
|
|
清理旧截图
|
|
|
|
Args:
|
|
days: 保留天数
|
|
|
|
Returns:
|
|
删除的文件数量
|
|
"""
|
|
import time
|
|
|
|
deleted_count = 0
|
|
cutoff_time = time.time() - (days * 24 * 60 * 60)
|
|
|
|
for file_path in self.screenshot_dir.glob("*.png"):
|
|
if file_path.stat().st_mtime < cutoff_time:
|
|
file_path.unlink()
|
|
deleted_count += 1
|
|
|
|
print(f"🗑️ 已清理 {deleted_count} 个旧截图文件")
|
|
return deleted_count
|