3

我正在尝试登录(执行一些日常任务)到网页(www.soccerproject.com),但我无法做到,因为提交按钮类是“超级按钮”,它没有 click() 处理程序,或者ID 开头。我尝试执行绑定到按钮的 onClick 方法的 JavaScript,但它没有工作,所以这是我的代码,如果有人可以提供一些帮助,我将不胜感激。

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;

我数到 4 的原因是 webBrowser 需要完全加载和显示网站(以便能够填写文本)。此外,wait() 函数只等待 200 毫秒(只是为了确定)。提前致谢

4

1 回答 1

4

您的代码中存在许多问题。计数和等待过程实际上是没有必要的。提供的代码向您展示了如何检测页面何时完全加载。Navigate不需要第二次调用,因为提交表单会导致浏览器加载主页。此代码已在提供的站点上进行了测试并且可以工作:)

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.
于 2013-08-02T07:27:33.390 回答