![]() |
formularfelder einer website ausfülle?
Wie geht das ????
DANKE schonmal!! |
Etas mehr Infos sind schon angebracht.
:?: Ist es ein externen Browser? :?: Ist es immer die TWebBrowser-Komponente? :?: Ist Dir der Aufbau des Formulares bekannt? :?: Kann es zufällige Feldnamen geben? ... |
Hi
also ich habe einen TWebBrowser, der Aufbau ist bekannt und die Feldnamen sind immer die selben ( wohl das einfachste)! |
Code:
Das sollte funktionieren (mal so "from the top of my head"...
WebBrowser1.Document.Forms['NameDesForms'].Elements['NameDesFeldes'].Value := 'WertDesFeldes';
bzw. WebBrowser1.Document.NameDesForms.NameDesFeldes.Value := 'WertDesFeldes'; |
THX
|
Ich möchte das nocheinmal herauskramen:
der von sakura gelieferte Quelltexte geht nicht (Delphi 6 Ent), wie lautet der richtige? |
Was geht denn nicht, bis jetzt ging es immer ohne Probleme?
|
Hier der Code zum schreiben eines Feldes mit dem Namen TEST:
Code:
Hier der Code zum auslesen:
WebBrowser1.OleObject.document.forms.item(0).elements.item('TEST').value:=Edit1.Text;
Code:
Meine Quelle:
Edit1.Text:=WebBrowser1.OleObject.document.forms.item(0).elements.item('TEST').value;
![]() |
Hast Du das <Form> Tag genutzt ? Poste doch mal den Auszug aus Deinem HTML. Hast Du ein Frameset?
|
der source von thomasdrewermann scheint zu funktionieren! aber nur wenn man keine frames auf der html-seite hat! bei frames funktiort es nicht mehr!
irgendetwas muss man ändern, nur habe ich keinen tau was... gg |
@Sakura: In deinem Code hat das "oleobject" gefehlt!
|
also, weiß schon jemand wie man formularfelder in einer frameseite ausfüllen kann?
z.B: <frameset> <frame name="NavLinks" src="menu.html"> <frame name="Hauptframe" src="index2.html"> </frameset> die felder die ich ausfüllen will, sind im frame "Navlinks". Mit dem Code der hier gepostet wurde, kann man diese Felder aber nicht ausfüllen. Wenn man diese Frameseite aber einzeln öffnet (menu.html), kann man man mit diesem Code machen:
Delphi-Quellcode:
aber es geht eben nicht wenn man das ganze frameset öffnet! und das muss ich irgendwie umgehen können!
WebBrowser1.OleObject.Document.Forms.item('Name des Formulars').Elements.item('Name des Feldes').value := 'Irgendetwas';
|
Es sollte so gehen, wenn der IE den Zugruff über Frames nicht blockt:
Code:
WebBrowser1.OleObject.Document.Frames.item('Name des Frames').Forms.item('Name des Formulars').Elements.item('Name des Feldes').value := 'Irgendetwas'
|
Also ich habe es jetzt so gemacht
Code:
Ich erhalte den EOleError
procedure TForm1.FormCreate(Sender: TObject);
begin Webbrowser1.Navigate('http://www.tmssoftware.com'); end; procedure TForm1.Button1Click(Sender: TObject); begin WebBrowser1.OleObject.Document.Frames.item('MAIN').Forms.item('loginform').Elements.item('REGEMAIL').value := 'Irgendetwas' end; "Die Methode 'Forms' wird vom Automatisierungsobject nicht unterstützt" |
Code:
Dann wohl eher so :D
WebBrowser1.OleObject.Document.Frames.item('Name des Frames').[color=#ff0000]Document.[/color]Forms.item('Name des Formulars').Elements.item('Name des Feldes').value := 'Irgendetwas'
|
Vielen Dank, das klappt schon mal.
Jetzt aber eine Frage. So benutze ich es jetzt
Code:
Ich rufe also die Seite 'http://www.tmssoftware.com' auf.
procedure TForm1.FormCreate(Sender: TObject);
begin Webbrowser1.Navigate('http://www.tmssoftware.com'); end; procedure TForm1.Button1Click(Sender: TObject); begin WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.Forms.item('loginform').Elements.item('REGEMAIL').value := 'Irgendetwas' end; Das Formular was ich ausfüllen will kommt aber erst wenn ich auf "Login" klicke. Wie kann ich also die Seite "http://www.tmssoftware.com/asp/reg_input.asp" im Mainframe aufrufen damit ich das Formular ausfüllen kann? Danke schon mal |
Code:
Mit oder ohne .Document, wahrscheinlich ohne.
WebBrowser1.OleObject.Document.Frames.item('MAIN')[color=#ff0008].Document[/color].location.href := 'http://www.Delphi-PRAXiS.net/';
|
Hm, danke aber das klappt nicht so wie ich es mir vorgestellt habe.
Also
Code:
procedure TForm1.FormCreate(Sender: TObject);
begin Webbrowser1.Navigate('http://www.tmssoftware.com'); end;
Code:
Wenn ich jetzt Button 1 clicke, kommt eine zugriffsverletzung.
procedure TForm1.Button1Click(Sender: TObject);
begin with WebBrowser1 do begin OleObject.Document.Frames.item('MAIN').Document.Forms.item('loginform').Elements.item('REGEMAIL').value := 'ensacom@t-online.de'; OleObject.Document.Frames.item('MAIN').Document.Forms.item('loginform').Elements.item('REGCODE').value := 'Passwort'; OleObject.Document.Frames.item('MAIN').Document.Forms.item('loginform').Elements.item('B1').value := 'Passwort'; end; end; Klicke ich im Webbrowser auf login und dann auf Button1, wird das Formular angezeigt und ausgefüllt. Ich will also nun das beim Start gleich das Formular im MainFrame angezeigt wird. Wenn ich aber
Code:
ins onCreate schreibe egal ob allein oder hinter webbrowser1.navigate.
WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.location.href := 'http://www.tmssoftware.com/asp/reg_input.asp';
kommt immer eine Zugriffsverletzung. Wie muß ich es also richtig aufrufen, so das beim start gleich die Seite mit dem Formular im Mainframe angezeigt wird? Vielen Dank schon mal |
Danke, hab es eben selber herausgefunden.
Ich hab es ins WebBrowser1DocumentComplete geschrieben. Vielen Dank nochmal. Ich werde jetzt öfter hier sein |
So, eine letzte Frage hätte ich noch
Code:
procedure TForm1.fillform;
begin with WebBrowser1 do begin OleObject.Document.Frames.item('MAIN').Document.Forms.item('loginform').Elements.item('REGEMAIL').value := 'ensacom@t-online.de'; OleObject.Document.Frames.item('MAIN').Document.Forms.item('loginform').Elements.item('REGCODE').value := 'Passwort'; OleObject.Document.Frames.item('MAIN').Document.Forms.item('loginform').Elements.item('B1').value := 'Passwort'; end; end; procedure TForm1.WebBrowser1DocumentComplete(Sender: TObject; const pDisp: IDispatch; var URL: OleVariant); var CurWebrowser: IWebBrowser; TopWebBrowser: IWebBrowser; begin CurWebrowser := pDisp as IWebBrowser; TopWebBrowser := (Sender as TWebBrowser).DefaultInterface; if CurWebrowser = TopWebBrowser then begin WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.location.href := 'http://www.tmssoftware.com/asp/reg_input.asp'; end; fillform; //FEHLER end; Wenn ich fillform dort aufrufe gibt es eine zugriffsverletzung weil das Formular noch nicht im Mainframe ist. Hat einer ne Idee wie ich abfragen kann ob es komplett ist, um dann das Formular zu füllen? Danke |
In JavaScript ist es synchron zu folgendem, ob es in Delphi geht...
Delphi-Quellcode:
if WebBrowser1.OleObject.Document.Frames.item('MAIN').Document then
begin ... end; |
Danke, aber da erhalte ich immer denn Error "ungültige Typumwandlung"
|
Mist, jetzt hab ich es doch noch herausgefunden.
Code:
Jetzt gehts
if WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.location.href = 'http://www.tmssoftware.com/asp/reg_input.asp' then
begin fillform; end; Danke dir nochmal |
Kein Problem, dass sollte jetzt hoffentlich auch den anderen helfen :dancer2:
...:cat:... |
ja mir hat das jetzt sehr geholfen! ich habe es zwar auch vorher schon anders hinbekommen, aber diese möglichkeit ist logischer bzw. einfacher!
jetzt habe ich ncoh eine frage! wie kann ich einen link automatisch anklicken lassen? z.B. bei gmx: "email schreiben" der link steht in einer tabelle. wie spreche ich ihn dann also mit delphi an? danke schon mal im voraus! |
Hallo Act23,
das kannst du entweder durch Maussteuerung machen (sehr umständlich) oder zu schaust dir den link an, den der "email schreiben" Butten ansteuert. Wenn er zu einem php-script führt, dann schau dir die inputs im Form an, auch die hidden, und erstellst dir daraus den link den du besuchen willst, dieser könnte z.B. so aussehen: .../mailprocess.php?user=franz&mailtext=hallo%20herr%2 0Sommer&Emailaddresse=herrsommer@hotmail.com&topic =halloechen und dann gehst du einfach auf diesen link, was genausoviel bewirkt wie auf den button zu klicken, aber nicht vergessen, hinter dem & steht der name des inputs und hinter dem = der value. Es gibt da sicher auch noch schönere varianten in delphi, aber ich kann php besser und da baut man sich seine links immer so schön zusammen. :]. Gruß Jan |
Hallo ihr Meister des Wissens!
Jetzt hab ich auch mal ne Frage dazu: Was mache ich denn, wenn kein Name für den Form angegeben ist, was ja nicht notwendig ist, geht das wie in jscript, dass man das mit form[0] machen kann? Sag mir mal einer die genaue Schreibweise wenn das überhaupt geht. Thx schonmal Greetz Jan |
@Jan:
also das mit dem php-link hat funktioniert! aber ich habe einen anderen link, den ich mit der maus anklicken muss! also wie geht das mit der maussteuerung?? ist das wirklich so kompliziert? |
Hallo ich habe hierzu auch noch eine Frage:
Das Ausfüllen von Formularen wurde hier mit der TWebBrowser componente besprochen. Bei dieser Componente wird die Website aber doch immer im Formular angezeigt? Wie kann ich eine website connecten und ihre Formulare ausfüllen ohne das sie in meinem programm sichtbar angezeigt wird? Das mit dem automatischen Button anklicken im Formular würd micht auch noch interessieren. Muss man das denn unbedingt mit der Maussteuerung machen oder kann man diese buttons nicht genau so wie die Eingabefelder ansteuern und 'anklicken'? Un noch eine Frage zu den mausevents: mouse_event(MOUSEEVENTF_LEFTDOWN, X, Y, 0, 0); Auf was beziehen sich denn die Pixelkoordinaten x,y auf die der Website oder die des Bildschirms? Und wie kann man die Pixelkoordinaten eines Buttons z.B. auf einer Website herausfinden? Vielen Dank masters001 |
@ Act23 & Masters001:
Ein button oder link auf einer Webseite ist absolut nichts anderes als eine url, auf welche, nach dem Klick, navigiert wird. Ihr konnt also auch einfach dem browser sagen, dass er auf die url navigieren soll, was das gleiche bewirkt wie ein buttonklick. Sollte die url des Buttons in irgendeiner Weise dynamisch sein, d.h. ihr könnt keine feste url in eurem Code angeben, so reicht es, wenn der Name des links bekannt ist, oder halt, so wie ich das weiter oben gefragt habe, könnte es möglich sein den soundsovielten link auszulesen. Das weiss ich aber nicht genau. Ihr lest also den Link aus und navigiert auf diesen Link. Jetzt fragt mich aber nicht, wie ihr das in Delphi realisiert, ich kann das alles nur von Jscript, aber es sollte eigentlich sehr ähnlich auch in Delphi gehen. Gruss Jan |
Ja bei einem Link auf eine andere Seite ist das so!
Was ist aber wenn ich mich z.B. bei freenet automatisch einloggen möchte? Wie Username und Password in das Formular eingetragen werden ist ja hier auch schon gut erklärt und klappt auch. Aber wie drückt das Programm jetzt den OK button? <input type="submit" name="submit" value="ok" style="font-size:10px;"> Kann man den nicht genau wie die Eingabefelder ansprechen? |
das weiss ich nicht, aber schau mal weiter oben was ich da geschrieben hab, du musst nur den link zusammenbauen, dann musst du das Formular überhaupt nicht Ausfüllen, deswegen ist es mir auch schleierhaft, warum du danach fragst.
Gruss Jan |
Hallo ich habe eine Lösung gefunden:
Hier ein Beispielcode:
Code:
cu masters001
uses
MSHTML; var WebForm :HTMLFormElement; WebDoc : HTMLDocument begin WebBrowser2.OleObject.document.forms.item(0).elements.item('username').value:='jochen.bender'; WebBrowser2.OleObject.document.forms.item(0).elements.item('password').value:='*********'; WebDoc := WebBrowser2.Document as HTMLDocument; WebForm := WebDoc.forms.item(varEmpty, 0) as HTMLFormElement; WebForm.submit; end; |
Ich hab hierzu aber auch noch eine erweiterte Frage:
Wenn ich auf einen Banner klicke der auf ein JavaScript verweist wie kann ich das ich Delphi realisieren also: Gibt es da eine Methode den Banner direkt anzuklicken, oder kann ich irgendwie das Javascript im HTML Formular aufrufen?
Code:
so sieht das aus.
href="javascript:sendSMS(11,'B9A4...73B')">[img]/adserver.freenet.de/image.ng/site=fn&prod=chetools& kat=rub&tbl=smssnd&ppos=11&TransactionID=B9A4....73B[/img]</a></td>
(Es ist der erste Banner bei Freenet.de, um eine SMS zu verschicken) Hier könnte ich mir theoretisch auch einen link zusammenbasteln aber der 2.wert der übergeben wird wird jedesmal verändert! Oder könnte ich den wert auch aus den HTML QT auslesen? [edit=Sakura]Transaction ID gekürzt[/edit] |
Hallo masters001,
Danke für den tip mit dem ansprechen der Formulare ohne Namen, das klappt schonmal, allerdings ist es mir nicht möglich mit deiner methode ein Formular abzuschicken, da sich das Formular in einem Frame befindet, und ich das document meines frames irgendwie nicht auslesen kann, kannst du mir da mal helfen? Danke im Vorraus. Gruß Jan |
Nach ein bischen Googlen schon gefunden:
Code:
procedure tform1.login;
var Webform : variant ; begin form1.WebBrowser1.OleObject.Document.Frames.item('main').Document.Forms.item(0).Elements.item('username').value := 'LANJAN' ; form1.WebBrowser1.OleObject.Document.Frames.item('main').Document.Forms.item(0).Elements.item('password').value := 'moep' ; WebForm := form1.WebBrowser1.OleObject.Document.Frames.item('main').Document.Forms.item(0); WebForm.submit; end; end. |
Hallo bin noch auf ein Problem gestoßen:
Und zwar muss ich ein bestimmtes Form anprechen:
Code:
wenn ich das aber ausführe kommt eine exception die auf errors in verbindung mit elements hinweist!
WebBrowser2.OleObject.document.forms.item('login').elements.item('username').value:=angaben[4];
|
Auf dieser Site geht bei mir gar nichts!
Speziell die Werte in die inputs einzutragen! := ![]() könnt ihr euch ja mal anschauen vielleicht fällt irgendeinem spontan was dazu ein! Vielen Dank |
Hallo
Noch ne Frage: weil ich mich mit meinem Programm bei verschiedenen Providern einloggen möchte habe ich meinen code ein bisschen "rationalisiert" :
Code:
Ich habe jetzt die unterschiedlichen Felder und Eiträge in Variablen gespeichert (String) aber jedesmal wenn ich das Programm laufen lasse gibt es einen error!
WebBrowser2.OleObject.document.forms.item(0).elements.item(sms_full_Number_field).value:=sms_full_Number;
Woran kann das liegen? |
Hallo masters001,
ich habe mich da jetzt eine ganze Menge mit befasst, d.h. ich habe ein ganzes Programm geschrieben, dass eine Seite automatisch betreibt. Das war sehr aufwendig, da es da noch viele kontrollmechanismen einzubauen galt. Nun kann ich aus den dabei gemachten Erfahrungen schliessen, dass die meisten exception, besonders im Bezug auf elements daraus resultieren, dass die elemente zu früh angesprochen werden, d.h. sie sind noch nicht geladen. Ich habe dieses Problem umgangen, indem ich im "ondocumentcomplete" event generell alles in "try" -> "except" einklammere, so dass diese Befehle ignoriert werden, wenn die datei noch nicht fertig geladen ist. Das funktioniert nur deswegen, weil komischerweise, zumindest bei der Seite, mit der ich gearbeitet habe das "ondocumentcomplete" event mehrmals (an die 6 mal) ausgelöst wird. Ich warte die events also solange einfach ab bis meine Befehle funktionieren. If-abfragen sind da natürlich von Nöten, da sonst dein Code mehrmals ausgeführt werden würde. Ich könnte mir auch vorstellen, dass dieses Problem mit einem counter zu lösen wäre, welcher mitzählt das wievielte mal das event ausgelöst wurde, da kann ich aber nur sagen: ausprobieren. Ich fand das Programmieren von autmatischem Webseitenavigieren extrem schwer, da die Laufzeiten stark von den Ladezeiten der Webseite abhängen, und man somit sehr variabel programmieren muss, fast mein ganzes Programm steht im "ondocumentcomplete" event. Aber obwohl das Programm mittlerweile funktioniert kommt es regelmässig zu exceptions, weil die Seite irgendwelche Ladeverzögerungen oder ichweissnichtwas hat. Insgesamt alles etwas seltsam. Zum Schluss bleibt mir nurnoch zu sagen, dass du , wenn du "try/except" verwendest dein Programm nicht in der Programmierumgebung starten solltest, weil Delphi die exceptions dann abfängt, und der "try" tag ignoriert wird. Also erst kompilieren, und dann *.exe ausführen. Greetz! Jan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:36 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