Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi TWbbrowser Formular ausfüllen und abschicken für Dummies (https://www.delphipraxis.net/111456-twbbrowser-formular-ausfuellen-und-abschicken-fuer-dummies.html)

goenner90 3. Apr 2008 18:29


TWbbrowser Formular ausfüllen und abschicken für Dummies
 
hi
Dp´ler,
dies ist mein erster Beitrag auf eurer Seite.
Ich bin jetzt aber leider nciht der Delphi-Pro in Sachen WEbbrowser.
(die Standard - Sachen , wie Vor , zurück, Refresh etc. und eine Adresse besuchen sind natürlich kein Problem aber es wäre sehr nett wenn ihr mir näher bringen könntet , wie man es hinbekommt im webbrowser ein formular auszufüllen und dieses Abzuschicken (submit --> soviel hab ich schon rausgefunden.)
Es handelt sich um die Seite Jappy.de und ich will ein Proggi schreiben was sich automatisch einloggt und die Seite halt im Intervall von 5 Minuten Neu lädt ( wobei das kein Problem darstellt, nur halt die Form [[Benutztername und Pw einzugeben und das abzuschicken bereitet mir Probleme]
Ich habe mir auch schon diberse Beiträge dazu im Forum durchgelesen verstehe das aber nicht :roll: ganz.

Wäre nett wenn mir jmd mal einen Source geben könnte.

Vielen Dank im Vorraus MFg goenner90

PS: Ich benutzte Delphi 7

toms 3. Apr 2008 19:04

Re: TWbbrowser Formular ausfüllen und abschicken für Dummies
 
Hallo und Willkommen in der Delphi-PRAXis! :hi:

Vorgehen:

Den Quelltext der Seite betrachten und den relevanten Teil suchen.
(Wenn du im Quelltext nach "Mitgliedsname" suchst, findest du diesen Code schnell)

Code:
   <form method="post" action="/passwort" id="login" onSubmit="javascript:ssl();">
   <div class="libo"><div style="height:10px"></div><div style="text-indent:8pt">Login:</div></div>
   <div class="lib">
   Mitgliedsname:
<input type="text" name="login[u]" class="libf">


   Passwort:
<input type="password" name="login[p]" class="libf"><input type="submit" name="Submit" value="login">


   [url="/passwort"]Passwort vergessen?[/url]


   <input type="checkbox" id="ssl_login" checked>[url="/infos/ssl/"]mit SSL-Verschl&uuml;sselung[/url]


    </div>
    </form>

Der "Mitgliedsname" muss also in das Input Feld mit dem Namen login[u]

Das "Passwort" muss also in das Input Feld mit dem Namen login[p]


Dann gehen wir alle Forms und darin enthaltenen Items durch und überprüfen, ob
der Name des Feldes mit unseren Feldern übereinstimmt.


Delphi-Quellcode:
var
  iForms, iItems: Integer;
  FormItem: OleVariant;
  FelddName: string;
begin
  FeldName := 'login[u]';
  // durch alle Forms iterieren
  for iForms := 0 to WebBrowser.OleObject.Document.forms.Length - 1 do
  begin
    FormItem := WebBrowser.OleObject.Document.forms.Item(iForms);
  // durch alle Form Items iterieren
    for iItems := 0 to FormItem.Length - 1 do
    begin
        // überprüfen, ob der Name des Items mit unserem gesuchten Feldnamen übereinstimmt
        if FormItem.Item(iItems).Name = FeldName then
        begin
          // Feld ausfüllen
          FormItem.Item(iItems).Value := 'Mein Mitgliedsname';
        end;
    end;
  end;

Verallgemeinert:

Delphi-Quellcode:
function WB_FillForm(WebBrowser: TWebBrowser; FieldName: string; sValue: string): Boolean;
var
  iForms, iItems: Integer;
  FormItem: OleVariant;
begin
  Result := False;
  for iForms := 0 to WebBrowser.OleObject.Document.forms.Length -1 do
  begin
    FormItem := WebBrowser.OleObject.Document.forms.Item(iForms);
    for iItems := 0 to FormItem.Length -1 do
    begin
      try
        if FormItem.Item(iItems).Name = FeldName then
        begin
          FormItem.Item(iItems).Value := sValue;
          Result := True;
        end;
      except
      end;
    end;
  end;
end;
Aufruf:

Delphi-Quellcode:
FillForm(Webbrowser1, 'login[u]','mein_Benutzername');
         FillForm(Webbrowser1, 'login[p]','mein_Passwort');
Die FillForm Prozedur kann natürlich auch erweitert werden, so dass mehrere Felder auf einmal übergeben werden und so ein mehrfaches iterieren der Felder entfällt.

Zum Abschicken genügt in diesem Fall dieser Aufruf:

Delphi-Quellcode:
WebBrowser1.OleObject.Document.forms.item(0).elements.item(2).click;
Wichtig ist, dass die Felder erst dann ausgefüllt werden, wenn das Dokument im Webbrowser fertig geladen ist.

Larsi 3. Apr 2008 19:06

Re: TWbbrowser Formular ausfüllen und abschicken für Dummies
 
Hi,
Herzlich Willkommen in der Delphi-Praxis! :dp:

Also ausfüllen geht so:
Delphi-Quellcode:
WebBrowser1.OleObject.document.forms.item(0).elements.item('FELDNAME').value:=Edit1.Text;
Absenden geht so:
Delphi-Quellcode:
WebBrowser1.OleObject.document.forms.item(0).submit;
Alles klar?


Info: Die Sachen habe ich hier gefunden: http://www.delphi-treff.de/tipps/net...et/katalog/48/
Also erstmal dort suchen bevor du fragst, ok?


MFG Lars Wiltfang


Edit: Das geht auch einfacher! Du brauchst halt nur einmailg den Namen, hier FELDNAME!

toms 3. Apr 2008 19:25

Re: TWbbrowser Formular ausfüllen und abschicken für Dummies
 
Hier noch eine Variante, ohne die 2 For-Schleifen:

Delphi-Quellcode:
uses
  MSHTML;

procedure WB_FillPwdForm(WB: TWebbrowser; UsernameField, User, PasswortField, Password: string);
var
  IDoc3: IHTMLDocument3;
  Inputs: IHTMLElementCollection;
  UID, UPWD: IHTMLElement;
begin
  if Assigned(WB.Document) and
    (Succeeded(WB.Document.QueryInterface(IHTMLDocument3, IDoc3))) then
  begin
    Inputs := IDoc3.getElementsByName(UsernameField);
    if Assigned(Inputs) then
    begin
      UID := Inputs.item(0, '') as IHTMLElement;
      if Assigned(UID) then
        (UID as IHTMLInputElement).value := User;
    end;
    Inputs := IDoc3.getElementsByName(PasswortField);
    if Assigned(Inputs) then
    begin
      UPWD := Inputs.item(0, '') as IHTMLElement;
      if Assigned(UPWD) then
        (UPWD as IHTMLInputElement).value := Password;
    end;
  end;
end;

// Beispiel Aufruf:
procedure TForm1.Button1Click(Sender: TObject);
begin
  WB_FillPwdForm(Webbrowser1, 'login[u]','mein_Benutzername','login[p]','mein_Passwort')
end;

Larsi 3. Apr 2008 19:26

Re: TWbbrowser Formular ausfüllen und abschicken für Dummies
 
Warum denn so schwer? :)

toms 4. Apr 2008 05:59

Re: TWbbrowser Formular ausfüllen und abschicken für Dummies
 
Zitat:

Zitat von Larsi
Warum denn so schwer? :)

Weil meine Methode (WB_FillPwdForm) etwas universeller ist.
D.h es spielt keine Rolle, in welcher Form sich das Element befindet.
Bei Frames wäre es nochmals komplizierter.

Beim Aufruf deines Codes muss sich das Element in Form 0 befinden oder man
muss die Form Nummer zuvor herausfinden.
Wenn sich z.B die Struktur der Webseite ändert, indem eine neue Form hinzukommt,
funktioniert dein Code nicht mehr und muss angepasst werden.

Dein Code macht auch keine Überprüfung, ob ein Dokument existiert, ob Forms überhaupt verfügbar ist etc.

Navigiere mal zu c:\ im Webbrowser. Dann verstehst du, was ich meine.

napsterxx 17. Mai 2008 19:14

Re: TWbbrowser Formular ausfüllen und abschicken für Dummies
 
UNd wie kann ich einen Radiobutton auswählen?

Matze 17. Mai 2008 19:21

Re: TWbbrowser Formular ausfüllen und abschicken für Dummies
 
Schau mal, ob dich eines der Themen weiterbringt:

Webbrowser element click
Selectfelder mit TWebBrowser ansprechen ?
Twebbrowser, Radiobutton auswählen

toms 18. Mai 2008 06:29

Re: TWbbrowser Formular ausfüllen und abschicken für Dummies
 
Hallo, für das Mini Webbrowser Demo habe ich mal folgende Funktion geschrieben:

Delphi-Quellcode:
// Radiobutton auswählen:
  WB_SetRadioCheckboxField(WB, 'radio', 'Water', True);
Delphi-Quellcode:
// Checkbox auswählen:
  WB_SetRadioCheckboxField(WB, 'checkbox', 'Milk', True);

Delphi-Quellcode:
function WB_FindFieldByValue(WebBrowser: TWebBrowser; FieldType, FieldValue: string; var Field: TPoint): boolean;
var
  i, j: Integer;
  FormItem: Variant;
begin
  Result := False;
  if WebBrowser.OleObject.Document.all.tags('FORM').Length <> 0 then
    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).Value = FieldValue) and
            (FormItem.Item(j).Type = FieldType) then
          begin
            Field.x := i;
            Field.Y := j;
            Result := True;
            Exit;
          end;
        except
          Exit;
        end;
      end;
    end;
end;
Delphi-Quellcode:
function WB_SetRadioCheckboxField(WebBrowser: TWebBrowser; FieldType, FieldValue: string; Checked: boolean): Boolean;
var
  Field: TPoint;
begin
  Result := WB_FindFieldByValue(WebBrowser, FieldType, FieldValue, Field);
  if Result then
  try
    WebBrowser.OleObject.Document.forms.Item(Field.x).Item(Field.y).Checked := Checked;
    Result := True;
  except
    Result := False;
  end;
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 19:38 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