2012-09-25 13 views
27

Sto usando un controllo WebBrowser e vorrei manipolare il codice HTML prima che venga visualizzato nel controllo.Modifica dell'HTML in un browser web prima che venga visualizzato all'utente?

Per esempio il sito A con seguente contenuto:

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

vorrei cambiarlo in

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

So che avrei potuto farlo con l'evento DocumentCompleted e poi manipolarlo. Ma se il sito Web esegue elementi JavaScript che vengono eseguiti su evento pronto per il documento, non avrebbe senso cambiarlo, perché è già stato eseguito.

+0

Si desidera modificare il codice HTML scaricato prima che venga visualizzato e quindi visualizzato solo il codice modificato, giusto? –

+0

Sì hai ragione, è esattamente quello che mi piacerebbe fare .. – RaphaelH

risposta

14

Si potrebbe fare la manipolazione del DOM all'interno della manifestazione Navigated:

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

Questo eseguirà prima di eventuali gestori pronti DOM nel documento. Così, per esempio se si ha il seguente codice HTML inizialmente:

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

Quando si visualizza questo codice nel browser web si otterrà Bye modified.

+2

Mi piace questa idea .. Ma il problema è che se il documento HTML è poco più grande, i controlli WebBrowser non leggono tutto in una volta, quindi il Viene chiamato l'evento di navigazione, ma sta ancora caricando la pagina .. – RaphaelH

0

Questo non funziona. Sono di fronte allo stesso problema. Cosa succede se si desidera modificare le chiamate ajax? Il metodo di navigazione non si attiva mai. Anche il metodo di navigazione non viene mai attivato su iFrame.

Penso che l'unica soluzione sia usare un proxy. Basta fare clic su Aggiungi pacchetti NuGet. Cerca Fiddlercore. Dopo aver aggiunto un riferimento a http://www.telerik.com/fiddler/fiddlercore. Ora fai una ricerca su google su come modificare una risposta usando FiddlerCore. Sono sicuro che ci saranno molti esempi.

Nota: all'avvio del nucleo del violinista per impostazione predefinita modifica le impostazioni del proxy del computer. Non lo vuoi! vuoi solo che il tuo webbrowser non sia collegato all'intero sistema. Quindi inizializza il nucleo fidderl per ascoltare una porta casuale senza avviare come proxy di sistema. Quindi imposta il controllo webbrowser per la connessione a quel proxy.

Si otterrà più complicato quando si tenta di accedere a siti HTTPS:/

0

Si potrebbe fare questo in un setInterval callback con un intervallo ragionevole (~ 20 ms) e quindi deselezionare l'intervallo al momento opportuno, come il DOM pronto .

L'unico avvertimento è che il callback dovrebbe essere idempotente poiché verrà chiamato più volte. Non sospetto che dovrebbe essere difficile se si aggiunge semplicemente un attributo di dati o un nome di classe ai nodi DOM che sono già stati modificati in modo che non vengano modificati di nuovo.

Problemi correlati