AGB  ·  Datenschutz  ·  Impressum  







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

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 1 von 2  1 2   
Marco Steinebach

Registriert seit: 4. Aug 2006
490 Beiträge
 
Delphi 5 Enterprise
 
#1

TWebBrowser - zwei Formulare nacheinander ausfüllen

  Alt 2. Nov 2012, 14:48
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:
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;
Viele Grüße
Marco
Marco Steinebach
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

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

AW: TWebBrowser - zwei Formulare nacheinander ausfüllen

  Alt 2. Nov 2012, 17:11
Welcher Fehler??

http://www.chiark.greenend.org.uk/~s...m/bugs-de.html

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

Geändert von sx2008 ( 2. Nov 2012 um 17:15 Uhr)
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
490 Beiträge
 
Delphi 5 Enterprise
 
#3

AW: TWebBrowser - zwei Formulare nacheinander ausfüllen

  Alt 2. Nov 2012, 18:03
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.:
  if not assigned (x) then findet mein Compiler überhaupt nicht witzig, da es "inkompatible Typen" sind - wohl weil's 'ne Variant ist...
Marco Steinebach

Geändert von Marco Steinebach ( 2. Nov 2012 um 18:48 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

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

AW: TWebBrowser - zwei Formulare nacheinander ausfüllen

  Alt 2. Nov 2012, 19:29
Um darauf zu warten, dass eine Webseite komplett geladen ist würde ich folgenden Code verwenden:
Delphi-Quellcode:
procedure WaitForBrowser(WebBrowser:TWebBrowser);
begin
   while WebBrowser.ReadyState <> READYSTATE_COMPLETE do
   begin
      Application.ProcessMessages;
      Sleep(50);
   end;
end;
Manchmal funktioniert das Submitten eines Webformulars nicht richtig; man kann das so umgehen:
Delphi-Quellcode:
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 = 'SUBMITthen
      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;
Um zu prüfen, ob ein Variant ein Dispatch-Interface enthält:
Delphi-Quellcode:
function VarIsDispatchObject(const v : Variant): Boolean;
var
   vt : Integer;
begin
   vt := VarType(v) and not varByRef;
   Result := (vt = varDispatch);
end;
Damit sieht der Test so aus:
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';
  Mit Zitat antworten Zitat
Benutzerbild von MuTzE.Y85
MuTzE.Y85

Registriert seit: 11. Apr 2006
152 Beiträge
 
#5

AW: TWebBrowser - zwei Formulare nacheinander ausfüllen

  Alt 3. Nov 2012, 14:26
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));
LAN-PC: C2Q Q9550 @ 4004 MHz @ 1.232 V @ Mugen 2 | DFI LANParty JR P45-T2RS | G.Skill 4GB DDR2-1000 CL5 | ZOTAC GTX 280 @ GTX 285 @ 1.06 V | WD Caviar Blue 320GB / WD Caviar Black 640GB | BeQuiet DPP P7 450W | Antec Mini P180

Geändert von MuTzE.Y85 ( 3. Nov 2012 um 14:29 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

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

AW: TWebBrowser - zwei Formulare nacheinander ausfüllen

  Alt 3. Nov 2012, 15:15
Auf alle Fälle würde ich kein Sleep nehmen.
Doch, genau das ist nötig.
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:
procedure TForm1.Button1Click(Sender: TObject);
begin
   while not Application.Terminated do
      Application.ProcessMessages;
end;
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.
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.
  Mit Zitat antworten Zitat
Benutzerbild von MuTzE.Y85
MuTzE.Y85

Registriert seit: 11. Apr 2006
152 Beiträge
 
#7

AW: TWebBrowser - zwei Formulare nacheinander ausfüllen

  Alt 3. Nov 2012, 15:42
OK, ich hab es ausprobiert, überzeugt
LAN-PC: C2Q Q9550 @ 4004 MHz @ 1.232 V @ Mugen 2 | DFI LANParty JR P45-T2RS | G.Skill 4GB DDR2-1000 CL5 | ZOTAC GTX 280 @ GTX 285 @ 1.06 V | WD Caviar Blue 320GB / WD Caviar Black 640GB | BeQuiet DPP P7 450W | Antec Mini P180
  Mit Zitat antworten Zitat
Marco Steinebach

Registriert seit: 4. Aug 2006
490 Beiträge
 
Delphi 5 Enterprise
 
#8

AW: TWebBrowser - zwei Formulare nacheinander ausfüllen

  Alt 3. Nov 2012, 19:26
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
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
 
#9

AW: TWebBrowser - zwei Formulare nacheinander ausfüllen

  Alt 3. Nov 2012, 20:53
Es hilft doch sich den HTML-Code anzusehen ... oder?
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
490 Beiträge
 
Delphi 5 Enterprise
 
#10

AW: TWebBrowser - zwei Formulare nacheinander ausfüllen

  Alt 3. Nov 2012, 21:00
Es hilft doch sich den HTML-Code anzusehen ... oder?
Joa, aber immer doch. Und ruft man mit dem Internet-Explorer die Seite auf, loggt sich ein, erhält man, nachdem man auf Submit geklickt hat, eine Seite, auf der unter "ansicht | Quelltext" ein Feld namens "serial" zu finden ist.
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
Marco Steinebach
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 00:52 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