AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke TWebBrowser - zwei Formulare nacheinander ausfüllen
Thema durchsuchen
Ansicht
Themen-Optionen

TWebBrowser - zwei Formulare nacheinander ausfüllen

Ein Thema von Marco Steinebach · begonnen am 2. Nov 2012 · letzter Beitrag vom 6. Nov 2012
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#11

AW: TWebBrowser - zwei Formulare nacheinander ausfüllen

  Alt 3. Nov 2012, 21:02
Seltsam, wenn es angezeigt wird, dann muss es auch im Quelltext vorhanden sein ...

Im Anhang habe ich ein kleines Testprogramm mit einem TWebBrowser.
Damit bis auf die Seite surfen und dann auf dem Analyzer-Tab auf "Untersuchen" klicken.
Jetzt sollten dort alle Form-Elemente (INPUT, TEXTAREA, SELECT, BUTTON) aufgelistet werden, die es auf der aktuellen Seite gibt.

Schau mal, ob das entsprechende Eingabefeld aufgelistet wird ... wenn es da ist, sollte es auch angezeigt werden.

Die Quellen kann ich dir gerne zur Verfügung stellen, allerdings ist da auch einiges mit Generics drin, so dass dies mit Delphi 5 nicht läuft.
Angehängte Dateien
Dateityp: zip MSHTML_Tools_Forms.zip (922,9 KB, 18x aufgerufen)
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 15. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#12

AW: TWebBrowser - zwei Formulare nacheinander ausfüllen

  Alt 3. Nov 2012, 23:10
Eine HTML-Seite kann mehr als ein Web-Formular enthalten.
Am Besten man lässt sich die Struktur in einem TreeView anzeigen.

Delphi-Quellcode:
function VariantIsObject(const value:OleVariant):boolean;
begin
   result := (VarType(value) = varDispatch);
end;


procedure Browser2TreeView(WebBrowser: TWebBrowser; root:TTreeNodes);
var
  i,j, k :Integer;
  FormItem, Element, SubElement: OleVariant;
  child, child2, child3 : TTreeNode;
  s_type : string;

begin
   Assert(Assigned(WebBrowser));
   Assert(Assigned(root));

   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 := lowercase(Element.Type);

         if s_type = 'submitthen
            child2.ImageIndex := 1
         else if s_type = 'textthen
            child2.ImageIndex := 0
         else if s_type = 'filethen
            child2.ImageIndex := 2
         else if s_type = 'hiddenthen
            child2.ImageIndex := 4
         else if s_type = 'checkboxthen
            child2.ImageIndex := 5
         else if s_type = 'radiothen
            child2.ImageIndex := 6
         else if s_type = 'select-onethen
            child2.ImageIndex := 7
         else
            child2.ImageIndex := -1;

         child3 := root.AddChild(child2, 'Type='+s_type);
         child3.ImageIndex := -1;


         if s_type = 'textthen
         begin
            child3 := root.AddChild(child2, 'MaxLen='+IntToStr(Element.maxLength));
            child3.ImageIndex := -1;
         end
         else if s_type = 'select-onethen
         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;
         end;
      except
        on E:Exception do
         root.AddChild(child, E.Message);
      end;
    end;
  end;

   if root.Count > 0 then
      root.GetFirstNode.Expand(True);
end;
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
491 Beiträge
 
Delphi 5 Enterprise
 
#13

AW: TWebBrowser - zwei Formulare nacheinander ausfüllen

  Alt 4. Nov 2012, 13:43
Hallo zusammen,
erstmal vielen Dank nochmal für die Hilfe! Super!
Nach etwas gebastel mußte ich feststellen, es ist ein Zeitproblem.
Warte ich nämlich nnicht, wie es ja sinnig ist, bis der Browser fertig ist, und lege dann los, sondern warte einfach 5 Sekunden, funktioniert alles prima.
also
Delphi-Quellcode:
for i := 0 to 100 do
begin
  Application.ProcessMessages;
  Sleep (50);
end;
  x := br.OleObject.document.forms.Item('input');
  x.Elements.Item('serial').value := '24520';
Irgendwie kriegt mein Programm nicht richtig mit, trotz br.ReadyStat, wann die Seite fertig ist. hä?

Hat dazu noch jemand 'ne Idee, weil der Ansatz ist nicht nur dirty, sondern ganz dirty.

Viele Grüße
Marco
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#14

AW: TWebBrowser - zwei Formulare nacheinander ausfüllen

  Alt 4. Nov 2012, 13:52
Auf den WebBrowser wartet man wie folgt:
Delphi-Quellcode:
procedure TMain_View.Browser_WebBrowserDocumentComplete( ASender : TObject; const pDisp : IDispatch;
  const URL : OleVariant );
var
  CurBrowser, TopBrowser : IWebBrowser;
begin
  CurBrowser := pDisp as IWebBrowser;
  TopBrowser := ( ASender as TWebBrowser ).DefaultInterface;
  if CurBrowser = TopBrowser
  then
    begin
      // Jetzt ist das Haupt-Dokument fertig geladen
    end;
end;
Allerdings hat man ein kleines Problem, wenn in der Website noch JavaScript enthalten ist, dass noch weitere Daten nachlädt.

Auch frames (nicht iframes) werden in einem eigenen Kontext geladen. ALso muss man auch hier noch aufpassen.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
491 Beiträge
 
Delphi 5 Enterprise
 
#15

AW: TWebBrowser - zwei Formulare nacheinander ausfüllen

  Alt 6. Nov 2012, 08:18
Hallo Zusammen,
Vielen Dank für eure Hilfe.
Ich denke, diese Seite ist eine definitive Zumutung, denn die Formulare werden, wie auch immer, via Skript aufgebaut. Es gibt also keine wirklich Chance festzustellen, wann die Seite fertig geladen ist.
Ich hab's jetzt schlicht so gemacht, daß ich
1. 3 Sekunden warte
2. warte, bis das gesuchte Formular vorhanden ist (varIsDispatchObject = true) und
3. warte, bis das Feld, das ich suche, da ist.
So funktioniert's - ist nicht sehr schön aber tut, was es soll.

Vielen Dank nochmal und viele Grüße
Marco
Marco Steinebach
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 10: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