Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Webbrowser OleObject - Felder füllen (https://www.delphipraxis.net/174215-webbrowser-oleobject-felder-fuellen.html)

nahpets 9. Apr 2013 23:03

AW: Webbrowser OleObject - Felder füllen
 
Hallo,

habe mal rumprobiert. Dazu habe ich die von Dir zur Verfügunggestellte HTML-Seite lokal abgespeichert. Mit folgendem Quelltext bekomme ich den Inhalt von Memo1.Text in das Formular:
Delphi-Quellcode:
unit ClientUnit1;

interface

uses
  SysUtils, Dialogs, Forms,OleCtrls, SHDocVw, Classes, Controls, StdCtrls, StrUtils;

type
  TForm1 = class(TForm)
    Button1: TButton;
    wb: TWebBrowser;
    Memo1: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    function WBFillForm(wb: TWebBrowser; sFieldName: string; sValue: string): Boolean;
    procedure Button2Click(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

// ...HTML Formulare mit TWebBrowser automatisch ausfüllen lassen?
function TForm1.WBFillForm(wb: TWebBrowser; sFieldName: string; sValue: string): Boolean;
var
  i, j: Integer;
  FormItem: Variant;
begin
  Result := False;
  //no form on document
  if wb.OleObject.Document.all.tags('FORM').Length = 0 then begin
    Exit;
  end;
  //count forms on document
  for I := 0 to wb.OleObject.Document.forms.Length - 1 do begin
    FormItem := wb.OleObject.Document.forms.Item(I);
    for j := 0 to FormItem.Length - 1 do begin
      try
        // when the fieldname is found, try to fill out
        if AnsiUpperCase(FormItem.Item(j).Name) = AnsiUpperCase(sFieldName) then begin
          FormItem.Item(j).Value := sValue;
          Result := True;
        end;
      except
        Exit;
      end;
    end;
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Application.ProcessMessages;
  while wb.Busy do Application.ProcessMessages;
  while wb.ReadyState <> READYSTATE_COMPLETE do Application.ProcessMessages;
  if not WBFillForm(wb,'message',Memo1.Text) then begin
    ShowMessage('Das Textfeld message wurde nicht gefunden.');
  end;
  Application.ProcessMessages;
  while wb.Busy do Application.ProcessMessages;
  while wb.ReadyState <> READYSTATE_COMPLETE do Application.ProcessMessages;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  wb.Navigate('E:\Delphi\WebModule\test.html');
  ShowMessage('***');
end;

end.
Allerdings nutze ich TWebBrowser und nicht tembeddedwb. Sollte dies die Ursache sein? Eigentlich ehre nicht.

gee21 9. Apr 2013 23:14

AW: Webbrowser OleObject - Felder füllen
 
Liste der Anhänge anzeigen (Anzahl: 2)
Ok. Ich habe jetzt auch den Twebbrowser genommen. Und dein Code kopiert. Es geht immer noch nicht "Feld wurde nicht gefunden".

Aber beim Twebbrowser erscheinen mir beim laden 2 Script Fehler könnte es irgendwie an dem liegen?
Ich glaube ich könnte diese ja ignorieren (aber evt passiert ja da der fehler?)

Volker Z. 9. Apr 2013 23:19

AW: Webbrowser OleObject - Felder füllen
 
Hallo,

vermutlich liegt das Problem nicht beim Ausfüllen der Felder an sich, sondern an:
Delphi-Quellcode:
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin
  // [...]

  if combobox2.ItemIndex = 1 then
    begin
      repeat;
        application.processmessages;
        sleep(1);
      until webbrowser1.readystate=4;

      try
         webbrowser1.oleobject.document.forms.item(1).elements.item('loginform_login').value := memo2.lines[2];
      except
      end;

      if webbrowser1.oleobject.document.forms.item(1).elements.item('loginform_login').value =memo2.lines[2] then
        begin
          webbrowser1.oleobject.document.forms.item(1).elements.item('loginform_password').value := memo2.lines[3] ;
          webbrowser1.oleobject.document.forms.item(1).submit; // <-- HIER liegt wohl das Problem
        end;

      //server1 ende
    end;
end;
Das submit sendet die Daten an den Server, der Server antwortet, es wird erneut TForm1.WebBrowser1DocumentComplete aufgerufen, combobox2.ItemIndex hat noch immer den Wert 1, der Versuch loginform_login mit einem Wert zu befüllen scheitert.

Gruß

gee21 9. Apr 2013 23:30

AW: Webbrowser OleObject - Felder füllen
 
Hi Volker :-D

Genau das habe ich auch gerade gedacht. Darum hab ich gerade so abgeändert:

Delphi-Quellcode:
///////////////// //////////////////////

if combobox2.ItemIndex=1 then begin
combobox2.ItemIndex:=0;

repeat;
Application.ProcessMessages;
Sleep(1);
until WebBrowser1.ReadyState=4;


webbrowser1.oleobject.document.forms.item(1).elements.item('LoginForm_Login').value := memo2.Lines[2];


if webbrowser1.oleobject.document.forms.item(1).elements.item('LoginForm_Login').value =memo2.Lines[2] then begin
webbrowser1.oleobject.document.forms.item(1).elements.item('LoginForm_Password').value := memo2.Lines[3] ;
webbrowser1.oleobject.document.forms.item(1).submit;
end;

//Server1 ENDE

end;

So dürfte der abschnitt ja nur 1x durchgeführt werden. Aber leider gleicher Effekt.

nahpets 9. Apr 2013 23:33

AW: Webbrowser OleObject - Felder füllen
 
Hallo,
Zitat:

Zitat von gee21 (Beitrag 1210902)
Ok. Ich habe jetzt auch den Twebbrowser genommen. Und dein Code kopiert. Es geht immer noch nicht "Feld wurde nicht gefunden".

Aber beim Twebbrowser erscheinen mir beim laden 2 Script Fehler könnte es irgendwie an dem liegen?
Ich glaube ich könnte diese ja ignorieren (aber evt passiert ja da der fehler?)

Die beiden Fehler habe ich auch bekommen und ignoriert, da sie beim Laden der Seite auftreten, aber nicht beim Befüllen.

Kommentier bitte diese Zeile mal aus:
Delphi-Quellcode:
webbrowser1.oleobject.document.forms.item(1).submit;
Änderd sich dann was?

Volker Z. 9. Apr 2013 23:39

AW: Webbrowser OleObject - Felder füllen
 
Hallo Robert,

warum gehst Du nicht über die URL, die Dir als Parameter übergeben wird. Werte doch einfach die aus anstatt Combobox2.ItemIndex

Gruß

gee21 9. Apr 2013 23:46

AW: Webbrowser OleObject - Felder füllen
 
Zitat:

Die beiden Fehler habe ich auch bekommen und ignoriert, da sie beim Laden der Seite auftreten, aber nicht beim Befüllen.

Kommentier bitte diese Zeile mal aus:
Delphi-Quellcode:
webbrowser1.oleobject.document.forms.item(1).submit;
Änderd sich dann was?

Habe die fehler nun auch ignoriert. Und den .submit Befehl deaktiviert (mit //). Dadurch musste ich den Login Knopf selber drücken. Aber leider füllte er auch nachher nicht das Feld aus. (Feld nicht gefunden)



@Volker:

Etwa so: (hilft aber auch nichts)
Delphi-Quellcode:
if webbrowser1.LocationURL= 'http://www1.sunrise.ch/SMS-Sender-cbBpfAqFI.RUoAAAEwinJTNyCu-Sunrise-Residential-Site-WFS-de_CH-CHF.html' then begin

repeat;
Application.ProcessMessages;
Sleep(1);
until WebBrowser1.ReadyState=4;

webbrowser1.oleobject.document.forms.item(1).elements.item('LoginForm_Login').value := memo2.Lines[2];

if webbrowser1.oleobject.document.forms.item(1).elements.item('LoginForm_Login').value =memo2.Lines[2] then begin

webbrowser1.oleobject.document.forms.item(1).elements.item('LoginForm_Password').value := memo2.Lines[3] ;
webbrowser1.oleobject.document.forms.item(1).submit;
end;

//Server1 ENDE
end;

Volker Z. 9. Apr 2013 23:52

AW: Webbrowser OleObject - Felder füllen
 
Hallo Robert,

ich meinte eigenlich
Delphi-Quellcode:
  if URL= 'http://www1.sunrise.ch/SMS-Sender-cbBpfAqFI.RUoAAAEwinJTNyCu-Sunrise-Residential-Site-WFS-de_CH-CHF.html' then
    begin
      [...]
    end
ich kenne die EmbeddeWB Komponente nicht, daher kann ich nicht sagen was in LocationURL drin steht.

Gruß

nahpets 9. Apr 2013 23:57

AW: Webbrowser OleObject - Felder füllen
 
Hallo,

bin nochmal durch den Quelltext und dabei fiel mir auf, dass mal von 'Message' und mal von 'smsMessage' die Rede ist.

Delphi-Quellcode:
  FillForm(WebBrowser1, 'smsMessage', memo1.Text) ;
  FillForm(WebBrowser1, 'SMSEingabe', edit3.Text) ;
Die beiden mit FillForm zu befüllenden Felder kann ich in der HTML-Datei nicht finden. Habe ich da was übersehen?

gee21 10. Apr 2013 00:02

AW: Webbrowser OleObject - Felder füllen
 
Delphi-Quellcode:
///////////////// //////////////////////

if URL= 'http://www1.sunrise.ch/SMS-Sender-cbBpfAqFI.RUoAAAEwinJTNyCu-Sunrise-Residential-Site-WFS-de_CH-CHF.html' then begin
repeat;
Application.ProcessMessages;
Sleep(1);
until WebBrowser1.ReadyState=4;

webbrowser1.oleobject.document.forms.item(1).elements.item('LoginForm_Login').value := memo2.Lines[2];

if webbrowser1.oleobject.document.forms.item(1).elements.item('LoginForm_Login').value =memo2.Lines[2] then begin

webbrowser1.oleobject.document.forms.item(1).elements.item('LoginForm_Password').value := memo2.Lines[3] ;
//webbrowser1.oleobject.document.forms.item(1).submit;
end;

//Server1 ENDE
end;


Geht Leider auch so nicht immer das gleiche... (Habe übrigens jetzt wieder den normalen Webbrowser genommen. So zu Sicherheit aber es macht eben auch keinen Unterschied)



Zitat:

Delphi-Quellcode:

FillForm(WebBrowser1, 'smsMessage', memo1.Text) ;
FillForm(WebBrowser1, 'SMSEingabe', edit3.Text) ;
Die beiden mit FillForm zu befüllenden Felder kann ich in der HTML-Datei nicht finden. Habe ich da was übersehen?
Das wird nur bei einem anderen Server so benötigt. (Den Server wähle ich mit der combobox2 aus)


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:12 Uhr.
Seite 2 von 3     12 3      

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