Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TWebBrowser : Alle Input Felder, Bilder etc. auflisten (https://www.delphipraxis.net/50893-twebbrowser-alle-input-felder-bilder-etc-auflisten.html)

Assun 2. Aug 2005 12:50


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

Lannes 2. Aug 2005 13:06

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;

Assun 2. Aug 2005 14:52

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 :

Lannes 2. Aug 2005 16:09

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:
OleObject.document.frames.length
und dann
Delphi-Quellcode:
OleObject.document.frames.items(z)
alle Frames über eine Schleife durchgehen.
In dieser Schleife dann die Images auslesen.
In dem Fall dann:
Delphi-Quellcode:
OleObject.document.frames.item(z).document.images.item(z).Src
Wenn frames.length = 0 ist hast Du keine Frames und kannst den Code wie gehabt nehmen.

Assun 2. Aug 2005 17:23

Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
 
Also irgendwie peil ich das nicht so richtig :oops:

wenn ich folgenden code verwende :

Delphi-Quellcode:
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;
Bringt er mir beim ausführen den Error :"Nicht implementiert" :gruebel:

Was mache ich falsch ?

Lannes 2. Aug 2005 21:25

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:
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
Versuchs mal umzusetzen, sonst melde Dich wieder. :)

Assun 4. Aug 2005 16:51

Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
 
Liste der Anhänge anzeigen (Anzahl: 2)
also ich habe den Code versucht umzusetzen :

Delphi-Quellcode:
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.
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 :

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 ;-)

Union 4. Aug 2005 16:59

Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
 
Zitat:

Zitat von Assun
also ich habe den Code versucht umzusetzen :

Delphi-Quellcode:
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.
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 :

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 ;-)

Wenn Du in Deinen Frames Cross-Site Scripting verwendest, weigert sich der IE Dir Zugriff darauf zu geben.

shmia 4. Aug 2005 16:59

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;

Assun 4. Aug 2005 17:07

Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
 
Delphi-Quellcode:
 root := TreeView1.Items;
da bringt er mir "undefinierter Bezeichner" obwohl ein TreeView namens TreeView1 existiert :gruebel:

shmia 4. Aug 2005 17:12

Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
 
Zitat:

Zitat von Assun
Delphi-Quellcode:
 root := TreeView1.Items;
da bringt er mir "undefinierter Bezeichner" obwohl ein TreeView namens TreeView1 existiert :gruebel

Mein Beispiel ist für Delphi 5. Du verwendest anscheinend D2005.
Hier musst du einfach selbstständig etwas Forschungsarbeit in der OH leisten.

Assun 4. Aug 2005 17:31

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 ?

Lannes 4. Aug 2005 22:09

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:
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;
getestet u.a. mit:
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

shmia 5. Aug 2005 09:54

Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
 
Zitat:

Zitat von Lannes
//Edit2: den Code von shmia konnte ich nicht testen, da mein Delphi die Funktion VariantIsObject nicht kennt und Google auch nicht.

Ups, hatte ich vergessen.
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;

Lannes 5. Aug 2005 15:21

Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
 
Zitat:

Zitat von shmia
...
Ups, hatte ich vergessen.
VariantIsObject ist eine kleine, ...

@shmia : Besten Dank

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:
...
sFrameName := WebBrowser1.OleObject.Document.all.tags('FRAME').Item(0).getattribute('src',0);
Webbrowser.Navigate(sFrameName);
...
ist aber keine Ideal-Lösung.

marabu 6. Sep 2005 20:57

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

Lannes 6. Sep 2005 21:58

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.

marabu 7. Sep 2005 07:13

Re: TWebBrowser : Alle Input Felder, Bilder etc. auflisten
 
Zitat:

Zitat von Lannes
kann der WebBrowser nicht

Wetten dass?

Delphi-Quellcode:
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;
Grüße vom marabu


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