2010-07-13 6 views
8

He estado investigando esto y todos parecen estar de acuerdo en que la solución es verificar el ReadyState del navegador web hasta que esté configurado en Completar.DocumentBrowser DocumentCompleted evento disparado más de una vez

Pero en realidad el evento a veces se dispara con el ReadyState establecido en Completar varias veces.

No creo que haya una solución con ese Web Browser asqueroso .NET, pero podría haber uno si utilizo el componente DOM subyacente.

El único problema es que no tengo idea de cómo acceder al componente DOM detrás del WebBrowser que dispara el evento DocumentCompleted.

Respuesta

33

DocumentCompleted se activará para cada fotograma en la página web. La manera más difícil es contar fuera de los marcos, que muestra cómo acceder al DOM:

private int mFrameCount; 

private void startNavigate(string url) { 
    mFrameCount = 0; 
    webBrowser1.Navigate(url); 
} 

private void DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { 
    mFrameCount += 1; 
    bool done = true; 
    if (webBrowser1.Document != null) { 
    HtmlWindow win = webBrowser1.Document.Window; 
    if (win.Frames.Count > mFrameCount && win.Frames.Count > 0) done = false; 
    } 
    if (done) { 
    Console.WriteLine("Now it is really done"); 
    } 
} 

La manera fácil es comprobar la dirección URL que ha completado la carga:

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    if (e.Url.Equals(webBrowser1.Url)) { 
     Console.WriteLine("Now it is really done"); 
    } 
} 
+0

La manera fácil de esta respuesta lo hizo por mí. Aunque estoy usando el control axWebBrowser1. Terminé usando lo siguiente. if (e.uRL.Equals (axWebBrowser1.LocationURL)) – IamBatman

+0

¡¡Genial !! Muchas gracias – Grcn

0

Esto probablemente sucedería si la página utiliza Javascript o <meta refresh> para redirigir a otra página.

Si es así, no hay una buena solución.

0

no puedo encontrar nada eso dará 100% de certeza. El ejemplo mencionado (e.Url.Equals (webBrowser1.Url)) puede funcionar para un WebBrowser.Navigate simple (url), sin embargo, en mi caso, hago clic en nodos en el código para abrir nuevos marcos en marcos existentes. La mayoría de las veces que el fuego de "Navegación" y "Documento completado" será el mismo, pero de nuevo NO siempre. "isBusy = false" y "ReadyState = Complete" siempre serán el caso cuando esté terminado (al menos hasta el momento) pero también algunas veces tendrá este estado cuando aún se esté cargando. Los marcos de conteo también me parecen inútiles, en un caso DocumentCompleted se dispara 23 veces, sin embargo, todos los fotogramas y los fotogramas sub (sub sub y así sucesivamente) son 14 en total.

Lo único que parece funcionar es esperar un corto período (1 o 2 segundos?) Para ver si sucede algo (cualquier evento disparado, cualquier estado cambia).

Hmm, encontré otra solución para mí. A menudo no estamos interesados ​​en que se cargue toda la página, a menudo queremos que existan ciertos elementos. Entonces, después de cada DocumentCompleted y cuando "isBusy = false" y "ReadyState = Complete" podemos buscar el DOM si este elemento existe.

Cuestiones relacionadas