Evento DocumentBpleser de WebBrowser disparado más de una vez

He estado investigando esto y todos parecen estar de acuerdo en que la solución es verificar ReadyState del navegador web hasta que esté configurado en Completar.

Pero en realidad, el evento a veces se dispara con el conjunto ReadyState para completar varias veces.

No creo que haya una solución con ese Web Browser asqueroso de .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.

DocumentCompleted se activará para cada fotogtwig en la página web. La forma más difícil es contar los cuadros, le 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 más fácil es verificar la URL que completó la carga:

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

Esto probablemente sucedería si la página usa Javascript o para redirigir a otra página.

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

No puedo encontrar nada que dé 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 fotogtwigs y los fotogtwigs 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.