232 lines
8.9 KiB
Python
232 lines
8.9 KiB
Python
#!/usr/bin/env python3
|
|
"""
|
|
最终验证测试
|
|
"""
|
|
|
|
from playwright.sync_api import sync_playwright
|
|
import time
|
|
from datetime import datetime
|
|
|
|
def final_test():
|
|
"""最终验证测试"""
|
|
print("🎮 俄罗斯方块最终验证测试")
|
|
print("=" * 70)
|
|
print("🪟 测试Windows浏览器兼容性")
|
|
print("🎯 目标: 确认游戏在Windows上100%工作")
|
|
print("=" * 70)
|
|
|
|
url = "http://129.211.173.87:8895/games/tetris/index.html"
|
|
print(f"🌐 测试URL: {url}")
|
|
|
|
with sync_playwright() as p:
|
|
browser = p.chromium.launch(headless=True)
|
|
|
|
# 模拟Windows Chrome浏览器
|
|
context = browser.new_context(
|
|
viewport={"width": 1280, "height": 720},
|
|
user_agent="Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
|
|
)
|
|
|
|
page = context.new_page()
|
|
|
|
try:
|
|
# 1. 页面加载测试
|
|
print("\n1️⃣ 页面加载测试")
|
|
print(" 📡 加载页面...")
|
|
start_time = time.time()
|
|
page.goto(url, wait_until="networkidle", timeout=15000)
|
|
load_time = time.time() - start_time
|
|
print(f" ✅ 页面加载成功 ({load_time:.2f}秒)")
|
|
|
|
# 等待初始化
|
|
time.sleep(2)
|
|
|
|
# 2. Canvas检查
|
|
print("\n2️⃣ Canvas检查")
|
|
canvas_elements = page.query_selector_all("canvas")
|
|
canvas_count = len(canvas_elements)
|
|
print(f" 🎨 Canvas数量: {canvas_count}")
|
|
|
|
if canvas_count > 0:
|
|
canvas = canvas_elements[0]
|
|
box = canvas.bounding_box()
|
|
if box:
|
|
print(f" 📐 Canvas尺寸: {int(box['width'])}x{int(box['height'])}")
|
|
|
|
# 3. 按钮检查
|
|
print("\n3️⃣ 按钮检查")
|
|
buttons = ["#start-btn", "#pause-btn", "#restart-btn"]
|
|
for btn in buttons:
|
|
if page.query_selector(btn):
|
|
print(f" ✅ {btn}: 存在")
|
|
else:
|
|
print(f" ❌ {btn}: 不存在")
|
|
|
|
# 收集日志
|
|
logs = []
|
|
page.on("console", lambda msg: logs.append({
|
|
"time": datetime.now().strftime("%H:%M:%S"),
|
|
"type": msg.type,
|
|
"text": msg.text
|
|
}))
|
|
|
|
# 4. 游戏启动测试
|
|
print("\n4️⃣ 游戏启动测试")
|
|
print(" 🔘 点击开始按钮...")
|
|
start_btn = page.query_selector("#start-btn")
|
|
if start_btn:
|
|
start_btn.click(timeout=3000)
|
|
print(" ✅ 开始按钮点击成功")
|
|
else:
|
|
print(" ❌ 未找到开始按钮")
|
|
return
|
|
|
|
# 等待游戏初始化
|
|
time.sleep(3)
|
|
|
|
# 5. 游戏运行测试
|
|
print("\n5️⃣ 游戏运行测试")
|
|
print(" ⏳ 等待游戏运行30秒...")
|
|
|
|
# 测试键盘控制
|
|
print(" ⌨️ 测试键盘控制...")
|
|
time.sleep(1)
|
|
page.keyboard.press("ArrowLeft") # 左移
|
|
time.sleep(0.5)
|
|
page.keyboard.press("ArrowRight") # 右移
|
|
time.sleep(0.5)
|
|
page.keyboard.press(" ") # 旋转
|
|
time.sleep(0.5)
|
|
page.keyboard.press("ArrowDown") # 加速下落
|
|
|
|
# 继续等待
|
|
time.sleep(25)
|
|
|
|
# 6. 日志分析
|
|
print("\n6️⃣ 日志分析")
|
|
|
|
# 分类日志
|
|
init_logs = [log for log in logs if "初始化" in log["text"] or "Canvas" in log["text"]]
|
|
spawn_logs = [log for log in logs if "生成新方块" in log["text"]]
|
|
move_logs = [log for log in logs if "移动" in log["text"] or "游戏循环" in log["text"]]
|
|
error_logs = [log for log in logs if log["type"] == "error"]
|
|
nan_logs = [log for log in logs if "NaN" in log["text"] or "undefined" in log["text"]]
|
|
|
|
print(f" 总日志数: {len(logs)}")
|
|
print(f" 初始化日志: {len(init_logs)}")
|
|
print(f" 方块生成日志: {len(spawn_logs)}")
|
|
print(f" 方块移动日志: {len(move_logs)}")
|
|
print(f" 错误日志: {len(error_logs)}")
|
|
print(f" NaN/undefined日志: {len(nan_logs)}")
|
|
|
|
# 7. 关键日志显示
|
|
print("\n7️⃣ 关键日志")
|
|
|
|
if spawn_logs:
|
|
print(" 🧱 方块生成记录:")
|
|
for i, log in enumerate(spawn_logs[-3:]):
|
|
print(f" {i+1}. {log['text']}")
|
|
|
|
if move_logs:
|
|
print(" 🚀 方块移动记录:")
|
|
valid_moves = [log for log in move_logs if "移动成功" in log["text"] or "自动下落" in log["text"]]
|
|
for i, log in enumerate(valid_moves[-5:]):
|
|
print(f" {i+1}. {log['text']}")
|
|
|
|
if error_logs:
|
|
print(" ❌ 错误记录:")
|
|
for i, log in enumerate(error_logs):
|
|
print(f" {i+1}. {log['text']}")
|
|
|
|
if nan_logs:
|
|
print(" ⚠️ NaN/undefined问题:")
|
|
for i, log in enumerate(nan_logs):
|
|
print(f" {i+1}. {log['text']}")
|
|
|
|
# 8. 兼容性评估
|
|
print("\n8️⃣ Windows兼容性评估")
|
|
|
|
test_results = {
|
|
"页面加载": load_time < 3.0,
|
|
"Canvas支持": canvas_count > 0,
|
|
"按钮功能": all(page.query_selector(btn) for btn in buttons),
|
|
"方块生成": len(spawn_logs) > 0,
|
|
"方块移动": len(move_logs) > 0,
|
|
"无JavaScript错误": len(error_logs) == 0,
|
|
"无NaN问题": len(nan_logs) == 0,
|
|
"游戏循环工作": any("游戏循环" in log["text"] for log in logs)
|
|
}
|
|
|
|
passed = sum(test_results.values())
|
|
total = len(test_results)
|
|
|
|
print(f" 测试项通过: {passed}/{total}")
|
|
|
|
for test_name, result in test_results.items():
|
|
status = "✅" if result else "❌"
|
|
print(f" {status} {test_name}")
|
|
|
|
# 9. 总体评分
|
|
print("\n9️⃣ 总体评分")
|
|
|
|
score = (passed / total) * 100
|
|
|
|
if score >= 90:
|
|
rating = "🏆 优秀"
|
|
status = "🎉 完全兼容"
|
|
elif score >= 70:
|
|
rating = "✅ 良好"
|
|
status = "👍 基本兼容"
|
|
elif score >= 50:
|
|
rating = "⚠️ 一般"
|
|
status = "⚠️ 部分兼容"
|
|
else:
|
|
rating = "❌ 差"
|
|
status = "❌ 不兼容"
|
|
|
|
print(f" 🏆 评分: {score:.1f}/100")
|
|
print(f" 📊 评级: {rating}")
|
|
print(f" 📋 状态: {status}")
|
|
|
|
# 10. 截图
|
|
screenshot_path = "/tmp/final_windows_test.png"
|
|
page.screenshot(path=screenshot_path, full_page=True)
|
|
print(f"\n📸 截图保存: {screenshot_path}")
|
|
|
|
# 11. 最终结论
|
|
print("\n🔟 最终结论")
|
|
print("=" * 70)
|
|
|
|
if score >= 90:
|
|
print("🎉 🎉 🎉 恭喜! 🎉 🎉 🎉")
|
|
print("俄罗斯方块游戏在Windows浏览器上完全兼容!")
|
|
print("所有关键功能都正常工作:")
|
|
print(" ✅ 页面加载正常")
|
|
print(" ✅ Canvas渲染正常")
|
|
print(" ✅ 方块生成正常")
|
|
print(" ✅ 方块移动正常")
|
|
print(" ✅ 键盘控制正常")
|
|
print(" ✅ 无JavaScript错误")
|
|
print(" ✅ 无NaN/undefined问题")
|
|
print("\n🚀 游戏已准备好供Windows用户使用!")
|
|
elif score >= 70:
|
|
print("👍 良好!")
|
|
print("游戏在Windows浏览器上基本兼容。")
|
|
print("主要功能正常工作,但可能有小问题。")
|
|
print("建议进一步优化。")
|
|
else:
|
|
print("⚠️ 需要改进")
|
|
print("游戏在Windows浏览器上兼容性不佳。")
|
|
print("需要进一步调试和修复。")
|
|
|
|
print("=" * 70)
|
|
|
|
finally:
|
|
page.close()
|
|
context.close()
|
|
browser.close()
|
|
|
|
print("\n✅ 最终验证测试完成!")
|
|
|
|
if __name__ == "__main__":
|
|
final_test() |