Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi Warten bis der TWebBrowser fertig geladen hat? (https://www.delphipraxis.net/126577-warten-bis-der-twebbrowser-fertig-geladen-hat.html)

toms 28. Dez 2008 19:36


Warten bis der TWebBrowser fertig geladen hat?
 
Hallo

Wie kann man zuverlässig feststellen, ob ein TWebBrowser fertig geladen hat?

1. Wenn Wait() von der Code-Library verwendet wird,
kann die Applikation unter Umständen nicht mehr beendet werden, da der Browser den ReadyState = READYSTATE_COMPLETE nicht in jedem Fall erreicht.

Test:

Delphi-Quellcode:
Webbrowser1.Navigate('http://www.microsoft.com/surface/');
Wait(Webbrowser1);
ShowMessage('mich wirst du nie sehen!');
Dabei werden folgende Ereignisse nacheinander ausgelöst:

20:26:28 : OnBeforeNavigate2 (1)
20:26:28 : OnDownloadBegin (1)
20:26:28 : OnDownloadComplete (1)
20:26:28 : OnDownloadBegin (2)
20:26:29 : OnNavigateComplete2 (1)
20:26:29 : OnBeforeNavigate2 (2)
20:26:29 : OnNavigateComplete2 (2)
20:26:29 : OnDownloadComplete (2)
20:26:29 : OnDocumentComplete (Frame wtPage geladen )
20:26:30 : OnDocumentComplete (komplettes Dokument geladen)
20:26:30 : OnBeforeNavigate2 (3)
20:26:30 : OnDownloadBegin (3)
20:26:30 : OnDownloadComplete (3)
20:26:30 : OnDownloadBegin (4)
20:26:30 : OnDownloadComplete (4)

Auch der andere Ansatz von der Codlib von mir (Vergleich CurWebrowser = TopWebBrowser) bringt nicht
das gewünschte Ergebnis, da nach "OnDocumentComplete (komplettes Dokument geladen)" nochmals OnBeforeNavigate2 etc aufgerufen werden.

Dann gibt es noch die Möglichkeit, die obige Wait Procedure mit einem TimeOut zu erweitern, was
nicht mehr dazu führt, dass die Anwendung nicht mehr beendet werden kann.

Delphi-Quellcode:
function WaitForBrowser(WB: TWebbrowser; TimeOut: Integer = 8000): Boolean;
var
  StartTime, EndTime: DWORD;
begin
  Result := False;
  StartTime := GetTickCount;
  repeat
    Application.ProcessMessages;
    EndTime := GetTickCount;
  until (WB.ReadyState = READYSTATE_COMPLETE) or (Application.Terminated) or (EndTime - StartTime > TimeOut);
  Result := WB.ReadyState = READYSTATE_COMPLETE;
end;
Vielleicht hat ja jemand noch weitere Vorschläge?

jaenicke 28. Dez 2008 19:41

Re: Warten bis der TWebBrowser fertig geladen hat?
 
Schau mal hier:
OnDocumentComplete

Und so sollte das eigentlich immer korrekt funktionieren, auch wenn das Dokument aus Frames besteht.
// EDIT:
Sorry nicht richtig gelesen...

Ich hätte gedacht, dass OnDocumentComplete korrekt funktioniert nach der beschriebenen Vorgehensweise. Hast du eine Seite als Beispiel wo das nicht funktioniert?

toms 28. Dez 2008 19:45

Re: Warten bis der TWebBrowser fertig geladen hat?
 
Zitat:

Zitat von jaenicke
Schau mal hier:
OnDocumentComplete

Und so sollte das eigentlich immer korrekt funktionieren, auch wenn das Dokument aus Frames besteht.

Hallo Sebastian, nach dem OnDocumentComplete werden jedoch noch weitere Ereignisse ausgelöst was ja heissen muss, dass die Seite noch nicht fertig geladen ist?
(DefaultInterface = pDisp berücksichtigt bei Frames)

jaenicke 28. Dez 2008 19:51

Re: Warten bis der TWebBrowser fertig geladen hat?
 
Kann es sein, dass auf der Seite etwas per Skript passiert? Ich probiere es einmal aus.

Bisher hatte ich jedenfalls noch nie das Problem, dass der Quelltext einer Seite danach noch nicht komplett war.

toms 28. Dez 2008 20:00

Re: Warten bis der TWebBrowser fertig geladen hat?
 
Zitat:

Zitat von jaenicke
Kann es sein, dass auf der Seite etwas per Skript passiert? Ich probiere es einmal aus.

Bisher hatte ich jedenfalls noch nie das Problem, dass der Quelltext einer Seite danach noch nicht komplett war.

Ist gut möglich, dass im Hintergrund noch Scripts laufen.

Auch auf der CNN.com Seite werden nach dem "OnDocumentComplete (komplettes Dokument geladen)" weitere Ereignisse
ausgelöst.

Zitat:

20:57:36 : OnBeforeNavigate2 (1)
20:57:36 : OnDownloadBegin (1)
20:57:36 : OnDownloadComplete (1)
20:57:36 : OnDownloadBegin (2)
20:57:36 : OnNavigateComplete2 (1)
20:57:37 : OnBeforeNavigate2 (2)
20:57:37 : OnBeforeNavigate2 (3)
20:57:37 : OnNavigateComplete2 (2)
20:57:37 : OnDownloadComplete (2)
20:57:37 : OnDocumentComplete Frame csiDataIframecsi1
20:57:37 : OnDownloadBegin (3)
20:57:37 : OnBeforeNavigate2 (4)
20:57:37 : OnBeforeNavigate2 (5)
20:57:38 : OnBeforeNavigate2 (6)
20:57:38 : OnNavigateComplete2 (3)
20:57:38 : OnDownloadComplete (3)
20:57:38 : OnDocumentComplete Frame qv_iframe_44245
20:57:38 : OnNavigateComplete2 (4)
20:57:38 : OnDocumentComplete Frame
20:57:38 : OnNavigateComplete2 (5)
20:57:38 : OnDocumentComplete Frame
20:57:38 : OnNavigateComplete2 (6)
20:57:38 : OnDocumentComplete Frame
20:57:38 : OnDocumentComplete (komplettes Dokument geladen).
20:57:38 : OnBeforeNavigate2 (7)
20:57:38 : OnDownloadBegin (4)
20:57:38 : OnNavigateComplete2 (7)
20:57:38 : OnDownloadComplete (4)
20:57:38 : OnDocumentComplete Frame

jaenicke 28. Dez 2008 20:56

Re: Warten bis der TWebBrowser fertig geladen hat?
 
Du siehst aber an den Adressen, dass danach noch Skripts ausgeführt werden, die dazu dienen die Werbung anzuzeigen.
http://ads.cnn.com/...

Die Seite an sich war aber bereits fertig. Ob danach noch Skripts laufen, die dann irgendwann noch Änderungen an der Seite vornehmen kann man glaube ich nicht so einfach feststellen.
Aber ich kann schauen, ob das geht, wenn du das brauchst.

toms 30. Dez 2008 15:34

Re: Warten bis der TWebBrowser fertig geladen hat?
 
Zitat:

Zitat von jaenicke
Aber ich kann schauen, ob das geht, wenn du das brauchst.

Falls du etwas herausfindest, kannst du dich ja melden.


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:17 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz