Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   TWebBrowser - zwei Formulare nacheinander ausfüllen (https://www.delphipraxis.net/171367-twebbrowser-zwei-formulare-nacheinander-ausfuellen.html)

Sir Rufo 3. Nov 2012 21:02

AW: TWebBrowser - zwei Formulare nacheinander ausfüllen
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.

sx2008 3. Nov 2012 23:10

AW: TWebBrowser - zwei Formulare nacheinander ausfüllen
 
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 = '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, 'Type='+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;
         end;
      except
        on E:Exception do
         root.AddChild(child, E.Message);
      end;
    end;
  end;

   if root.Count > 0 then
      root.GetFirstNode.Expand(True);
end;

Marco Steinebach 4. Nov 2012 13:43

AW: TWebBrowser - zwei Formulare nacheinander ausfüllen
 
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

Sir Rufo 4. Nov 2012 13:52

AW: TWebBrowser - zwei Formulare nacheinander ausfüllen
 
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.

Marco Steinebach 6. Nov 2012 08:18

AW: TWebBrowser - zwei Formulare nacheinander ausfüllen
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:36 Uhr.
Seite 2 von 2     12   

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