Chrome DevTools Protocol

Como Controlar Iframes Cross-Origin con Chrome DevTools Protocol

¿Alguna vez intentaste automatizar acciones dentro de un iframe de otro dominio y Chrome te bloqueó? Este es uno de los problemas mas frustrantes en automatizacion web. Hoy te comparto la solucion que desarrollamos en Varela Insights para controlar iframes cross-origin usando Chrome DevTools Protocol (CDP).

El Problema: Seguridad CORS en Iframes

Cuando una pagina web (ejemplo: tuapp.com) carga contenido de otro dominio en un iframe (ejemplo: proveedor-externo.com), el navegador aplica politicas de seguridad CORS que impiden:

  • Acceder al DOM del iframe desde JavaScript de la pagina principal
  • Enviar eventos de click que lleguen al iframe
  • Ejecutar codigo dentro del contexto del iframe

Esto afecta a muchas aplicaciones empresariales: plataformas de capacitacion, sistemas bancarios, ERPs con modulos embebidos, y cualquier plataforma que use iframes de terceros.

Metodos que NO Funcionan

Antes de encontrar la solucion, probamos multiples enfoques que fallaron:

  • Input.dispatchMouseEvent: Los eventos van al frame principal, no al iframe
  • executeScript con frameId: Chrome bloquea eval en frames cross-origin
  • chrome.tabs.sendMessage con frameId: Content scripts no reciben mensajes cross-origin
  • Runtime.evaluate con contextId: El contextId del frame no es valido

La Solucion: Page.createIsolatedWorld

Chrome DevTools Protocol permite crear un "mundo aislado" (isolated world) dentro de cualquier frame, incluyendo iframes cross-origin. Este mundo tiene acceso completo al DOM del frame.

El flujo es:

  1. chrome.debugger.attach() - Conectar al tab
  2. Page.getFrameTree() - Obtener arbol de frames
  3. Buscar frame por URL pattern - Encontrar el iframe target
  4. Page.createIsolatedWorld() - Crear contexto de ejecucion
  5. Runtime.evaluate() - Ejecutar codigo en ese contexto
  6. chrome.debugger.detach() - Desconectar

Codigo de Implementacion

Este es el codigo JavaScript para una extension de Chrome que implementa esta solucion:

// 1. Attach debugger
await chrome.debugger.attach({tabId: tab.id}, "1.3");
await chrome.debugger.sendCommand({tabId: tab.id}, "Runtime.enable", {});

// 2. Obtener frame tree
const frameTree = await chrome.debugger.sendCommand(
    {tabId: tab.id},
    "Page.getFrameTree",
    {}
);

// 3. Buscar frame por URL
const findFrame = (node, urlPattern) => {
    if (node.frame?.url?.includes(urlPattern)) return node.frame;
    for (const child of node.childFrames || []) {
        const found = findFrame(child, urlPattern);
        if (found) return found;
    }
    return null;
};
const targetFrame = findFrame(frameTree.frameTree, 'tu-patron-url');

// 4. Crear isolated world
const isolatedWorld = await chrome.debugger.sendCommand(
    {tabId: tab.id},
    "Page.createIsolatedWorld",
    { frameId: targetFrame.id, worldName: 'mi_mundo' }
);

// 5. Ejecutar codigo en el iframe
const result = await chrome.debugger.sendCommand(
    {tabId: tab.id},
    "Runtime.evaluate",
    {
        expression: 'document.getElementById("btn").click()',
        contextId: isolatedWorld.executionContextId,
        returnByValue: true
    }
);

// 6. Detach
await chrome.debugger.detach({tabId: tab.id});

Permisos Necesarios en manifest.json

{
    "permissions": [
        "debugger",
        "activeTab",
        "tabs",
        "scripting",
        "webNavigation"
    ],
    "host_permissions": ["<all_urls>"]
}

Casos de Uso Reales

Con esta tecnica puedes automatizar:

  • Plataformas e-learning: Cursos, examenes, certificaciones online
  • Banca en linea: Formularios en iframes seguros
  • ERPs: Sistemas empresariales con modulos embebidos
  • LMS: Sistemas de gestion de aprendizaje
  • Widgets: Chatbots, formularios embebidos de terceros

Limitacion Importante

Cuando el debugger esta adjunto, Chrome muestra un banner amarillo: "Extension started debugging this browser". Esto es inevitable y es una medida de seguridad de Chrome para que el usuario sepa que hay automatizacion activa.

Rendimiento

Una ventaja adicional de este metodo es la velocidad. Comparado con tomar screenshots y analizarlos visualmente (que puede tomar 3-4 segundos por operacion), extraer datos directamente del DOM toma menos de 0.2 segundos. Esto representa una mejora de 20-30x en velocidad.

Conclusion

Page.createIsolatedWorld es la clave para controlar iframes cross-origin. Esta tecnica nos permitio automatizar flujos complejos en aplicaciones web empresariales que antes eran imposibles de manejar programaticamente.

Si necesitas implementar automatizacion en aplicaciones web complejas con iframes de terceros, esta es la solucion que buscabas.

Referencias:
- Chrome DevTools Protocol - Page.createIsolatedWorld
- Chrome DevTools Protocol - Runtime.evaluate


Sobre el Autor

Irving Alberto Varela Bedoya, Ph.D.
Experto en Inteligencia Artificial y Automatización Empresarial

Ayudo a empresas a transformar sus operaciones con IA y automatización, generando ROI medible en 90 días o menos.

Regresar al blog

Deja un comentario