![]() |
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. |
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; |
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:
Irgendwie kriegt mein Programm nicht richtig mit, trotz br.ReadyStat, wann die Seite fertig ist. hä?
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'; Hat dazu noch jemand 'ne Idee, weil der Ansatz ist nicht nur dirty, sondern ganz dirty. ;-) Viele Grüße Marco |
AW: TWebBrowser - zwei Formulare nacheinander ausfüllen
Auf den WebBrowser wartet man wie folgt:
Delphi-Quellcode:
Allerdings hat man ein kleines Problem, wenn in der Website noch JavaScript enthalten ist, dass noch weitere Daten nachlädt.
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; Auch frames (nicht iframes) werden in einem eigenen Kontext geladen. ALso muss man auch hier noch aufpassen. |
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 03:10 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz