Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   TWebbrowser and Javascript (https://www.delphipraxis.net/191204-twebbrowser-javascript.html)

wschrabi 20. Dez 2016 10:03

TWebbrowser and Javascript
 
Hallo Leute,
FRAGE: Ich lade eine Website mit TWebbrowser in Delphi XE6. In dieser Website werden nach dem Laden Javascript Functionen ausgeführt.
Jetzt hat er nach dem Documentscomplete Aufruf, die JS änderungen in der Site noch nicht fertig gemacht. Dh Wenn ich jetze die Seite parse, sind die Werte noch nicht in den HTML Text drin.
Wie kann ich TWebbrowser veranlassen, dass er erst DocumentsComplete ausführt, wenn Javascript die Sache beendet hat.

Zur Zeit lade ich die Site max 8 mal in der Hoffnung, dass es manchmal schneller geht und die Werte in der Seite drin sind. Das klappt auch doch sind viele unnötige Ladezyclen nötig.

Weiß wer Rat?
DANKE HERZLICH

Walter

PS: hab das hier gefunden: http://forums.codeguru.com/showthrea...age-to-process Wie ich das recht verstehe, soll man ein ShowModal Window nach dem das Document geloaded wurde öffnen und dies timergesteuert nach ca 5 sec wieder schließen. Taugt das was?

win568 20. Dez 2016 11:04

AW: TWebbrowser and Javascript
 
Hi

Wenn du den EmbeddedWB verwendest, kannst du per Doc2.scripts.length abfragen, wieviele Scripte geladen wurden bzw.
mit folgendem Code warten, bis alle geladen sind:

procedure WaitForScriptLoaded;
var
lComplete: Boolean;
lScript: IHTMLScriptElement;
begin
// Warte bis die Scripts geladen wurden
lComplete := FALSE;
while not lComplete do begin
Forms.Application.ProcessMessages;
if Doc2.scripts.length >= 1 then begin
lScript := Doc2.scripts.Item(0,0) as IHTMLScriptElement;
if (lScript.readyState = 'complete') or
(lScript.readyState = 'loaded') then begin
lComplete := True;
end;
end;
Sleep(100);
end;
end;

Wenn du keinen EmbeddedWB hast, musst du erst das Document ermitteln.
Die Abfrage kannst du um OnDocumentComplete machen. Hier solltest du folgendes machen:

procedure Form.DoOnEWBDocumentComplete(ASender: TObject; const pDisp: IDispatch;
var URL: OleVariant);
var
lCurWebbrowser: IWebBrowser;
lTopWebbrowser: IWebBrowser;
begin
try
// Wurde das Document auch wirklich vollständig geladen ??
// DocumentComplete wird auch für die eingebetteten Frames aufgerufen !!!
lCurWebbrowser := pDisp as IWebBrowser;
lTopWebBrowser := (ASender as TWB).DefaultInterface;
// Erst wenn das Dokument komplett geladen wurde, dann
// dürfen die Aktionen durchgeführt werden
if (lCurWebbrowser = lTopWebBrowser) and
(FWB.ReadyState = READYSTATE_COMPLETE) then begin

-> Hier kannst du dann warten

wschrabi 20. Dez 2016 16:28

AW: TWebbrowser and Javascript
 
DANKE, ich habe keinen EMbeddedWB
BESTEN DANK AUCH FÜR DEIN SCRIPT.
Werde estesten.

Blöde Frage (sorry): Was ist FWB? Woher die Methode ReadyState?

Zitat:

if (lCurWebbrowser = lTopWebBrowser) and
(FWB.ReadyState = READYSTATE_COMPLETE) then begin
BLöde Frage: Was ist ein Embedded WB? Ich kenne nur TWebbrowser in Delphi . Danke für die Aufklärung.

Ich hab das mit dem LADEN so gelöst: (fast gleich)
Delphi-Quellcode:
procedure TForm1.WebBrowser1DocumentCompleteFULL(ASender: TObject;
  const pDisp: IDispatch; const URL: OleVariant);
var
  CurWebrowser: IWebBrowser;
  TopWebBrowser: IWebBrowser;
  Document: OleVariant;
  WindowName: string;
begin
  CurWebrowser := pDisp as IWebBrowser;
  TopWebBrowser := (ASender as TWebBrowser).DefaultInterface;
  if (CurWebrowser = TopWebBrowser) then
    begin
    WebBrowser1DocumentComplete(ASender, pDisp, URL);
    end
  else
  begin
    Document := CurWebrowser.Document;
    WindowName := Document.ParentWindow.Name;
    //ShowMessage(Format('Frame "%s" was loaded', [WindowName]));
  end;
end;
und in WebBrowser1DocumentComplete(ASender, pDisp, URL); arbeite ich die SEite.
Doch da ist JS noch nicht abgearbeitet. Daher meine Frage was mit dem
Zitat:

(FWB.ReadyState = READYSTATE_COMPLETE)
ist.
Wartet er da bis die JS gemacht ist? WOher diese Bool Variable?


Nochwas: Dacht mit sleep(1000) wir alles gewartet auch das Abarbeiten der JS in der Seite. Stimmt das nicht, steht hier:
Zitat:

I had the same problem, and the solution I found is:
this inside it's own form, all it is is a window with text of "Please wait a moment", and because it's showdialog() you freeze all input and code within the thread, but you don't hold up the thread to prevent the loading of the post processed data after documentcompleted is fired.
mfg
Walter


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:55 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