GeckoBrowser WebFormulare ausfüllen

Für Fragen von Einsteigern und Programmieranfängern...
Medic
Beiträge: 13
Registriert: Sa 14. Dez 2013, 07:59

GeckoBrowser WebFormulare ausfüllen

Beitrag von Medic »

Hallo,
ich würde gerne in meiner GeckoBrowser-Komponente automatisch in Internetseiten Formulare ausfüllen und
- Checkboxen
- Editfelder
- Listboxen
mit bekanntem Namen ansprechen. Nach langer vergeblicher Suche hoffe ich das ihr mir weiterhelfen könnt ?!

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: GeckoBrowser WebFormulare ausfüllen

Beitrag von Christian »

Brauchst du das Formular unbedingt angezeigt ?
Wenn nicht send das Formular direkt mit Synapse hier ist n Beispiel http://www.ararat.cz/synapse/doku.php/p ... :htmlforms
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Medic
Beiträge: 13
Registriert: Sa 14. Dez 2013, 07:59

Re: GeckoBrowser WebFormulare ausfüllen

Beitrag von Medic »

Danke für die Antwort, leider löst es mein Problem noch nicht, denn ich brauche das Formular angezeigt. Im Prinzip soll es wie im folgenden beschrieben funktionieren. Mit einem Klick auf einen Button sollen automatisch u.a. checkboxen im Internetformular gesetzt und angezeigt werden. Dabei ist das Formular der Internetseite mit Javascript geschrieben.

Benutzeravatar
theo
Beiträge: 10947
Registriert: Mo 11. Sep 2006, 19:01

Re: GeckoBrowser WebFormulare ausfüllen

Beitrag von theo »

Medic hat geschrieben:Danke für die Antwort, leider löst es mein Problem noch nicht, denn ich brauche das Formular angezeigt.
Du kannst es ja anzeigen und trotzdem mit Synapse die Daten senden.
Letztlich werden immer irgendwelche Daten an den Server geschickt.
Sieht z.B. so aus
http://en.wikipedia.org/wiki/POST_%28HT ... _web_forms
Das kann man fast immer auch ohne HTML, DOM und JS erreichen.

Es gibt Tools, um zu prüfen welche Felder im Endeffekt gesendet werden. Hier z.B. bei Firefox:
Dateianhänge
postdata.png

Christian
Beiträge: 6079
Registriert: Do 21. Sep 2006, 07:51
OS, Lazarus, FPC: iWinux (L 1.x.xy FPC 2.y.z)
CPU-Target: AVR,ARM,x86(-64)
Wohnort: Dessau
Kontaktdaten:

Re: GeckoBrowser WebFormulare ausfüllen

Beitrag von Christian »

Das bringt ihm ja aber nichts, er will ja normalerweise den Nutzer das Formular ausfüllen lassen und nur zusätzlich nen Button anbieten um irgendwelche Standardwerte zu setzen der Benutzer schickt das Formular dann manuell ab, richtig?
W.m.k.A.h.e.m.F.h. -> http://www.gidf.de/

Benutzeravatar
theo
Beiträge: 10947
Registriert: Mo 11. Sep 2006, 19:01

Re: GeckoBrowser WebFormulare ausfüllen

Beitrag von theo »

Christian hat geschrieben:Das bringt ihm ja aber nichts, er will ja normalerweise den Nutzer das Formular ausfüllen lassen und nur zusätzlich nen Button anbieten um irgendwelche Standardwerte zu setzen der Benutzer schickt das Formular dann manuell ab, richtig?
Kann schon sein, aber "von aussen" wüsste ich nicht wie das gehen soll.
Da müsste man wahrsch. über die Internas (DOM und entspr. Funktionen) machen.
Bei IE habe ich sowas schon mal gemacht (über IHTMLDocument2) aber bei Gecko habe ich keine Ahnung.
Hat letztlich auch wenig mit Lazarus zu tun.

Medic
Beiträge: 13
Registriert: Sa 14. Dez 2013, 07:59

Re: GeckoBrowser WebFormulare ausfüllen

Beitrag von Medic »

Ok da muss ich wohl etwas ausholen... Ich arbeite in einer Krankenhausnotaufnahme. Mit einem Programm werden live sehr viele Daten sofort in ein Tablet eingegeben und automatisch so sortiert das sie dem Internetformular entsprechen in das sie eingegeben werden. Es ist also im Prinzip ein klon der Internetversion mit gleicher Anzahl an checkboxen, Edits und Auswahlfelder, das ganze läuft gut und stabil. Der Plan ist die Eingabeseite im Internet z.B. via Geckobrowser componente zu öffnen und mit einem klick auf einen Button die Felder automatisch in das 1:1 Gleich aussehende Formular zu übertragen und zwar so das es sichtbar ist und nicht im Hintergrund einfach weggeschickt wird. Bin auch bereit die Browsercomponente zu wechseln wenn jemand eine idee hat welche besser geeignet ist.

Benutzeravatar
theo
Beiträge: 10947
Registriert: Mo 11. Sep 2006, 19:01

Re: GeckoBrowser WebFormulare ausfüllen

Beitrag von theo »

Ich glaube da musst du noch ein bisschen weiter ausholen. Ich verstehe nicht was du meinst.
Willst du für das Tablet programmieren? Android? Oder wie kommen die Daten auf einen PC?

Medic
Beiträge: 13
Registriert: Sa 14. Dez 2013, 07:59

Re: GeckoBrowser WebFormulare ausfüllen

Beitrag von Medic »

Windows Surface Pro2 ist halt ein vollwertiges Windows tablet damit klappt es.

Benutzeravatar
theo
Beiträge: 10947
Registriert: Mo 11. Sep 2006, 19:01

Re: GeckoBrowser WebFormulare ausfüllen

Beitrag von theo »

Sag das doch gleich. "Tablet" verwirrt ja nur.
Wenn dort MSIE läuft, würde ich da anknüpfen, das ist besser dokumentiert.
Start hier: http://wiki.freepascal.org/LazActiveX
Doku für Delphi's TWebbrowser sollte mehr oder weniger gültig sein.
http://www.swissdelphicenter.ch/de/tips ... Webbrowser
http://delphi.about.com/od/twebbrowser/
etc.

Medic
Beiträge: 13
Registriert: Sa 14. Dez 2013, 07:59

Re: GeckoBrowser WebFormulare ausfüllen

Beitrag von Medic »

Das mit dem ActivX hatte ich auch schon als eine Lösung ins Auge gefasst und mir die komponente Heute schon instaliert. Dann bastel ich jetzt mal ein wenig und versuche einen Browser damit zum laufen zu bringen. Funktioniert er mit ähnlichen Codes wie die TWebbrowser delphi komponente könnte ich eine Chance haben.

Benutzeravatar
theo
Beiträge: 10947
Registriert: Mo 11. Sep 2006, 19:01

Re: GeckoBrowser WebFormulare ausfüllen

Beitrag von theo »

Ja viel Glück.
Ein Unterschied zu Delphi ist, dass man über <Komponente>.ComServer oder OleServer an den "Stoff" kommt.

gocher
Beiträge: 298
Registriert: Di 23. Nov 2010, 23:41
OS, Lazarus, FPC: Ubuntu/Win, Lazarus trunk, FPC trunk
CPU-Target: 32Bit/64Bit
Wohnort: Geldern
Kontaktdaten:

Re: GeckoBrowser WebFormulare ausfüllen

Beitrag von gocher »

myBrowser.zip
SHDocVw_1_1_tlb.pas, MSHTML_4_0_tlb.pas inklusive Beispiel
(1.07 MiB) 84-mal heruntergeladen
Damit der Einstieg nicht so schwer fällt!

http://delphi.about.com/od/twebbrowser/ ... b_form.htm könnte Dir da auch noch weiter helfen!
Also es funzt, ein paar kleinere Probleme behoben, es sieht dann wie folgt aus in Unit1 muss unter uses noch MSHTML_4_0_TLB hinzugefügt werden!!!

Code: Alles auswählen

function WebFormNames(const document: IHTMLDocument2): TStringList;
var
  forms: IHTMLElementCollection;
  form: IHTMLFormElement;
  idx: integer;
begin
  forms := document.Forms as IHTMLElementCollection;
  result := TStringList.Create;
  for idx := 0 to -1 + forms.length do
  begin
    form := forms.item(idx,0) as IHTMLFormElement;
    result.Add(form.name) ;
  end;
end;
 
function WebFormGet(const formNumber: integer; const document: IHTMLDocument2): IHTMLFormElement;
var
  forms: IHTMLElementCollection;
begin
  forms := document.Forms as IHTMLElementCollection;
  result := forms.Item(formNumber,'') as IHTMLFormElement
end;
 
function WebFormFields(const document: IHTMLDocument2; const formName: string): TStringList;
var
  form: IHTMLFormElement;
  field: IHTMLElement;
  fName: string;
  idx: integer;
begin
  form := WebFormGet(0, document) ;
 
  result := TStringList.Create;
  for idx := 0 to form.length-1 do
  begin
    field := form.item(idx, '') as IHTMLElement;
 
    if field = nil then Continue;
    fName := field.id;
 
    if field.tagName = 'INPUT' then fName := (field as IHTMLInputElement).name;
    if field.tagName = 'SELECT' then fName := (field as IHTMLSelectElement).name;
    if field.tagName = 'TEXTAREA' then fName := (field as IHTMLTextAreaElement).name;
 
    result.Add(fName) ;
  end;
end;
 
function WebFormFieldValue(const document: IHTMLDocument2; const formNumber: integer; const fieldName: string): string;
var
  form: IHTMLFormElement;
  field: IHTMLElement;
begin
  form := WebFormGet(formNumber, document);
  field := form.Item(fieldName,'') as IHTMLElement;
  if field = nil then Exit;
 
  if field.tagName = 'INPUT' then result := (field as IHTMLInputElement).value;
  if field.tagName = 'SELECT' then result := (field as IHTMLSelectElement).value;
  if field.tagName = 'TEXTAREA' then result := (field as IHTMLTextAreaElement).value;
end;
 
procedure WebFormSetFieldValue(const document: IHTMLDocument2; const formNumber: integer; const fieldName, newValue: string);
var
  form: IHTMLFormElement;
  field: IHTMLElement;
begin
  form := WebFormGet(formNumber, document);
  field := form.Item(fieldName,'') as IHTMLElement;
  if field = nil then Exit;
 
  if field.tagName = 'INPUT' then (field as IHTMLInputElement).value := newValue;
  if field.tagName = 'SELECT' then (field as IHTMLSelectElement).value := newValue;
  if field.tagName = 'TEXTAREA' then (field as IHTMLTextAreaElement).value := newValue;
end;
 
procedure WebFormSubmit(const document: IHTMLDocument2; const formNumber: integer);
var
  form : IHTMLFormElement;
  field: IHTMLElement;
begin
  form := WebFormGet(formNumber, document);
 
  form.submit;
end;
 
//ersetzt im download die Funktion btnTestClick
procedure TForm1.btnTestClick(Sender: TObject);
var
  document: IHTMLDocument2;
  sl : TStringList;
  i: integer;
begin
  document := Browser.ComServer.Document As IHTMLDocument2;
  sl := WebFormNames(Document);
  try
    for i:=0 to sl.Count-1 do
      Writeln('Form.Names: ' + sl.Strings[i]); // listet die Form Namen soweit das Form einen Namen hat
  finally
    sl.Free;
  end;
  sl := WebFormFields(document, '');
  try
    for i:=0 to sl.Count-1 do
      WriteLn('Field.Names: ' + sl.Strings[i]); // listet die Feld Namen
  finally
    sl.Free;
  end;
end;   
Also wenn Du eine StringLIst als Werte-Liste nutzt könntest Du im IHTMLFormElement alle IHTMLElement in einer Schleife durch gehen, nach Name die Werte zuordnen und je nach Typ IHTMLInputElement, IHTMLSelectElement, IHTMLTextAreaElement ... die Werte setzen. Da steckt also noch ein wenig Arbeit drin aber sollte gehen, viel Spaß!
Zuletzt geändert von gocher am Sa 14. Dez 2013, 21:48, insgesamt 3-mal geändert.
MfG Gocher
akt. Projekt: Webserver(HTTPS HTTP/2) mit integrierten CMS in Free Pascal - www.gocher.me

Benutzeravatar
theo
Beiträge: 10947
Registriert: Mo 11. Sep 2006, 19:01

Re: GeckoBrowser WebFormulare ausfüllen

Beitrag von theo »

Das hier ist vllt.auch noch praktisch:
http://www.delphidabbler.com/tips/56 (evtl. uses MSHTML_4_0_TLB, Variants; )

Z.B so:

Code: Alles auswählen

Document2 := Browser.ComServer.Document as IHTMLDocument2;
Elt:=GetElementById(Document2,'mycheck') as IHTMLInputElement;
Elt.checked:=false;  

Medic
Beiträge: 13
Registriert: Sa 14. Dez 2013, 07:59

Re: GeckoBrowser WebFormulare ausfüllen

Beitrag von Medic »

Danke gocher und theo. Also ich habe die Browserkomponente mit activeX nachgebaut und integriert, dabei war mir das Beispiel von gocher an der ein oder anderen Stelle hilfreich ;-) Der nächste Schritt wäre jetzt die Elemente anhand ihrer Id wie von theo vorgeschlagen zu ermitteln und sie anzusprechen. Das mit der String List ist zwar eine gute Idee für den Anfang für mich jetzt aber noch etwas zu Komplex. Im Moment ist mein Problem wie ich die Beispiele mit dem TWebbrowser Element auf meine neue BrowserKomponente umgeschrieben kriege. Um mit dem einfachsten also einem Editfeld zu beginnen werfe ich mal ein Quellcodebeispiel einer fiktiven Komponente die ich gerne Ansprechen würde in den Raum.
<input tabindex="1" type="text" name="Patientennummer" id="Patientennummer" value="123456" size="10" maxlength="6" />
Ich werde mich jetzt erst mal in eure Links einlesen und schauen was die so hergeben...

Antworten