Rileva il caricamento completo della pagina WebBrowser

Come posso rilevare quando un controllo System.Windows.Forms.WebBrowser ha completato il caricamento?

Ho provato a utilizzare gli eventi Navigate e DocumentCompleted ma entrambi sono stati sollevati alcune volte durante il caricamento del documento!

Penso che l’evento DocumentCompleted verrà licenziato anche per tutti i documenti secondari che vengono caricati (come JS e CSS, ad esempio). È ansible esaminare WebBrowserDocumentCompletedEventArgs in DocumentCompleted e controllare la proprietà Url e confrontarla con l’Url della pagina principale.

Ho fatto quanto segue:

 void BrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath) return; //The page is finished loading } 

L’ultima pagina caricata tende a essere quella a cui si è navigato, quindi dovrebbe funzionare.

Da qui

Il seguente dovrebbe funzionare.

 private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { //Check if page is fully loaded or not if (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete) return; else //Action to be taken on page loading completion } 

Notare che l’url in DocumentCompleted può essere diverso dall’URL di navigazione a causa del trasferimento del server o della normalizzazione dell’URL (ad esempio, si naviga su http://www.microsoft.com e si ottiene http://www.microsoft.com in documentcomplete)

Nelle pagine senza frame, questo evento si triggers una volta al termine del caricamento. Nelle pagine con più frame, questo evento si triggers per ogni frame di navigazione (nota che la navigazione è supportata all’interno di un frame, ad esempio facendo clic su un collegamento in un frame è ansible navigare il frame in un’altra pagina). Il frame di navigazione di livello più alto, che può essere o non essere il browser di livello superiore, lancia l’evento DocumentComplete finale.

Nel codice nativo si confronta il mittente dell’evento DocumentComplete per determinare se l’evento è l’evento finale nella navigazione o meno . Tuttavia in Windows Form il parametro del mittente non viene incapsulato da WebBrowserDocumentCompletedEventArgs. È ansible affondare l’evento nativo per ottenere il valore del parametro o controllare la proprietà readystate del browser o dei documenti del frame nel gestore eventi DocumentCompleted per verificare se tutti i frame si trovano nello stato ready.

C’è un proliferare con il metodo readystate come se fosse presente un download manager e la navigazione è in un file scaricabile, la navigazione potrebbe essere annullata dal download manager e lo stato non sarà completo.

Ho avuto lo stesso problema di più eventi licenziati DocumentCompleted e ho provato tutti i suggerimenti di cui sopra. Infine, sembra che nel mio caso né la proprietà IsBusy destra né la proprietà Url , ma il ReadyState sembra essere quello di cui avevo bisogno, perché ha lo stato ‘Interattivo’ durante il caricamento dei frame multipli e ottiene lo stato ‘Completato’ solo dopo aver caricato l’ultimo. Quindi, so quando la pagina è completamente caricata con tutti i suoi componenti.

Spero che questo possa aiutare anche gli altri 🙂

Non sembra triggersre eventi DocumentCompleted / Navigated per file Javascript o CSS esterni, ma per iframe. Come dice PK, confrontare la proprietà WebBrowserDocumentCompletedEventArgs.Url (non ho ancora il karma per fare un commento).

Se stai usando WPF c’è un evento LoadCompleted .

Se è Windows.Forms , l’evento DocumentCompleted dovrebbe essere quello corretto. Se la pagina che stai caricando ha dei frame, il tuo controllo WebBrowser l’evento DocumentCompleted per ogni frame (vedi qui per maggiori dettagli). Suggerirei di verificare la proprietà IsBusy ogni volta che l’evento viene IsBusy e se è falso, la pagina viene completamente caricata.

L’utilizzo dell’evento DocumentCompleted con una pagina con più frame nidificati non ha funzionato per me.

Ho usato la libreria Interop.SHDocVW per lanciare il controllo WebBrowser in questo modo:

 public class webControlWrapper { private bool _complete; private WebBrowser _webBrowserControl; public webControlWrapper(WebBrowser webBrowserControl) { _webBrowserControl = webBrowserControl; } public void NavigateAndWaitForComplete(string url) { _complete = false; _webBrowserControl.Navigate(url); var webBrowser = (SHDocVw.WebBrowser) _webBrowserControl.ActiveXInstance; if (webBrowser != null) webBrowser.DocumentComplete += WebControl_DocumentComplete; //Wait until page is complete while (!_complete) { Application.DoEvents(); } } private void WebControl_DocumentComplete(object pDisp, ref object URL) { // Test if it's the main frame who called the event. if (pDisp == _webBrowserControl.ActiveXInstance) _complete = true; } 

Questo codice funziona per me quando si naviga verso un URL definito utilizzando il metodo webBrowserControl.Navigate (url), ma non so come controllare la pagina completa quando si fa clic su un pulsante html utilizzando htmlElement.InvokeMember (“clic”).

Puoi utilizzare l’evento ProgressChanged; l’ultima volta che viene sollevato indica che il documento è completamente renderizzato:

 this.webBrowser.ProgressChanged += new WebBrowserProgressChangedEventHandler(webBrowser_ProgressChanged);