2012-09-25 59 views
27

Estoy usando un control WebBrowser y me gustaría manipular el código HTML antes de que se muestre en el control.¿Cambiar el HTML en un WebBrowser antes de que se muestre al usuario?

Por ejemplo abrir la web con un contenido siguiente:

<html> 
    <body> 
    <p id="Text">Hello</p> 
    </body> 
</html> 

me gustaría cambiarlo a

<html> 
    <body> 
    <p id="Text">Bye</p> 
    </body> 
</html> 

Sé que podría hacer eso con el evento DocumentCompleted y luego manipularla. Pero si el sitio web ejecuta material de JavaScript que se ejecuta en el evento listo para el documento, no tendría sentido cambiarlo, porque ya se ha ejecutado.

+0

¿Desea cambiar el código HTML descargado antes de que se muestre y luego solo muestra el código modificado, ¿verdad? –

+0

Sí, tienes razón, eso es exactamente lo que me gustaría hacer ... – RaphaelH

Respuesta

14

Usted podría hacer la manipulación del DOM dentro del evento Navigated:

webBrowser1.Navigated += (sender, e) => 
{ 
    ((WebBrowser)sender).Document.GetElementById("Text").InnerHtml = "Bye"; 
}; 

Esto ejecutará antes de que los manejadores de listas de DOM en el documento. Así, por ejemplo, si tiene el código HTML siguiente principio:

<html> 
<head> 
    <title>Test</title> 
</head> 
<body onload="document.getElementById('Text').innerHTML = document.getElementById('Text').innerHTML + ' modified';"> 
    <p id="Text">Hello</p> 
</body> 
</html> 

Cuando se muestra este código en el WebBrowser obtendrá Bye modified.

+2

Me gusta esta idea ... pero el problema es que si el documento HTML es un poco más grande, los controles de WebBrowser no lo leen todo a la vez, por lo que Se llama a Evento Navegado, pero todavía está cargando la Página .. – RaphaelH

0

Esto no funciona. Estoy enfrentando el mismo problema. ¿Qué pasa si quieres modificar las llamadas ajax? El método de navegación nunca se dispara. Además, el método de navegación nunca se activa en iFrames.

Creo que la única solución es usar un proxy. Simplemente haga clic en agregar paquetes NuGet. Busque el fiddlercore. Una vez que agregue una referencia al http://www.telerik.com/fiddler/fiddlercore. Ahora haz una búsqueda en Google sobre cómo modificar una respuesta usando FiddlerCore. Estoy seguro de que habrá muchos ejemplos.

Nota: al iniciar el núcleo de Fiddler de forma predeterminada, cambiará la configuración de proxy de su computadora. ¡No quieres eso! solo quiere que su control del navegador web se conecte a él, no a todo su sistema. Inicialice el núcleo fidderl para escuchar en un puerto aleatorio sin iniciar como proxy del sistema. Luego configure su control de navegador web para conectarse a ese proxy.

Será más complicado cuando se intenta acceder a sitios HTTPS:/

0

Se podría hacer esto en una devolución de llamada setInterval con un intervalo razonable (~ 20 ms) y luego borrar el intervalo en el momento apropiado, como el DOM listo .

La única advertencia es que su devolución de llamada debería ser idempotente ya que se llamará varias veces. No sospecho que eso debería ser difícil si simplemente agrega un atributo de datos o un nombre de clase a los nodos DOM que ya ha modificado para que no se modifiquen nuevamente.

Cuestiones relacionadas