3

I am trying to log in (to perform some routine tasks) into a webpage (www.soccerproject.com) and i am unable to do it since the submit buttons class is "superbutton" which doesnt have the click() handler, or an ID to begin with.i tried to execute the JavaScript bound to the onClick method of the button but it didnt work, so here is my code and i will be thankful if someone could provide some help.

procedure TForm1.Button1Click(Sender: TObject);
begin
WebBrowser1.Navigate('http://www.soccerproject.com/spnewl_index.php');
end;

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject;
  const pDisp: IDispatch; var URL: OleVariant);
var ii:integer ;
begin
if (WebBrowser1.LocationURL='http://www.soccerproject.com/spnewl_index.php') and (i<4) then inc(i);

if i=4 then begin
  WebBrowser1.OleObject.Document.getElementById('login').setAttribute('value', Edit1.Text);
  WebBrowser1.OleObject.Document.getElementById('password').setAttribute('value', Edit2.Text);  

  wait(200);
  WebBrowser1.OleObject.Document.forms[0].submit();
  WebBrowser1.Navigate('http://www.soccerproject.com/#');
  end;
end;

the reason i count to 4 is that thats the time the webBrowser needs to fully load and display the website (to be able to fill in the text). Also, the wait() function simply waits 200 milliseconds (just to be sure). Thanks in advance

Sir Rufo
  • 18,395
  • 2
  • 39
  • 73
Kubo Motýľ
  • 35
  • 1
  • 5

1 Answers1

4

There are a number of problems in your code. The counting and wait procedure are really not necessary. The code provided shows you how to detect when the page has completely loaded. The second call to Navigate is not needed because submitting the form will cause the browser to load the main page. This code has been tested with the provided site and works :)

unit u_frm_main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, OleCtrls, SHDocVw, MsHtml;

type
  TForm1 = class(TForm)
    WebBrowser1: TWebBrowser;
    Button1: TButton;
    procedure WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 WebBrowser1.Navigate('http://www.soccerproject.com/spnewl_index.php');
end;

procedure TForm1.WebBrowser1DocumentComplete(ASender: TObject; const pDisp: IDispatch; var URL: OleVariant);

var
  CurrentBrowser: IWebBrowser2;
  TopBrowser: IWebBrowser2;
  Document: OleVariant;
  Doc3 :  IHTMLDocument3;
  Frm  :  IHtmlFormElement;

begin
 CurrentBrowser := pDisp as IWebBrowser2;
 TopBrowser := (ASender as TWebbrowser).DefaultInterface;
 if Assigned(CurrentBrowser) and Assigned(TopBrowser) then
  begin
   if CurrentBrowser = TopBrowser then
    begin
     Doc3 := CurrentBrowser.Document as IHTMLDocument3;
     Webbrowser1.OnDocumentComplete := nil; // remove handler to avoid reentrance
     Doc3.getElementById('login').setAttribute('value', 'SO17999392', 0);
     Doc3.getElementById('password').setAttribute('value', 'XXXXX', 0);
     Frm := Doc3.getElementById('indexform') as IHtmlFormElement;
     if Assigned(Frm) then
      Frm.submit;
    end;
  end;
end;

end.
whosrdaddy
  • 11,720
  • 4
  • 50
  • 99
  • 1
    I'd say that you don't need to do this if you navigate to `http://www.soccerproject.com/login.php` posting data in `PostData` parameter of the `Navigate` method e.g. [`this way`](http://pastebin.com/Vmt8QYaF). The post request executed by that login script I sniffed by a browser and tested with Delphi 2009 and seems to work. Although I'm still wondering if there's a way to optimize that ugly looking copying of the parameters into the byte variant array used in my code. Maybe I'll ask a question about it. [+1] – TLama Aug 02 '13 at 08:20
  • @Tlama, nice alternative! I believe you can copy the bytes to your VarArray over with Move()? – whosrdaddy Aug 02 '13 at 09:07
  • thanks both, i sorted it out and now it does exactly what i want :) – Kubo Motýľ Aug 02 '13 at 11:54