Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi formularfelder einer website ausfülle? (https://www.delphipraxis.net/978-formularfelder-einer-website-ausfuelle.html)

RomanK 3. Okt 2002 23:42


formularfelder einer website ausfülle?
 
Wie geht das ????
DANKE schonmal!!

sakura 4. Okt 2002 08:29

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?
...

RomanK 4. Okt 2002 10:03

Hi
also ich habe einen TWebBrowser, der Aufbau ist bekannt und die Feldnamen sind immer die selben ( wohl das einfachste)!

sakura 4. Okt 2002 12:34

Code:
WebBrowser1.Document.Forms['NameDesForms'].Elements['NameDesFeldes'].Value := 'WertDesFeldes';

bzw.

WebBrowser1.Document.NameDesForms.NameDesFeldes.Value := 'WertDesFeldes';
Das sollte funktionieren (mal so "from the top of my head"...

RomanK 4. Okt 2002 13:10

THX

theomega 26. Dez 2002 21:46

Ich möchte das nocheinmal herauskramen:
der von sakura gelieferte Quelltexte geht nicht (Delphi 6 Ent), wie lautet der richtige?

sakura 26. Dez 2002 21:54

Was geht denn nicht, bis jetzt ging es immer ohne Probleme?

thomasdrewermann 26. Dez 2002 21:56

Hier der Code zum schreiben eines Feldes mit dem Namen TEST:
Code:
WebBrowser1.OleObject.document.forms.item(0).elements.item('TEST').value:=Edit1.Text;
Hier der Code zum auslesen:
Code:
Edit1.Text:=WebBrowser1.OleObject.document.forms.item(0).elements.item('TEST').value;
Meine Quelle:
Delphi-Source Wie kann ich Formular im TWebbrowser ausfüllen/lesen?

sakura 26. Dez 2002 21:59

Hast Du das <Form> Tag genutzt ? Poste doch mal den Auszug aus Deinem HTML. Hast Du ein Frameset?

Act23 26. Dez 2002 22:34

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

theomega 27. Dez 2002 10:39

@Sakura: In deinem Code hat das "oleobject" gefehlt!

Act23 27. Dez 2002 18:25

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:
WebBrowser1.OleObject.Document.Forms.item('Name des Formulars').Elements.item('Name des Feldes').value := 'Irgendetwas';
aber es geht eben nicht wenn man das ganze frameset öffnet! und das muss ich irgendwie umgehen können!

sakura 27. Dez 2002 18:35

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'

ensacom 28. Dez 2002 11:22

Also ich habe es jetzt so gemacht

Code:
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;
Ich erhalte den EOleError
"Die Methode 'Forms' wird vom Automatisierungsobject nicht unterstützt"

sakura 28. Dez 2002 11:28

Code:
WebBrowser1.OleObject.Document.Frames.item('Name des Frames').[color=#ff0000]Document.[/color]Forms.item('Name des Formulars').Elements.item('Name des Feldes').value := 'Irgendetwas'
Dann wohl eher so :D

ensacom 28. Dez 2002 11:34

Vielen Dank, das klappt schon mal.
Jetzt aber eine Frage.

So benutze ich es jetzt

Code:
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;
Ich rufe also die Seite 'http://www.tmssoftware.com' auf.

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

sakura 28. Dez 2002 11:39

Code:
WebBrowser1.OleObject.Document.Frames.item('MAIN')[color=#ff0008].Document[/color].location.href := 'http://www.Delphi-PRAXiS.net/';
Mit oder ohne .Document, wahrscheinlich ohne.

ensacom 28. Dez 2002 11:48

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:
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;
Wenn ich jetzt Button 1 clicke, kommt eine zugriffsverletzung.
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:
 WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.location.href := 'http://www.tmssoftware.com/asp/reg_input.asp';
ins onCreate schreibe egal ob allein oder hinter webbrowser1.navigate.
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

ensacom 28. Dez 2002 11:50

Danke, hab es eben selber herausgefunden.
Ich hab es ins WebBrowser1DocumentComplete geschrieben.

Vielen Dank nochmal. Ich werde jetzt öfter hier sein

ensacom 28. Dez 2002 12:02

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

sakura 28. Dez 2002 12:08

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;

ensacom 28. Dez 2002 12:20

Danke, aber da erhalte ich immer denn Error "ungültige Typumwandlung"

ensacom 28. Dez 2002 12:23

Mist, jetzt hab ich es doch noch herausgefunden.

Code:
if WebBrowser1.OleObject.Document.Frames.item('MAIN').Document.location.href = 'http://www.tmssoftware.com/asp/reg_input.asp' then
begin
  fillform;
end;
Jetzt gehts

Danke dir nochmal

sakura 28. Dez 2002 12:27

Kein Problem, dass sollte jetzt hoffentlich auch den anderen helfen :dancer2:

...:cat:...

Act23 29. Dez 2002 16:03

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!

Jan 29. Dez 2002 16:55

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

Jan 30. Dez 2002 02:46

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

Act23 30. Dez 2002 14:10

@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?

masters001 30. Dez 2002 17:06

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

Jan 30. Dez 2002 20:44

@ 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

masters001 30. Dez 2002 23:33

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?

Jan 31. Dez 2002 00:51

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

masters001 31. Dez 2002 09:51

Hallo ich habe eine Lösung gefunden:
Hier ein Beispielcode:

Code:
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;
cu masters001

masters001 31. Dez 2002 15:16

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:
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>
so sieht das aus.
(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]

Jan 31. Dez 2002 16:37

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

Jan 31. Dez 2002 16:54

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.

masters001 5. Jan 2003 19:56

Hallo bin noch auf ein Problem gestoßen:

Und zwar muss ich ein bestimmtes Form anprechen:
Code:
WebBrowser2.OleObject.document.forms.item('login').elements.item('username').value:=angaben[4];
wenn ich das aber ausführe kommt eine exception die auf errors in verbindung mit elements hinweist!

masters001 10. Jan 2003 14:36

Auf dieser Site geht bei mir gar nichts!
Speziell die Werte in die inputs einzutragen!
:= http://www.telekom.de/ttc/team_ie.htm
könnt ihr euch ja mal anschauen vielleicht fällt irgendeinem spontan was dazu ein!

Vielen Dank

masters001 13. Jan 2003 21:17

Hallo
Noch ne Frage:
weil ich mich mit meinem Programm bei verschiedenen Providern einloggen möchte habe ich meinen code ein bisschen "rationalisiert" :
Code:
WebBrowser2.OleObject.document.forms.item(0).elements.item(sms_full_Number_field).value:=sms_full_Number;
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!
Woran kann das liegen?

Jan 13. Jan 2003 23:36

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.
Seite 1 von 3  1 23      

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