当前位置: 代码迷 >> C# >> 请教一个webBrowser的有关问题
  详细解决方案

请教一个webBrowser的有关问题

热度:75   发布时间:2016-05-05 03:50:05.0
请问一个webBrowser的问题
我想实现一个网站自动登陆然后自动操作的功能
我先在winform中放了一个webBrowser控件,在它加载完成时模拟登陆,
代码如下:
 
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (this.webBrowser1.ReadyState == WebBrowserReadyState.Interactive)
            {
                HtmlDocument document = this.webBrowser1.Document;
                IList<KeyValuePair<string, string>> loginMes = GetLoginMes();
                if (loginMes.Count == 0)
                {
                    MessageBox.Show("请至少录入一组用户名和密码!");
                }
                else
                {
                        document.GetElementById("txtusername").SetAttribute("value", loginMes[0].Key);
                        document.GetElementById("txtpassword").SetAttribute("value", loginMes[0].Value);

                        document.GetElementById("btnLogin").InvokeMember("click");
                }
            }
        }

登陆成功后webBrowser会跳转,然后又会执行webBrowser1_DocumentCompleted对不对?这时候代码
document.GetElementById("txtusername").SetAttribute("value", loginMes[0].Key);就会报错了,报txtusername不存在的错识,然后我还需要在跳转后做其它的时候,是不是我需要在webBrowser1_DocumentCompleted方法中判断webBrower1的url地址呢?比如像下面这样:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            if (this.webBrowser1.ReadyState == WebBrowserReadyState.Interactive)
            {
                HtmlDocument document = this.webBrowser1.Document;
                IList<KeyValuePair<string, string>> loginMes = GetLoginMes();
                if (loginMes.Count == 0)
                {
                    MessageBox.Show("请至少录入一组用户名和密码!");
                }
                else
                {
                 if (this.webBrowser1.Url.AbsoluteUri =="登陆地址")
                    {
                        document.GetElementById("txtusername").SetAttribute("value", loginMes[0].Key);
                        document.GetElementById("txtpassword").SetAttribute("value", loginMes[0].Value);

                        document.GetElementById("btnStaticLogin").InvokeMember("click");
                    }
else if(this.webBrowser1.Url.AbsoluteUri =="登陆地址后地址")
{
执行登陆后的功能
}
                }
            }
        }


如果webBrowser1一直跳转,我是不是需要在webBrowser1_DocumentCompleted方法中写很多的if判断,还是大家有其它的解决方法,请大家赐教!
------解决思路----------------------
interactive的时候还没下载完,等ready吧。

documentcomplete这个事件不提你说的不同网页这种情况,即使是同一个网页,每个框架也都会触发一次,执行代码之前应该检测事件到底是哪个网页发出来的。
------解决思路----------------------
  楼上正解 DocumentCompleted实际上上C#封装的Activex事件,会多次发生..
  相关解决方案