import asyncio import os import pyperclip import re from domains.ScrappingWeb.Scrapper import Scrapper def sanitizar(nombre: str) -> str: return re.sub(r'[\\/*?:"<>|]', "_", nombre).strip()[:100] OUTPUT_DIR = "esquemas_json" os.makedirs(OUTPUT_DIR, exist_ok=True) async def main(): ws_id = "F51AC05B27E1DEC4011E67369781596C" ws_url = f"ws://127.0.0.1:9222/devtools/page/{ws_id}" scrapper = Scrapper(debugging_url="http://127.0.0.1:9222") print("🔌 Conectando a pestaña específica...") tab = scrapper.get_tab(ws_url) or scrapper.get_tab(ws_id) if not tab: nuevas_tabs = await scrapper.obtener_tabs_existentes() tab = next((t for t in nuevas_tabs if t.ws_url.rsplit("/", 1)[-1] == ws_id), None) if not tab: print("⚠️ La pestaña con ese ID no se encontró.") return elementos = await tab.get_elements_by_css_selector( "#_0rif_bq-resource-tree > div.cfctest-tree-main.ng-tns-c3578326070-0 > ul > cfc-virtual-scroller > div > div.item-container > div > li" ) for i, elemento in enumerate(elementos[:12]): print(f"🖱️ Click #{i + 1}") clickeable = await elemento.encontrar_hijo_clickeable() if clickeable: await clickeable.click() else: print(f"⚠️ No se encontró subelemento clickeable en #{i+1}") continue await asyncio.sleep(1) texto_crudo = await elemento.obtener_texto() nombre_archivo = sanitizar(texto_crudo or f"esquema_item_{i+1}") print(f"📄 Nombre base del archivo: {nombre_archivo}.txt") # ✅ Ejecutar JS en el navegador para simular flujo de copia await tab.evaluar_js(""" (() => { const boton = document.querySelector('button[id^="_0rif_bqui-table-copy-schema-btn"] span.mdc-button__label > span'); if (boton) boton.click(); })() """) await asyncio.sleep(1) await tab.evaluar_js(""" (() => { const overlays = document.querySelectorAll("div.cdk-overlay-pane"); for (let overlay of overlays) { const items = overlay.querySelectorAll("cfc-menu-item .cfc-menu-item-label"); for (let item of items) { if (item.textContent.includes("Copiar como JSON")) { item.click(); break; } } } })() """) await asyncio.sleep(1.5) try: texto_json = pyperclip.paste() file_path = os.path.join(OUTPUT_DIR, f"{nombre_archivo}.txt") with open(file_path, "w", encoding="utf-8") as f: f.write(texto_json) print(f"✅ Guardado: {file_path}") except Exception as e: print(f"❌ Error al leer el portapapeles o guardar archivo: {e}") if __name__ == "__main__": asyncio.run(main())