minions-ai-agents/antigravity_brain_export/tools/qa_snapshot_spree.py

103 lines
3.9 KiB
Python

import os
import json
import time
import sys
from playwright.sync_api import sync_playwright
# Configuração
BASE_URL = "http://localhost:80" # Ajuste para sua URL base
OUTPUT_DIR = "test-results"
ROUTES_FILE = "qa_routes.json"
def run_qa_scan():
if not os.path.exists(ROUTES_FILE):
return f"❌ Arquivo {ROUTES_FILE} não encontrado. Crie uma lista de rotas."
with open(ROUTES_FILE, 'r', encoding='utf-8') as f:
routes = json.load(f)
# Cria pasta com timestamp para não sobrescrever testes anteriores
timestamp = time.strftime("%Y-%m-%d_%H-%M-%S")
session_dir = os.path.join(OUTPUT_DIR, timestamp)
os.makedirs(session_dir, exist_ok=True)
report_summary = []
with sync_playwright() as p:
browser = p.chromium.launch(headless=True) # Mude para False se quiser ver acontecendo
# Define viewport grande para pegar desktops
context = browser.new_context(viewport={"width": 1920, "height": 1080})
print(f"🚀 Iniciando Scan de QA em {BASE_URL}...")
print(f"📂 Resultados serão salvos em: {session_dir}")
for route in routes:
name = route.get('name', 'Unknown')
path = route.get('path', '/')
full_url = f"{BASE_URL}{path}"
print(f"📸 Processando: {name} ({path})...")
# Criar uma nova página para cada rota para isolar os logs de console
page = context.new_page()
# Preparar captura de logs
console_logs = []
page.on("console", lambda msg: console_logs.append(f"[{msg.type}] {msg.text}"))
page.on("pageerror", lambda exc: console_logs.append(f"[CRASH] {exc}"))
try:
page.goto(full_url, wait_until="networkidle")
# Espera seletor específico se configurado (garante que carregou)
if "wait_for" in route:
page.wait_for_selector(route["wait_for"], timeout=5000)
else:
time.sleep(1) # Espera técnica mínima
# 1. Salvar Screenshot
safe_name = name.replace(" ", "_").lower().replace("/", "_").replace("\\", "_")
img_path = os.path.join(session_dir, f"{safe_name}.png")
page.screenshot(path=img_path, full_page=True)
# 2. Salvar Logs
log_path = os.path.join(session_dir, f"{safe_name}.log")
with open(log_path, 'w', encoding='utf-8') as f_log:
f_log.write("\n".join(console_logs))
# Análise Rápida de Erros
error_count = sum(1 for log in console_logs if "error" in log.lower() or "crash" in log.lower())
status = "❌ ERRO" if error_count > 0 else "✅ OK"
report_summary.append({
"page": name,
"status": status,
"errors": error_count,
"screenshot": img_path,
"log_file": log_path
})
print(f" Status: {status} ({error_count} erros encontrados)")
except Exception as e:
print(f" ⚠️ Falha ao acessar {full_url}: {e}")
report_summary.append({
"page": name,
"status": "⚠️ FALHA CRÍTICA",
"error_msg": str(e)
})
finally:
page.close() # Fecha a página atual antes de ir para a próxima
browser.close()
# Salva o Relatório Geral para o Agente ler
summary_path = os.path.join(session_dir, "qa_report.json")
with open(summary_path, 'w', encoding='utf-8') as f:
json.dump(report_summary, f, indent=2, ensure_ascii=False)
return f"✅ QA Finalizado. Relatório salvo em: {summary_path}"
if __name__ == "__main__":
print(run_qa_scan())