| Autor |
Beitrag |
Andi1982
      
Beiträge: 497
WinXP HE
D6 Enterprise
|
Verfasst: So 19.03.06 19:16
Hallo,
ich habe im TWebBrowser eine Seite dargestellt auf dem sich ein Formular befindet. Ich würde dieses Formular gerne automatisch ausfüllen und den Submit butten drücken.
Habe hier leider nichts gefunden ob das überhaupt möglich ist. Vorallem wie ich den submit-Button betätigen kann.
Hat da jemand eine idee??
Das formular der seite sieht so aus: Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10:
| <form name="units" action="seite.php?dorf=52485&screen=place&try=confirm" method="post"> <input name="anzahl1" type="text" size="5" tabindex="1" value="" /> <input name="anzahl2" type="text" size="5" tabindex="2" value="" /> <input name="anzahl3" type="text" size="5" tabindex="1" value="" /> <input type="text" name="teil1" value="" size="2" /> <input type="text" name="teil2" value="" size="2" /> <input type="text" name="teil3" value="" size="2" /> <input class="attack" name="attack" type="submit" value="Aktion1" style="font-size: 10pt;" /> <input class="support" name="support" type="submit" value="Unterstützen" style="font-size: 10pt;" /> </form> |
Könnte man sich vielleicht irgendwie durch simulierte Tastendruck durchhängeln?
Hoffe auf gute Anregungen.
Viele grüße andi
_________________ Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: So 19.03.06 19:20
hallo, für's nächste Mal; schau bitte vorher im Forum via Suche,
look here: www.delphi-forum.de/...57611&highlight=
grez
msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
Andi1982 
      
Beiträge: 497
WinXP HE
D6 Enterprise
|
Verfasst: So 19.03.06 19:40
Hi,
danke für den Link. Habe vorher auch gesucht, aber kann mit diesem Thread nicht wirklich was anfangen. Kann das irgendwie nicht auf die TWebBrowser-Komponente umsetzen...
_________________ Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: So 19.03.06 19:46
also,
im Prinzip ist es einfach.
Der Webbrowser als auch das Pedant DhtmlEdit implementieren die DOM. (oder heist es das DOM?)
Über diese Schnittstelle (Interface) hast du Zugriff auf alle
"Felder" etx. also auf <p>, auf <Intput> und so weiter.
damit steht dir dann offen, die werte zu ändern.
grez
msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
Andi1982 
      
Beiträge: 497
WinXP HE
D6 Enterprise
|
Verfasst: So 19.03.06 20:54
Ich habe es jetzt mal mit einer funktion probiert die ich hier im forum gefunden habe: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30:
| function TForm1.FillForm(WebBrowser: TWebBrowser; FieldName: string; Value: string): Boolean; var i, j: Integer; FormItem: Variant; begin Result := False; if WebBrowser.OleObject.Document.all.tags('form').Length = 0 then begin Exit; end; for I := 0 to WebBrowser.OleObject.Document.forms.Length - 1 do begin FormItem := WebBrowser.OleObject.Document.forms.Item(I); for j := 0 to FormItem.Length - 1 do begin try if FormItem.Item(j).Name = FieldName then begin FormItem.Item(j).Value := Value; Result := True; end; except Exit; end; end; end; end; |
aber bei dem "if WebBrowser.OleObject.Document.all.tags('form').Length = 0" findet er 0 und springt raus!
Habe allerdings zu testzwecken mal den header aus der html-datei genommen und nur die form drinnen gelassen. Dann gings! So sieht der orginale Kopf der html-datei aus:
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17:
| <?xml version="1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html; charset=ISO-8859-1" /> <title>Eggenstein (16:66:10) - Die Stämme</title> <link rel="stylesheet" type="text/css" href="stamm1141419484.css" /> <link rel="stylesheet" type="text/css" href="overview.css" /><script type="text/javascript"> //<![CDATA[ if(!top || top.frames.length < 2 || top.location.host!="ds5.die-staemme.de") { top.location="staemme.php?village=52485&screen=place";} //]]> </script> <script src="script.js?1141475934" type="text/javascript"></script> <script src="menu.js?1141475934" type="text/javascript"></script> </head> <body> |
fällt jemandem was auf???? An dem XML liegt es aber nicht, das hatte ich bei meinem test auch mit drinnen...
_________________ Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
|
|
Andi1982 
      
Beiträge: 497
WinXP HE
D6 Enterprise
|
Verfasst: Mo 20.03.06 08:26
Ich könnte auch jemandem den ganzen quelltext der Seite zukommen lassen. Allerdings wäre dies ein bisschen zu groß um hier zu posten.
_________________ Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
|
|
MSCH
      
Beiträge: 1448
Erhaltene Danke: 3
W7 64
XE2, SQL, DevExpress, DevArt, Oracle, SQLServer
|
Verfasst: Di 21.03.06 17:02
nutzt du Frames?
grez
msch
_________________ ist das politisch, wenn ich linksdrehenden Joghurt haben möchte?
|
|
Andi1982 
      
Beiträge: 497
WinXP HE
D6 Enterprise
|
Verfasst: Di 21.03.06 17:34
nein, eigentlich nicht! habe aber für dieses formular jetzt eine möglichkeit gefunden! Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| procedure TForm1.Button3Click(Sender: TObject); var Webform : variant ; begin WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('spear').value := Edit4.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('sword').value := Edit5.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('axe').value := Edit6.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('spy').value := Edit7.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('light').value := Edit8.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('heavy').value := Edit9.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('ram').value := Edit10.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('catapult').value := Edit11.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('snob').value := Edit12.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('attack').click; end; |
aber jetzt habe ich ein neues formular das leider keinen name-tag hat auf der nächsten seite...
Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| <form action="game.php?village=52485&screen=place&action=command&h=f76c"
method="post" onSubmit="this.submit.disabled=true;"> <input type="hidden" name="attack" value="true"> <input type="hidden" name="con" value="16"> <input type="hidden" name="sec" value="65"> <input type="hidden" name="sub" value="9"> <input type="hidden" name="spear" value="0"> <input type="hidden" name="sword" value="0"> <input type="hidden" name="axe" value="0"> <input type="hidden" name="spy" value="10"> <input type="hidden" name="light" value="30"> <input type="hidden" name="heavy" value="0"> <input type="hidden" name="ram" value="0"> <input type="hidden" name="catapult" value="0"> <input type="hidden" name="snob" value="0"> <input name="submit" onClick="" type="submit" value="» OK «" style="font-size: 10pt;"> </form> |
da müsste ich nur submitten, aber das geht auch nicht  ich versuche es so: WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item(0).Elements.item('submit').click;
natürlich erst wenn der browser auch fertig geladen hat! darauf habe ich geachtet!
hat da jemand eine idee??
_________________ Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
|
|
Andi1982 
      
Beiträge: 497
WinXP HE
D6 Enterprise
|
Verfasst: Di 21.03.06 22:22
Habe es jetzt nochmal ausprobiert... zuerst hatte ich es so: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31:
| procedure TForm1.Button5Click(Sender: TObject); begin WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('spear').value := Edit4.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('sword').value := Edit5.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('axe').value := Edit6.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('spy').value := Edit7.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('light').value := Edit8.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('heavy').value := Edit9.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('ram').value := Edit10.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('catapult').value := Edit11.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('snob').value := Edit12.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('attack').click;
WaitBrowser(WebBrowser1); WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item(0).Elements.item('submit').click; end;
. . .
procedure TForm1.WaitBrowser(eWebBrowser: TWebBrowser); begin Repeat Sleep(50); Application.ProcessMessages; Until (eWebBrowser.ReadyState = READYSTATE_COMPLETE); end; |
dachte eigentlich die WaitBrowser ist ok! Aber beim click auf das zweite formular knallts! wenn ich das aber auf zwei buttons verteile und erst den ersten und dann den zweiten klicke gehts!
SO:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25:
| procedure TForm1.Button3Click(Sender: TObject); var Webform : variant ; begin WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('spear').value := Edit4.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('sword').value := Edit5.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('axe').value := Edit6.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('spy').value := Edit7.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('light').value := Edit8.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('heavy').value := Edit9.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('ram').value := Edit10.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('catapult').value := Edit11.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('snob').value := Edit12.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('attack').click; WaitBrowser(WebBrowser1); end;
procedure TForm1.Button4Click(Sender: TObject); begin WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item(0).Elements.item('submit').click; end; |
Weiß jemand wie ich das in einen button bekommen könnte?? mit einer gescheiten pause dazwischen ??
_________________ Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
|
|
Andi1982 
      
Beiträge: 497
WinXP HE
D6 Enterprise
|
Verfasst: Do 23.03.06 17:42
habe was gefunden wo einigermaßen funktioniert... siehe hier!
nur das mit der "if pDisp = WebBrowser1.DefaultInterface then" funktioniert nicht wirklich... der läuft da nicht auf true...
_________________ Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
|
|
Andi1982 
      
Beiträge: 497
WinXP HE
D6 Enterprise
|
Verfasst: Fr 24.03.06 08:15
Inzwischen sieht mein Code so aus: 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33:
| procedure TForm1.Button5Click(Sender: TObject); begin WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('spear').value := Edit4.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('sword').value := Edit5.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('axe').value := Edit6.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('spy').value := Edit7.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('light').value := Edit8.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('heavy').value := Edit9.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('ram').value := Edit10.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('catapult').value := Edit11.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('snob').value := Edit12.Text; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('units').Elements.item('attack').click; repeat Application.ProcessMessages; until DocumentLoaded; WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item(0).Elements.item('submit').click; end;
procedure TForm1.WebBrowser1BeforeNavigate2(Sender: TObject; const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Headers: OleVariant; var Cancel: WordBool); begin DocumentLoaded := false; end;
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); begin DocumentLoaded := true; end; |
Das geht in ca. 80% der Fällen gut! In den anderen bekommt er beim submit des zweiten Formulars noch einen Zugriffsfehler. Ich denke das liegt an einem Werbebanner der mit Java-script zwischendurch neu geladen wird. Wenn der das DocumentLoaded auf true setzt obwohl das submit des Formulars noch nicht fertig war dann krachts wohl.
Hat jemand eine Idee wie ich das in den griff bekommen könnte??
_________________ Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
|
|
Andi1982 
      
Beiträge: 497
WinXP HE
D6 Enterprise
|
Verfasst: Fr 24.03.06 10:21
Oh ich bin so blöde  Habe gerade gesehen dass der oben angesprochene Banner in einem Extra frame ist...
Kann ich irgendwie abfragen welches frame den schalter "DocumentLoaded" auf false setzt? Dann könnte ich beim Setzen auf true wieder nur das frame auf true setzen lassen wo auch auf false gesetzt hat...
Nur wie geht das???
_________________ Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
|
|
Andi1982 
      
Beiträge: 497
WinXP HE
D6 Enterprise
|
Verfasst: Mo 27.03.06 07:38
Lösung:
Also ich habe jetzt eine Möglichkeit gefunden das ganze mit dem Werbebanner in den Griff zu bekommen: Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| procedure TForm1.WebBrowser1BeforeNavigate2(Sender: TObject; const pDisp: IDispatch; var URL, Flags, TargetFrameName, PostData, Headers: OleVariant; var Cancel: WordBool); begin CurWebBrowser := pDisp as IWebBrowser; DocumentLoaded := false; end;
procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); var TopWebBrowser: IWebBrowser; Startseite: String; begin TopWebBrowser := pDisp as IWebBrowser; if TopWebBrowser = CurWebBrowser then DocumentLoaded := true; end; |
Eigentlich hätte ich früher darauf kommen können, hätte aber nicht gedacht dass das funktioniert  Hoffe das hilft irgendwann mal jemandem weiter...
_________________ Solange die Bombe tickt ist alles in Ordnung, erst wenn sie damit aufhört wird es problematisch...
|
|