TWebBrowser : Alle Input Felder, Bilder etc. auflisten
Hi !
Ich habe vor einen kleinen Website Analyzer zu schreiben. Soll heissen man gibt die URL ein und per knopfdruck surft der WebBrowser auf die Seite und in einer ListBox sollen dann alle Items aufgelistet werden. Also so dinge wie InputFelder, Bilder, Links etc. Gibt es da vielleicht schon beim TWebBrowser von Haus aus so ein Feature ? Oder muss ich da von hand den Quellcode durchscannen ? Wenn ja, wie ? THX Gruß Assun |
Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
Hallo,
ja, Document Object Model ist das Stichwort. Hier mal ein kleines Beispiel:
Delphi-Quellcode:
var z,count : Integer;
begin with WebBrowser1 do begin count := OleObject.document.images.Length; for z := 0 to Count-1 do Memo1.Lines.Add(OleObject.document.images.Item(z).Src); end; |
Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
Liste der Anhänge anzeigen (Anzahl: 1)
hab mal ein kleines sample angehängt, denn ich habe ein Problem.
Es klappt nich bei allen seiten !!!!!! denn auf Delphipraxis.net gehts zwar, nicht aber auf http://assun.de aber seht selbst unten im Anhang : |
Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
Hallo,
Du arbeitest auf deiner Seite mit Frames, darum musst Du erst mit Hilfe von
Delphi-Quellcode:
und dann
OleObject.document.frames.length
Delphi-Quellcode:
alle Frames über eine Schleife durchgehen.
OleObject.document.frames.items(z)
In dieser Schleife dann die Images auslesen. In dem Fall dann:
Delphi-Quellcode:
Wenn frames.length = 0 ist hast Du keine Frames und kannst den Code wie gehabt nehmen.
OleObject.document.frames.item(z).document.images.item(z).Src
|
Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
Also irgendwie peil ich das nicht so richtig :oops:
wenn ich folgenden code verwende :
Delphi-Quellcode:
Bringt er mir beim ausführen den Error :"Nicht implementiert" :gruebel:
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; var URL: OleVariant); var z,count : Integer; begin with WebBrowser1 do begin OleObject.document.frames.length; for z := 0 to Count-1 do OleObject.document.frames.items(z); Memo1.Lines.Add(OleObject.document.frames.item(z).document.images.item(z).Src); end; end; Was mache ich falsch ? |
Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
Hallo,
Du musst zwei Schleifen verschachtelt ausführen, dafür brauchst Du zwei Zählvariablen und zwei Countvariablen. die Anzahl Frames hast Du ermittelt aber nicht Count zugewiesen. Hab gerade nicht viel Zeit( :sharkylinchen: ), hier mal etwas Pseudocode:
Code:
Versuchs mal umzusetzen, sonst melde Dich wieder. :)
Count_1 = Anzahl Frames im Document
Schleife_1 0 to Count_1 begin Count_2 = Anzahl Images im Frame-Document Schleife_2 0 to Count_2 begin Images auslesen end end |
Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
Liste der Anhänge anzeigen (Anzahl: 2)
also ich habe den Code versucht umzusetzen :
Delphi-Quellcode:
beim compilieren bekomm ich zwar keinen Error, aber beim ausführen passiert wenn ich aud http://delphi-Praxis.net navigiere gar nix und bei http://Assun.de kommt dieser Error :
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; var URL: OleVariant); var z,z2,count1,count2 : Integer; begin with WebBrowser1 do begin count1 := OleObject.document.frames.length; for z := 0 to Count1-1 do begin Count2 := OleObject.document.frames.item(z).document.images.item(z).Src; for z2 := 0 to Count2-1 do Memo1.Lines.Add(OleObject.document.images.Item(z).Src); end; end; end; end. http://home.arcor.de/assun/error.JPG Und ich habe keine Ahnung wieso. Ich habe unten mal sowohl die EXE als auch den Source angehängt, in der Hoffnung, dass mir vllt jemand helfen kann ;-) |
Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
Zitat:
|
Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
Folgender Code benötigt noch ein Treeview auf dem Formular:
Delphi-Quellcode:
procedure TFrmHTMLUpload.FillTreeView(WebBrowser: TWebBrowser);
var i,j, k :Integer; FormItem, Element, SubElement: OleVariant; root : TTreeNodes; child, child2, child3 : TTreeNode; s_type : string; begin root := TreeView1.Items; root.Clear; //count forms on document for I:=0 to WebBrowser.OleObject.Document.forms.Length -1 do begin FormItem := WebBrowser.OleObject.Document.forms.Item(I); if VariantIsObject(FormItem.Name) then child := root.AddChild(nil, 'Form'+IntToStr(i)+': '+FormItem.Name.Name) else child := root.AddChild(nil, 'Form'+IntToStr(i)+': '+FormItem.Name); child.ImageIndex := 3; For j:= 0 to FormItem.Length-1 do begin try Element := FormItem.Item(j); //when the fieldname is found, try to fill out child2 := root.AddChild(child, Element.Name+' = '+Element.Value); s_type := Element.Type; if s_type = 'submit' then child2.ImageIndex := 1 else if s_type = 'text' then child2.ImageIndex := 0 else if s_type = 'file' then child2.ImageIndex := 2 else if s_type = 'hidden' then child2.ImageIndex := 4 else if s_type = 'checkbox' then child2.ImageIndex := 5 else if s_type = 'radio' then child2.ImageIndex := 6 else if s_type = 'select-one' then child2.ImageIndex := 7 else child2.ImageIndex := -1; child3 := root.AddChild(child2, s_type); child3.ImageIndex := -1; if s_type = 'text' then begin child3 := root.AddChild(child2, 'MaxLen='+IntToStr(Element.maxLength)); child3.ImageIndex := -1; end else if s_type = 'select-one' then begin for k := 0 to Element.Options.Length-1 do begin SubElement := Element.Options.Item(k); child3 := root.AddChild(child2, SubElement.Text+ ' = <'+SubElement.Value+'>'); child3.ImageIndex := -1; end; // ShowMessage(IntToStr(Element.Options.Length)); end; if (s_type = 'hidden') then else ListBox1.Items.Add(Element.Name); except on E:Exception do root.AddChild(child, E.Message); end; end; end; if root.Count > 0 then root.GetFirstNode.Expand(True); end; |
Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
Delphi-Quellcode:
da bringt er mir "undefinierter Bezeichner" obwohl ein TreeView namens TreeView1 existiert :gruebel:
root := TreeView1.Items;
|
Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
Zitat:
Hier musst du einfach selbstständig etwas Forschungsarbeit in der OH leisten. |
Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
Mist. ich hab doch kein Plan von dem scheiss ;-)
kann man meinen falschen Code oben nicht einfach korrigieren ? |
Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
Hallo,
hab mal deinen Code überarbeitet. Die falschen Zeilen sind auskommentiert, neue durch //neu gekennzeichnet. In einem Post zuvor hatte ich geschrieben : "Wenn frames.length = 0 ist hast Du keine Frames ", deshalb der Bereich mit den neuen Zeilen.
Delphi-Quellcode:
getestet u.a. mit:
var z,z2,count1,count2 : Integer;
begin with WebBrowser1 do begin count1 := OleObject.document.frames.length; if count1 = 0 then//keine frames //neu begin //neu count1 := OleObject.document.images.length; //neu * for z := 0 to Count1-1 do //neu Memo1.Lines.Add(OleObject.document.images.Item(z).Src); //neu end //neu else //neu for z := 0 to Count1-1 do begin //Count2 := OleObject.document.frames.item(z).document.images.item(z).Src; Count2 := OleObject.document.frames.item(z).document.images.length; //neu for z2 := 0 to Count2-1 do //Memo1.Lines.Add(OleObject.document.images.Item(z).Src); Memo1.Lines.Add(OleObject.document.frames.item(z).document.images.item(z2).Src);//neu end; end; ohne Frames = Delphi-Praxis mit Frames = SELFHTML Framesbeispiel Deine Web-Seite erzeugt bei mir auch die Fehlermeldung "Zugriff verweigert", die Ursache wird in deinen Seiten liegen, da ich so ca 10 andere mit dem Code getestet hab. //Edit: Wenn jemand den Grund kennt, oder eine Lösung hat, wäre schön. //Edit2: den Code von shmia konnte ich nicht testen, da mein Delphi die Funktion VariantIsObject nicht kennt und Google auch nicht. //Edit3: Zeile mit //neu * eingefügt |
Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
Zitat:
VariantIsObject ist eine kleine, nützliche Hilfsfunktion, die prüft, ob in einem OleVariant ein Dispatch-Interface steckt.
Delphi-Quellcode:
function VariantIsObject(const value:OleVariant):boolean;
begin result := (VarType(value) = varDispatch); end; |
Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
Zitat:
Der Code von shmia funktioniert gut und liest alle Elemente aus dem Tag <FORMS> aus, berücksichtigt aber keine Frames. Damit kann die Zugriffsverweigerung des IE/Webbrowsers leider auch nicht umgangen werden. Im Zusammenhang mit Frames habe ich festgestellt das OleObject.document.frames.length auch den Tag <iframe> berücksichtigt :wall: Also wären folgende Situationen abzufangen: - Framesets - verschachtelte Framesets - Seite incl. IFrame - Seite incl. IFrame in einem Frame - IFrame innerhalb eines IFrame :gruebel: also rekursiv Bei der Seite http://assun.de/ kann die Zugriffverweigerung umgangen werden: 1. Auslesen der Adresse der Seite die im Frame angezeigt wird 2. Laden der Seite im WebBrowser 3. auslesen der Images wie gehabt
Delphi-Quellcode:
ist aber keine Ideal-Lösung.
...
sFrameName := WebBrowser1.OleObject.Document.all.tags('FRAME').Item(0).getattribute('src',0); Webbrowser.Navigate(sFrameName); ... |
Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
Hi folks,
für den Fall, dass dieses Problem noch nicht ganz gelöst ist, möchte ich euch noch diesen Hinweis geben: klick. Vielleicht hilft er ja weiter. Grüße vom marabu |
Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
Hallo,
@marabu kann der WebBrowser nicht :( Fehlermeldung:
Code:
Die Methode 'Window' wird vom Automationsobjekt nicht unterstützt.
|
Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
Zitat:
Delphi-Quellcode:
Grüße vom marabu
procedure TWebForm.FramesButtonClick(Sender: TObject);
var win: IHTMLWindow2; doc: IHTMLDocument2; fc: IHTMLFramesCollection2; begin doc := WebBrowser.Document as IHTMLDocument2; win := doc.parentWindow; fc := win.frames; ShowMessage(Format('%d frames found', [fc.length])); end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:57 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