#!/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()