Hallo,
ich habe gerade ein Problem mit OnDocumentComplete und OnBeforeNavigate2.
Ich möchte Daten einer Website auslesen, dazu sollte sie ja fertig geladen sein.
Nun wird leider nicht immer das OnDocumentComplete der Hauptseite ausgelöst, die OnDocumentComplete-Events der Unterframes hingegen schon.
In 90% der Fälle geht alles gut, jedoch manchmal eben nicht.
In den Frames werden Ads geladen, z.B. GoogleAds.
Ich vermute, dass eines der Frames manchmal Probleme macht.
Mein Lösungsansatz war nun, in OnBeforeNavigate2 die unerwünschet URLs der Frames zu canceln und nur die gewünschte
URL der eigentlichen Website durchzulassen.
Die Ad-URLs werden nun auch geblockt. Die Haupt-
URL ist im Webbrowsercontrol vollständig und ohne Frameinhalte zu sehen
Im Logfile stehen dann anschliessend alle OnBeforeNavigate2-Einträge der Frames aber leider wird das OnDocumentComplete der Hauptseite, die ja nicht gecanceled wurde, nun generell nicht mehr ausgelöst.
Der OnDocumentComplete sieht so aus:
Delphi-Quellcode:
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch;
var 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
Append(LogFile);
Writeln(LogFile, '
TopWebbrowser! Document is complete.');
Writeln(LogFile,
URL);
CloseFile(LogFile);
end
else
begin
Document := CurWebrowser.Document;
WindowName := Document.ParentWindow.
Name;
Append(LogFile);
Writeln(LogFile, '
Frame ' + WindowName + '
is loaded.');
Writeln(LogFile,
URL);
CloseFile(LogFile);
end;
end;
Der OnBeforeNavigate2-Event sieht so aus:
Delphi-Quellcode:
procedure TForm1.WebBrowser1BeforeNavigate2(Sender: TObject;
const pDisp: IDispatch;
var URL, Flags, TargetFrameName, PostData,
Headers: OleVariant;
var Cancel: WordBool);
begin
Append(LogFile);
Writeln(LogFile, '
BeforeNavigate2');
Writeln(LogFile, '
URL: ' +
URL);
Writeln(LogFile, '
<<< ------------------------------------------- BeforeNavigate2');
CloseFile(LogFile);
if Pos('
http://www.HauptURL.de/', AnsiLowerCase(
URL)) > 0
then Cancel := False
else Cancel := True;
end;
Ich arbeite mit Delpi7 Professional, es ist IE 8 installiert.
Danke im Voraus,
Frank