![]() |
TWebBrowser - zwei Formulare nacheinander ausfüllen
Hallo zusammen,
Ich möchte mich, mittels TWebBrowser, auf einer Seite einloggen, und, nachdem ich eingeloggt bin, auf der anschließend erscheinenden Seite eine Nummer eingeben. Bis nach dem einloggen klappt alles ganz prima, nur, wenn ich auf der Folgeseite das Feld für die Nummer ausfüllen will, knallt's. Kann mir bitte jemand verraten warum?
Delphi-Quellcode:
Viele Grüße
procedure TForm1.Button1Click(Sender: TObject);
var x: variant; begin // br ist meine TWebBrowser-Komponente - mit unveränderten Standardwerten br.Navigate ('https://secure.freedomscientific.com/DealerILM/default.asp'); while br.ReadyState <> READYSTATE_COMPLETE do Application.ProcessMessages; x := br.OleObject.document.forms.item('input'); x.Elements.item('username').value := 'bla'; x.Elements.item('password').value := 'bla'; x.Elements.item('agree').click; x.submit; while br.ReadyState <> READYSTATE_COMPLETE do Application.ProcessMessages; // bis hierhin läuft alles ganz prima, und die Seite zur Eingabe der Nummer wird auch angezeigt. x := br.OleObject.document.forms.item('input'); x.Elements.Item('serial').value := '24520'; // und genau diese Zuweisung verursacht den Fehler. end; Marco |
AW: TWebBrowser - zwei Formulare nacheinander ausfüllen
Welcher Fehler??
![]() Ich rate jetzt einfach mal - du bekommst eine Zugriffsverletzung, oder? Wann immer du mit der Funktion Items() ein Objekt holst muss du prüfen ob es überhaupt existiert:
Delphi-Quellcode:
x := br.OleObject.document.forms.item('input');
if not Assigned(x) then raise Exception.CreateFmt('Web-Formalar %s nicht gefunden', ['input']); x.Elements.Item('serial').value := '24520'; |
AW: TWebBrowser - zwei Formulare nacheinander ausfüllen
Joa richtig, ;-), eine Zugriffsverletzung.
Der Tipp mit "assigned" ist schonmal gold wert, mir war nämlich nicht klar, auf was ich prüfen soll. Kann es sein, daß die Seite noch nicht fertig geladen ist? Oder anders gefragt: taugt die prüfung in der While-Schleife, oder gibt's 'ne bessere Methode um rauszufinden, wann er mit dem Seitenaufbau fertig ist? Vielen Dank schonmal und viele Grüße Marco p.s.:
Delphi-Quellcode:
findet mein Compiler überhaupt nicht witzig, da es "inkompatible Typen" sind - wohl weil's 'ne Variant ist...
if not assigned (x) then
|
AW: TWebBrowser - zwei Formulare nacheinander ausfüllen
Um darauf zu warten, dass eine Webseite komplett geladen ist würde ich folgenden Code verwenden:
Delphi-Quellcode:
Manchmal funktioniert das Submitten eines Webformulars nicht richtig; man kann das so umgehen:
procedure WaitForBrowser(WebBrowser:TWebBrowser);
begin while WebBrowser.ReadyState <> READYSTATE_COMPLETE do begin Application.ProcessMessages; Sleep(50); end; end;
Delphi-Quellcode:
Um zu prüfen, ob ein Variant ein Dispatch-Interface enthält:
procedure SubmitWebForm(webform:OleVariant);
var i : Integer; formitem : OleVariant; itemtype, itemname : string; begin // Schleife über alle Items eines WebFormulars For i:= webform.Length-1 downto 0 do begin formitem := webform.Item(i); itemtype := UpperCase(formitem.Type); itemname := UpperCase(formitem.Name); // if it's a submit button: click it if itemtype = 'SUBMIT' then begin formitem.Click; Exit; end else if (itemtype='BUTTON') and (itemname='SUBMIT') then begin formitem.Click; Exit; end end; // try default submit Method webform.submit; end;
Delphi-Quellcode:
Damit sieht der Test so aus:
function VarIsDispatchObject(const v : Variant): Boolean;
var vt : Integer; begin vt := VarType(v) and not varByRef; Result := (vt = varDispatch); end;
Delphi-Quellcode:
x := br.OleObject.document.forms.item('input');
if not VarIsDispatchObject(x) then raise Exception.CreateFmt('Web-Formalar %s nicht gefunden', ['input']); x.Elements.Item('serial').value := '24520'; |
AW: TWebBrowser - zwei Formulare nacheinander ausfüllen
Ich mache das mit dem Warten immer so:
Code:
repeat
Application.ProcessMessages; until ((Browser.ReadyState = READYSTATE_COMPLETE) and (Browser.Busy = False)); Auf alle Fälle würde ich kein Sleep nehmen. Hier wäre noch eine Variante:
Code:
procedure Delay(ATime: Integer);
var Start : Integer; begin Start := GetTickCount; repeat Application.ProcessMessages; until (GetTickCount - Start) > ATime; end; repeat Delay(100); until ((Browser.ReadyState = READYSTATE_COMPLETE) and (Browser.Busy = False)); |
AW: TWebBrowser - zwei Formulare nacheinander ausfüllen
Zitat:
Sleep gibt die Kontrolle an andere Prozesse ab, was ja genau das ist was während des Wartens auf den Internet Explorer gebraucht wird. Ohne Sleep würde die eigene Anwendung bis zu 100% Prozent (50% bei Dual-Core) an Rechenleistung unnötigerweise verbrauchen. Wer's nicht glaubt und selber testen möchte: * neues Projekt anlegen * neuen Button auf's Formular
Delphi-Quellcode:
Der Nachteil von sleep(50) ist, dass die Reaktionszeit auf Mausklicks, Tastendrücke um bis zu 50ms verzögert wird, aber diese Verzögerung ist so kurz, dass sie nicht zu spüren ist.
procedure TForm1.Button1Click(Sender: TObject);
begin while not Application.Terminated do Application.ProcessMessages; end; Des weiteren könnte der Webbrowser schon fertig geladen haben aber die eigene Anwendung bekommt dies erst nach 50ms mit. Auch das ist kein Beinbruch; im Gegenteil, wenn die Webseite komplett geladen ist sollte man dem Browser besser noch etwas Zeit geben eventuelle Java-Scripts abzuarbeiten. |
AW: TWebBrowser - zwei Formulare nacheinander ausfüllen
OK, ich hab es ausprobiert, überzeugt ;)
|
AW: TWebBrowser - zwei Formulare nacheinander ausfüllen
Hallo,
und erstmal vielen Dank für die raschen Antworten. Dank deines Codes Sx2008 bin ich dem Problem auf die Spur gekommen. Wenn ich nacheinander auf die Elemente des Forms zugreife, muß ich feststellen, daß es mein Feld "serial" gar nicht gibt, obwohl es angezeigt wird. Hä? Könnte das ein Cache-Problem oder so sein? Und wenn, wie kann man das Lösen? Sowas blödes, ich dachte,daß, was angezeigt wird ist auch daß, auf das ich via b.OleObject... zugreifen kann.... Viele Grüße Marco |
AW: TWebBrowser - zwei Formulare nacheinander ausfüllen
Es hilft doch sich den HTML-Code anzusehen ... oder?
|
AW: TWebBrowser - zwei Formulare nacheinander ausfüllen
Zitat:
Also dachte ich, bistde schlau, logstde dich ein und greifst, nachdem dein Programm auf "submit" gteklickt hat, eben auf dieses Feld zu. Aber genau das gibt's im Quelltext nicht, obwohls angezeigt wird, und mir ist nicht klar, wieso das so ist. Kann natürlich sein, daß die Seite, via Script oder sonstwie, die Formulare aufbaut, keine Ahnung, ich hab die Seite nicht programmiert. Vielleicht hat ja jemand 'ne idee? Viele Grüße Marco |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 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