WebBrowser DocumentCompleted-Ereignis ausgelöst, mehr als einmal
Ich habe seit Jahren dieses Zeug, und jeder scheint zu vereinbaren, dass die Lösung, die Prüfung der ReadyState
des Web-Browsers, bis auf "beendet" gesetzt.
Aber tatsächlich der Fall ist, manchmal ausgelöst, mit der ReadyState
auf Abgeschlossen gesetzt mehrmals.
Ich glaube nicht, dass es eine Lösung gibt mit diesem beschissenen .NET-WebBrowser, aber es könnte ein nutzen, wenn ich die zugrunde liegende DOM-Komponente.
Problem ist nur, ich habe keine Ahnung, wie Zugriff auf die DOM-Komponente, die hinter dem WebBrowser, der feuert das DocumentCompleted-Ereignis.
Du musst angemeldet sein, um einen Kommentar abzugeben.
DocumentCompleted Feuer, für jeden frame in der web-Seite. Der harte Weg ist die Zählung aus dem Rahmen, zeigt, wie Sie Zugriff auf das DOM:
Der einfache Weg ist, überprüfen Sie den URL, der Ladevorgang beendet:
Diesem würde wohl passieren, wenn die Seite benutzt Javascript oder
<meta refresh>
Umleitung zu einer anderen Seite.Wenn das so ist, es gibt keinen guten workaround.
Ich kann nichts finden, das gibt 100% Sicherheit.
Genannten Beispiel (e.Url.Equals(webBrowser1.Url)) für einen einfachen WebBrowser.Navigate(url), jedoch in meinem Fall klicke ich auf den Knoten im code zu öffnen, neue Bilder in vorhandene Rahmen. Meist die Anzahl der "Navigation" und "DocumentCompleted" Feuer wird das gleiche sein, aber wiederum NICHT immer. "isBusy = false" und "ReadyState = Abgeschlossen" wird immer der Fall sein, wenn es fertig ist (zumindest bisher), aber es wird auch ein paar mal diesen Zustand haben, wenn es noch geladen wird. Zählen Bilder auch für mich sinnlos, in einem Fall DocumentCompleted ausgelöst wird 23-mal, aber alle frames und sub(-sub-sub und so weiter) die Bilder sind 14 insgesamt.
Das einzige, was zu funktionieren scheint ist, warten Sie einen kurzen Zeitraum (1 oder 2 Sekunden?) um zu sehen, ob etwas passiert (keine Ereignisse gefeuert, alle Zustandsänderungen).
Hmm, ich fand eine andere Lösung für mich. Oft interessiert uns nicht die ganze Seite geladen wird, oft wollen wir bestimmte Elemente vorhanden ist. So kann nach jedem DocumentCompleted und wenn "isBusy = false" und "ReadyState = Komplette" suchen wir uns den DOM, wenn dieses element vorhanden ist.