Detectar la carga de la página completa de WebBrowser

¿Cómo puedo detectar cuándo se ha completado la carga de un control System.Windows.Forms.WebBrowser?

Traté de usar los eventos Navigate y DocumentCompleted, pero ambos se levantaron varias veces durante la carga del documento.

Creo que el evento DocumentCompleted se activará para todos los documentos secundarios que también se carguen (como JS y CSS, por ejemplo). Puede ver WebBrowserDocumentCompletedEventArgs en DocumentCompleted y verificar la propiedad Url y compararla con la URL de la página principal.

Hice lo siguiente:

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

La última página cargada tiende a ser la navegada, por lo que debería funcionar.

Desde aquí .

Lo siguiente debería funcionar

 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 } 

Tenga en cuenta que la URL en DocumentCompleted puede ser diferente a la URL de navegación debido a la transferencia del servidor o la normalización de la URL (por ejemplo, navega a http://www.microsoft.com y obtiene http://www.microsoft.com en documentcomplete)

En páginas sin marcos, este evento se dispara una vez que se completa la carga. En páginas con varios fotogtwigs, este evento se dispara para cada fotogtwig de navegación (la navegación de notas se admite dentro de un fotogtwig, por ejemplo, al hacer clic en un enlace de un fotogtwig se puede navegar por el fotogtwig a otra página). El marco de navegación de más alto nivel, que puede o no ser el navegador de nivel superior, dispara el evento DocumentComplete final.

En el código nativo compararía el remitente del evento DocumentComplete para determinar si el evento es el evento final en la navegación o no . Sin embargo, en Windows Forms, el parámetro del remitente no está incluido en WebBrowserDocumentCompletedEventArgs. Puede hundir el evento nativo para obtener el valor del parámetro o verificar la propiedad de estado preparado del navegador o los documentos de marco en el controlador de eventos DocumentCompleted para ver si todos los marcos están listos.

Existe un prolblem con el método readystate, como si un administrador de descargas estuviera presente y la navegación fuera a un archivo descargable, la navegación podría ser cancelada por el administrador de descargas y el estado listo no se completará.

Tuve el mismo problema de varios eventos disparados con DocumentCompleted y probé todas las sugerencias anteriores. Finalmente, parece que en mi caso ni la propiedad IsBusy funciona correctamente ni la propiedad Url , pero el ReadyState parece ser lo que necesitaba, porque tiene el estado ‘Interactivo’ mientras carga los múltiples marcos y obtiene el estado ‘Completo’ solo después de cargarlo el último. Por lo tanto, sé cuándo la página está completamente cargada con todos sus componentes.

Espero que esto también ayude a otros 🙂

No parece desencadenar eventos DocumentCompleted / Navigated para archivos Javascript o CSS externos, pero sí para iframes. Como dice PK, compare la propiedad WebBrowserDocumentCompletedEventArgs.Url (aún no tengo el karma para hacer un comentario).

Si está utilizando WPF, hay un evento LoadCompleted .

Si se trata de Windows.Forms , el evento DocumentCompleted debería ser el correcto. Si la página que está cargando tiene marcos, su control WebBrowser disparará el evento DocumentCompleted para cada cuadro (vea aquí para más detalles). Sugeriría verificar la propiedad IsBusy cada vez que se IsBusy el evento y si es falso, entonces su página estará completamente cargada.

Usar el evento DocumentCompleted con una página con múltiples marcos nesteds no funcionó para mí.

Usé la biblioteca Interop.SHDocVW para lanzar el control WebBrowser así:

 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; } 

Este código funciona para mí cuando navego a una URL definida usando el método webBrowserControl.Navigate (url), pero no sé cómo controlar la página completa cuando se hace clic en un botón html usando htmlElement.InvokeMember (“click”).

Puedes usar el evento ProgressChanged; la última vez que se genera indicará que el documento está completamente renderizado:

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