我利用WebBrowser做一个浏览器。要求能够自动登陆,要求能够自动连接页面。要求能够自动的将页面中的表格中的数据自动保存下来。
    自动登陆部分我在http://www.163.com中测试可以通过,但在包含有框架页中就无法实现自动登陆的功能。
    下面是困扰我几天的问题,大家看看我的代码问题出在哪个地方。同时希望高手们为我调试一下。
    我需要自动登陆的页面  http://stbet.com procedure TForm1.LoginFrameset(document: IHTMLDocument2);
var
    index: Integer;
    ole_index: OleVariant;
    frame_dispatch: IDispatch;
    framed: IHTMLWindow2;
    obj_user : Olevariant;
    obj_pass : Olevariant;
    obj_submit : Olevariant;
begin
    if document = nil then
        exit;
    try
        for index := 1 to document.Frames.Length do
        try
            ole_index := index-1;
            frame_dispatch := document.Frames.Item(ole_index);            obj_user := document.all.item('username',0);
            obj_user.value := 'username';  //今后用户名从配置文件中取
            obj_pass := document.all.item('passwd',0);
            obj_pass.value := '0000';     //今后密码在配置文件中取
            obj_submit := document.all.item('Submit2',0);
            obj_submit.Click;            if frame_dispatch <> nil then
            begin
                framed := frame_dispatch as IHTMLWindow2;
                NavigateFrameset(framed.document);
            end;
        except
            on E: Exception do
            begin
            end
        end;
    except
        on E: Exception do
            begin
                Application.MessageBox(PChar(E.Message),
                PChar('Exception'));
            end;
    end;
end;procedure TForm1.Button1Click(Sender: TObject);
begin
  LoginFrameset(WebBrowser1.Document as IHTMLDocument2);
end;

解决方案 »

  1.   

    如何在TWebBrowser中设置默认的主页阿,如果打开则自动登录到这个主页上去?在Form.onshow 里添加
    URL := WideString('http://www.163.com');
    WebBrowser1.Navigate(URL);
      

  2.   

    zhangheaaa(竹)
    谢谢你的参与,你说的这一步我已经在程序中实现了。只是在我提问时没有表述出来。所以还希望你继续指点。
    我现在的问题的关键是在框架页中实现自动登录。如果登录页面是一个单独的也面要实现自动登陆是比较方便的。你可以仔细帮我看看LoginFrameset这个函数有什么问题。
      

  3.   

    在Form.onshow 里添加
    URL := WideString('http://www.163.com');
    WebBrowser1.Navigate(URL);
      

  4.   

    我重新说明一下我的问题,希望大家仔细帮我看看怎么实现这个网站的自动登录。
    我今天又做了很多的测试,http://www.csdn.net,http://www.sina.com.cn等都能够自动登录,唯独(http://stbet.com)这个网站不能自动登录,请各位大侠帮助我解决一下。//窗体激活时自动链接到http://stbet.com
    procedure TForm1.FormActivate(Sender: TObject);
    begin
      WebBrowser1.Navigate('http://stbet.com');
    end;//实现自动登录的功能。http://stbet.com的登录页面在框架页中,因此实现代码如下。
    procedure TForm1.LoginFrameset(document: IHTMLDocument2);
    var
        index: Integer;
        ole_index: OleVariant;
        frame_dispatch: IDispatch;
        framed: IHTMLWindow2;
        obj_user : Olevariant;
        obj_pass : Olevariant;
        obj_submit : Olevariant;
        webBrowserTemp :  IWebBrowser;
        documentTemp : IHTMLDocument2;
    begin
        if document = nil then
            exit;
        try
            for index := 1 to document.Frames.Length do
            try
                ole_index := index-1;
                frame_dispatch := document.Frames.Item(ole_index);            obj_user := document.all.item('username',1);
                obj_user.value := 'crr1951';  //今后用户名从配置文件中取
                obj_pass := document.all.item('passwd',0);
                obj_pass.value := '0000';     //今后密码在配置文件中取
                obj_submit := document.all.item('Submit2',0);
                obj_submit.Click;            if frame_dispatch <> nil then
                begin
                    framed := frame_dispatch as IHTMLWindow2;
                    LoginFrameset(framed.document);
                end;
            except
                on E: Exception do
                begin
                end
            end;
        except
            on E: Exception do
                begin
                    Application.MessageBox(PChar(E.Message),
                    PChar('Exception'));
                end;
        end;
    end;//通过一个按钮来触发自动登录。因为功能需求处于预研阶段,所以通过点击按钮来进行
    procedure TForm1.Button1Click(Sender: TObject);
    begin
      LoginFrameset(WebBrowser1.Document as IHTMLDocument2);
    end;
      

  5.   

    obj_user := document.all.item('username',1);
                obj_user.value := 'crr1951';  //今后用户名从配置文件中取
                obj_pass := document.all.item('passwd',0);
                obj_pass.value := '0000';     //今后密码在配置文件中取
                obj_submit := document.all.item('Submit2',0);
                obj_submit.Click;showmessage((string)obj_user) 看看有值没,没值就是网页的格式根本没取到
    那就没什么好方法呀,其实你可以跳过主页,只要他传
    httP://www.1643.com&?12
      

  6.   

    只要他传
    http://stbet.com/checkuser.php?username=1212121&password=121212
    你取值不就行了,干嘛那么复杂呢?
      

  7.   

    obj_user := document.all.item('username',1);
    obj_user.value := 'crr1951';  //今后用户名从配置文件中取obj_user的值没有取到,因为执行到obj_user.value := 'crr1951'就出异常了。
    你说的http://stbet.com/checkuser.php?username=1212121&password=121212这种方式我试了,但怎么不行,http://stbet.com/checkuser.php?username=1212121&passwd=121212链接无法打开的。
      

  8.   

    我原来也试过通过取值的方式来链接,但一直不行,所以我采用了现在的这种方式,但现在的这种方式还是无法取到obj_user等对象。
    我写了一段测试代码,将框架页中的所有页面的源码截取出来,是正确的。大家也可以看看这段测试代码。
    procedure TForm1.NavigateFrameset(document: IHTMLDocument2);
    var
        index: Integer;
        ole_index: OleVariant;
        frame_dispatch: IDispatch;
        framed: IHTMLWindow2;
    begin
        if document = nil then
            exit;
        try
            Memo1.Lines.Add(String(document.body.innerHTML));
            Memo1.Lines.Add(String(document.URL));        for index := 1 to document.Frames.Length do
            try
                Memo1.Lines.Add('This is Frames: ' + inttostr(index));
                ole_index := index-1;
                frame_dispatch := document.Frames.Item(ole_index);            if frame_dispatch <> nil then
                begin
                    framed := frame_dispatch as IHTMLWindow2;
                    NavigateFrameset(framed.document);
                end;
            except
                on E: Exception do
                begin
                end
            end;
        except
            on E: Exception do
                begin
                    Application.MessageBox(PChar(E.Message),
                    PChar('Exception'));
                end;
        end;
    end;
      

  9.   

    自己写个 checkuser.php
    username='这里输入EDIT1.TEXT的值'&passwd='这里输入EDIT2.TEXT'的值实际上就是
    edit1.text = 'admin'
    edit2.text = 'abcd'
    url := 'http://stbet.com/checkuser.php?username' + edit1.text + '&' passwd = edit2.text
    http://stbet.com/checkuser.php?username=admin&passwd=abcdcheckusr.php //PHP我不熟悉,写伪代码
    a = params('username')
    B = Params('passwd')后面就可以用PHP处理了
       
      

  10.   

    masterjames(james)
    谢谢你的关注,但我对php也不熟悉,一直没有做这方面的开发,现在要弄起来真困难。你能否帮我些一个这样的脚本,我现在还不理解的是php文件的运行环境是什么。是不是需要在应用服务器上。
      

  11.   

    procedure TForm1.Button1Click(Sender: TObject);
    var
      SList: TStringList;
      PostStr: String;
      i: Integer;
      PostData,Headers: OleVariant;
    begin
      SList := TStringList.Create;
      try
        SList.Add('http://stbet.com/app/member/login.php');
        PostStr := 'username=' + 'crr1951';
        PostStr := PostStr + '&passwd=' + '0000';
        PostStr := PostStr + '&uid=' + '85814c0';
        PostStr := PostStr + '&langx=' + 'zh-tw';    Headers := 'Content-Type: application/x-www-form-urlencoded'+ #10#13;
        PostData := VarArrayCreate([0, Length(PostStr)-1], varByte);
        for i := 0 to Length(PostStr)-1 do begin
          PostData[i] := Ord(PostStr[i+1]);
        end;
        WebBrowser1.Navigate(SList.Strings[0],EmptyParam,EmptyParam,PostData,Headers);
      finally
        SList.Free;
      end;
    end;
      

  12.   

    cronuz(cronus) 
    谢谢你的解答,不过这个网站里面的页面都是框架页,用你的方法确实可以登录进去,但进去后报错。页面脚本发生错误。错误原因是“top.ST_mem_index为空或者不是对象”。你觉得我能否利用WebBrowser控件获取框架页面中的子页面中的对象,通过对编辑框赋值,在通过触发提交按钮的点击事件进入。这样可能我的问题就可以得到解决了。因为后面的工作我还要继续对框架也中的页面进行自动的访问。