Files
nanocode/happy-games/games/tetris/final_verification.py
T
Ubuntu 32b43f85bd a
2026-07-03 16:58:28 +08:00

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()