![]() |
AW: Webbrowser OleObject - Felder füllen
Hallo Robert,
wenn ich hier bei mir
Delphi-Quellcode:
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
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 = 'a' then // 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; ![]() Gruß |
AW: Webbrowser OleObject - Felder füllen
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:
Ändere mal bitte den Except-Block in
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;
Delphi-Quellcode:
Ist bei Dir der Debugger aktiv, so dass Du alle Fehler mitbekommst?
exept
on e : Exception do begin Memo1.Lines.Add(e.Message); // oder auch ShowMessage(e.Message); end; end; Und ändere bitte mal
Delphi-Quellcode:
in
if FormItem.Item(j).Name = FieldName then
Delphi-Quellcode:
Setze mal 'nen Breakpoint auf die Zeile
AnsiUpperCase(FormItem.Item(j).Name) = AnsiUpperCase(FieldName)
Delphi-Quellcode:
Die beiden Zeilen
FormItem.Item(j).Value := Value;
Delphi-Quellcode:
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.
Exit;
showmessage('Exit'); Funktioniert mit der Routine das Befüllen von Feldern, die Du auch auf anderem Weg befüllt bekommst? Also z. B.
Delphi-Quellcode:
statt
FillForm(webbrowser1,'LoginForm_Login', memo2.Lines[2])
Delphi-Quellcode:
?
webbrowser1.oleobject.document.forms.item(1).elements.item('LoginForm_Login').value := memo2.Lines[2];
|
AW: Webbrowser OleObject - Felder füllen
HI alle zusammen
Sorry bin gestern plötzlich weggeknackt :-D 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: ![]() URL nach dem Login: ![]() @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 ( ![]() 1. Ich klicke den Button an um auf das Login Formular zu gelangen:
Delphi-Quellcode:
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)
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;
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.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; end; 3. Nachdem also die Login Daten eingeben wurden und der Login Button gedrückt wurde (Ob Manuell oder per:
Delphi-Quellcode:
Warte ich bis die Seite wieder komplett geladen wurde und versuche dann die Felder per Button Klick zu füllen:
webbrowser1.oleobject.document.forms.item(1).submit;
Delphi-Quellcode:
Und hier will er mir eben einfach keins der Felder füllen! Erhalte einfach immer die Meldung: ShowMessage('Das Textfeld message wurde nicht gefunden.');
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; |
AW: Webbrowser OleObject - Felder füllen
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. |
AW: Webbrowser OleObject - Felder füllen
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.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; 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; |
AW: Webbrowser OleObject - Felder füllen
Ich habe jetzt übrigens mal dein Projekt genommen und die Lokale Adresse mit der Online Adresse ausgetauscht.
Das Einloggen habe ich manuell eingetippt und auch per maus den Login Button gedrückt. Danach kommen die 2 Skript Fehler Und dann wäre die wichtige (auszufüllende) Form da. Ich klicke also auf deinen Button (Mit dem Füllcode) und was kommt: Felder nicht gefunden |
AW: Webbrowser OleObject - Felder füllen
Hallo,
daraus schließen wir jetzt mal ganz einfach: Verhalten bei lokal geladener Datei <> Verhalten bei aus dem Web geladener Datei. Kann es sein, dass sich die Seiten (irgendwie) unterscheiden? Bitte einmal die von Dir geladene Datei als Textdatei speichern, zippen und hier dranhängen. Werde mir sie dann mal anschauen. Eine Möglichkeit könnte auch sein, dass die zu Fehler führenden Scripte bei korrekter Ausführung die Seite so verändern, dass das Befüllen nicht mehr funktioniert. Ist die Seite denn überhaupt dafür gedacht per Programm genutzt zu werden? |
AW: Webbrowser OleObject - Felder füllen
Liste der Anhänge anzeigen (Anzahl: 1)
Also die Seite ist offiziell nicht dafür gedacht. Aber ich wollte mir halt das Einloggen etc ersparen.
Also habe mich jetzt über das Delphi Project eingeloggt (So wie immer) und habe dann den Quellcode anzeigen lassen. (Im Anhang) 1x Datei Quellcode (Ohne Skript Fehler, Silent True) 1x Datei Quellcode (Mit Skript Fehler, Silent False) |
AW: Webbrowser OleObject - Felder füllen
Hallo,
bei Silent=false bekomme ich die Werte gesetzt, bei Silent=true nicht. Wenn man sich die Quelltexte der Seiten anschaut stellt man allerdings auch gewaltige Unterschiede fest. In der Seite mit Silent=true sind weder das Feld message noch recipient vorhanden. Schaut man sich die von HTML-Tags befreiten Seiten an, so sieht man zwei vollkommen unterschiedliche Seiten. |
AW: Webbrowser OleObject - Felder füllen
Hmm ok. Ich krieg sie aber auch bei silent=false nicht gefüllt. Egal ob ich ja oder nein bei den skript fehler drücke.
Was jemand was man da machen könnte? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:22 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