AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Webbrowser OleObject - Felder füllen

Ein Thema von gee21 · begonnen am 9. Apr 2013 · letzter Beitrag vom 10. Apr 2013
Antwort Antwort
gee21

Registriert seit: 3. Jan 2013
199 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Webbrowser OleObject - Felder füllen

  Alt 9. Apr 2013, 23:46
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: 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.htmlthen 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;
Robert
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#2

AW: Webbrowser OleObject - Felder füllen

  Alt 9. Apr 2013, 23:52
Hallo Robert,

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

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
gee21

Registriert seit: 3. Jan 2013
199 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: Webbrowser OleObject - Felder füllen

  Alt 10. Apr 2013, 00:02
Delphi-Quellcode:
///////////////// //////////////////////

if URL= 'http://www1.sunrise.ch/SMS-Sender-cbBpfAqFI.RUoAAAEwinJTNyCu-Sunrise-Residential-Site-WFS-de_CH-CHF.htmlthen 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)
Robert
  Mit Zitat antworten Zitat
Volker Z.

Registriert seit: 3. Dez 2012
Ort: Augsburg, Bayern, Süddeutschland
419 Beiträge
 
Delphi XE4 Ultimate
 
#4

AW: Webbrowser OleObject - Felder füllen

  Alt 10. Apr 2013, 00:25
Hallo Robert,

wenn ich hier bei mir
Delphi-Quellcode:
procedure TForm4.Button1Click(Sender: TObject);
begin
  WebBrowser1.Navigate ('http://www1.sunrise.ch/SMS-Sender-cbBpfAqFI.RUoAAAEwinJTNyCu-Sunrise-Residential-Site-WFS- de_CH-CHF.html');
  end;

procedure TForm4.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
begin
  ShowMessage (Url);
  repeat;
    Application.ProcessMessages;
    Sleep(1);
  until WebBrowser1.ReadyState=4;

  webbrowser1.oleobject.document.forms.item(1).elements.item('LoginForm_Login').value := 'a';

  if webbrowser1.oleobject.document.forms.item(1).elements.item('LoginForm_Login').value = 'athen // Sinn dieser Zeile erschließt sich mir nicht
    begin
      webbrowser1.oleobject.document.forms.item(1).elements.item('LoginForm_Password').value := 'b' ;
      webbrowser1.oleobject.document.forms.item(1).submit;
    end;
end;
ausführe habe ich keine Probleme. Natürlich erhalte ich eine ReLogin Seite (a, b als Login ist sicherlich Unsinn) mit einer anderen URL, also auch kein Problem. Ich kann Dir natürlich nicht sagen, was da für eine URL zurückgeliefert wird, wenn das Login passen sollte. Vielleicht liefert der Server dann auch http://www1.sunrise.ch/SMS-Sender-cb...tial-Site-WFS- de_CH-CHF.html aus

Gruß
Volker Zeller
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#5

AW: Webbrowser OleObject - Felder füllen

  Alt 10. Apr 2013, 00:30
Hallo,

also nochmal, da ich langsam aber sicher den Durchblick verliere (ist wohl doch inzwischen zu früh )

Du nutzt zum Befüllen diese Routine:
Delphi-Quellcode:
function FillForm(WebBrowser: tembeddedwb; FieldName: string; Value: string): Boolean;
var
  i, j: Integer;
  FormItem: Variant;
begin
  Result := False;
  //no form on document
  if WebBrowser.OleObject.Document.all.tags('FORM').Length = 0 then
  begin
    Exit;
  showmessage('Exit');
  end;
  //count forms on document
  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
        //when the fieldname is found, try to fill out
        if FormItem.Item(j).Name = FieldName then
        begin
          FormItem.Item(j).Value := Value;
          Result := True;
        end;
      except
        Exit;
      end;
    end;
  end;
end;
Ändere mal bitte den Except-Block in
Delphi-Quellcode:
exept
  on e : Exception do begin
    Memo1.Lines.Add(e.Message);
    // oder auch
    ShowMessage(e.Message);
  end;
end;
Ist bei Dir der Debugger aktiv, so dass Du alle Fehler mitbekommst?
Und ändere bitte mal if FormItem.Item(j).Name = FieldName then in AnsiUpperCase(FormItem.Item(j).Name) = AnsiUpperCase(FieldName) Setze mal 'nen Breakpoint auf die Zeile FormItem.Item(j).Value := Value; Die beiden Zeilen
Delphi-Quellcode:
    Exit;
  showmessage('Exit');
solltes Du mal vertauschen, beim Exit bist Du nämlich vor dem ShowMessage schon aus der Routine raus und bekommst nie zu sehen, wenn die Routine dort schon aussteigt.

Funktioniert mit der Routine das Befüllen von Feldern, die Du auch auf anderem Weg befüllt bekommst?

Also z. B. FillForm(webbrowser1,'LoginForm_Login', memo2.Lines[2]) statt webbrowser1.oleobject.document.forms.item(1).elements.item('LoginForm_Login').value := memo2.Lines[2]; ?
  Mit Zitat antworten Zitat
gee21

Registriert seit: 3. Jan 2013
199 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Webbrowser OleObject - Felder füllen

  Alt 10. Apr 2013, 11:41
HI alle zusammen

Sorry bin gestern plötzlich weggeknackt

Also @ Volker:
Wichtig wäre ja nur das die URL nach dem Login nicht mehr die gleiche ist, oder? Damit der Code in OnDocument Complete nur 1x ausgeführt wird.
Und wenn ich das korrekt sehe, passiert das auch so. Der Code wird 1x ausgeführt dann bin ich eingeloggt. Und dannach möchte ich ja mit dem Button1 die Felder füllen. (Was bis jetzt leider noch immer nicht klappt)

URL der Login Form: http://www1.sunrise.ch/SMS-Sender-cb...de_CH-CHF.html
URL nach dem Login: https://www1.sunrise.ch/is-bin/INTER...LoginProcess=1


@Nahpets
Sorry für die Verwirrung. Für das Login von dem wir hier sprechen, werden nur folgende Teile des Codes benutzt (Das was du meinst, wird nur bei einem anderen Server (www.bern-web.ch) angewendet (Wenn die Combobox auf itemindex 2 wäre))

1. Ich klicke den Button an um auf das Login Formular zu gelangen:
Delphi-Quellcode:
if combobox2.ItemIndex=2 then webbrowser1.Navigate('http://www.bern-web.ch/');

if combobox2.ItemIndex=1 then webbrowser1.Navigate('http://www1.sunrise.ch/SMS-Sender-cbBpfAqFI.RUoAAAEwinJTNyCu-Sunrise-Residential-Site-WFS-de_CH-CHF.html');
progressbar1.Position:=25;
2. Sobald die Login form voll geladen ist wird über OnDocument Complete folgender Code ausgeführt: (Die obere hälfte des Codes ist hierbei unrelevant da diese auch wieder nur bei WWW-.bern-web.ch benutzt wird)
Delphi-Quellcode:
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
var
i:integer;
begin

progressbar1.Position:=35;

if combobox2.ItemIndex=2 then begin
WB_GetHTMLCode(Webbrowser1, Memo2.Lines);
if FillForm(WebBrowser1, 'smsMessage', memo1.Text)=true then begin
 progressbar1.Position:=50;
  webbrowser1.Stop;
  FillForm(WebBrowser1, 'smsMessage', memo1.Text) ;
  FillForm(WebBrowser1, 'SMSEingabe', edit3.Text) ;
  if combobox1.ItemIndex=1 then FillForm(WebBrowser1, 'intlPrefix', '004176');
   if combobox1.ItemIndex=2 then FillForm(WebBrowser1, 'intlPrefix', '004177');
  if combobox1.ItemIndex=3 then FillForm(WebBrowser1, 'intlPrefix', '004178');
    if combobox1.ItemIndex=4 then FillForm(WebBrowser1, 'intlPrefix', '004179');

  webbrowser1.oleobject.document.forms.item(4).submit;
progressbar1.Position:=75;
  end else begin
      if progressbar1.Position=35 then begin
if edit7.Text='http://www.bern-web.ch/then begin
if pos('Heute wurden von Ihrer IP-Adresse',Memo2.Text) > 0 then label1.Caption:='Fehler: Limit erreicht! (IP oder Service wechseln)else label1.Caption:='Fehler: Service Down?';
label1.Visible:=true;
end;
end;
  end;
if edit7.Text='http://www.bern-web.ch/Bern/sms_ok/then begin
  Progressbar1.Position:=100;
webbrowser1.Navigate('www.google.com');
end;
  end;


///////////////// //////////////////////

if URL= 'http://www1.sunrise.ch/SMS-Sender-cbBpfAqFI.RUoAAAEwinJTNyCu-Sunrise-Residential-Site-WFS-de_CH-CHF.htmlthen 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;



end;


3. Nachdem also die Login Daten eingeben wurden und der Login Button gedrückt wurde (Ob Manuell oder per: webbrowser1.oleobject.document.forms.item(1).submit; Warte ich bis die Seite wieder komplett geladen wurde und versuche dann die Felder per Button Klick zu füllen:

Delphi-Quellcode:
begin
   Application.ProcessMessages;
   while webbrowser1.Busy do Application.ProcessMessages;
   while webbrowser1.ReadyState <> READYSTATE_COMPLETE do Application.ProcessMessages;
   if not WBFillForm(webbrowser1,'message',Memo1.Text) then begin
     ShowMessage('Das Textfeld message wurde nicht gefunden.');
   end;
   Application.ProcessMessages;
   while webbrowser1.Busy do Application.ProcessMessages;
   while webbrowser1.ReadyState <> READYSTATE_COMPLETE do Application.ProcessMessages;
end;
Und hier will er mir eben einfach keins der Felder füllen! Erhalte einfach immer die Meldung: ShowMessage('Das Textfeld message wurde nicht gefunden.');
Robert
  Mit Zitat antworten Zitat
nahpets
(Gast)

n/a Beiträge
 
#7

AW: Webbrowser OleObject - Felder füllen

  Alt 10. Apr 2013, 12:55
Hallo,

woweit so gut, mich interessierte eigentlich, ob Du nur Textareas nicht befüllt bekommst oder der Fehler bei allen Feldern auftritt, sofern Du die Routine nutzt, mit der 'message' gefüllt werden soll.

Den Quelltext zu meine Testprogramm, mit dem ich die Felder befüllt bekomme, habe ich als Anhang hinzugefügt.

Geändert von nahpets (21. Nov 2017 um 16:41 Uhr)
  Mit Zitat antworten Zitat
gee21

Registriert seit: 3. Jan 2013
199 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Webbrowser OleObject - Felder füllen

  Alt 10. Apr 2013, 13:02
Hi

Also beim Einloggen gehen alle Felder und Buttons.
Delphi-Quellcode:
procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
const pDisp: IDispatch; var URL: OleVariant);
begin

if URL= 'http://www1.sunrise.ch/SMS-Sender-cbBpfAqFI.RUoAAAEwinJTNyCu-Sunrise-Residential-Site-WFS-de_CH-CHF.htmlthen 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;

Nach dem Einloggen geht KEIN Feld. Respektive findet kein Feld mehr...

Delphi-Quellcode:
function 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 webbrowser1.Busy do Application.ProcessMessages;
   while webbrowser1.ReadyState <> READYSTATE_COMPLETE do Application.ProcessMessages;
   if not WBFillForm(webbrowser1,'message',Memo1.Text) then begin
     ShowMessage('Das Textfeld message wurde nicht gefunden.');
   end;
      if not WBFillForm(webbrowser1,'recipient',combobox1.Items[combobox1.ItemIndex]+edit3.Text) then begin
     ShowMessage('Das Textfeld recipient wurde nicht gefunden.');
   end;

   Application.ProcessMessages;
   while webbrowser1.Busy do Application.ProcessMessages;
   while webbrowser1.ReadyState <> READYSTATE_COMPLETE do Application.ProcessMessages;
end;
Robert
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:26 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