使用DocumentComplete事件C#

时间:2012-12-20 16:00:58

标签: c# navigation browser

我开始在C#中第一次使用WebBrowser控件。我正在尝试做一些非常简单的事情:在文本框中编写文本然后单击按钮进行登录。

WebContest wc_class = new WebContest();
...

 wc_class.wbThread1.Navigate("http://www.mysite.com");
        while (wc_class.wbThread1.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents();

此处登录页面的ReadyState完美无缺,接下来继续在文本框中写入文本,然后单击按钮

wc_class.wbThread1.Document.GetElementById("field_email").SetAttribute("value", tbLogin.Text);
wc_class.wbThread1.Document.GetElementById("field_password").SetAttribute("value", tbPassword.Text);
wc_class.wbThread1.Document.GetElementById("field_remember").InvokeMember("click");
wc_class.wbThread1.Document.GetElementById("hook_FormButton_button_go").InvokeMember("click");

这次,登录后我需要从页面中提取链接。 做这样的事情:

...
foreach (HtmlElement link in wc_class.wbThread1.Document.Links)
            {
                string href = link.GetAttribute("HREF");
                string fileName = "links.txt";
                using (FileStream fs = new FileStream(fileName, FileMode.Append, FileAccess.Write))
                using (StreamWriter sw = new StreamWriter(fs))
                {
                    sw.WriteLine(href);
                } 

麻烦在于期待DocumentComplete事件。登录后的页面不等待加载。为什么?单击“登录按钮”后如何检查页面的ReadyState?

如何在页面导航中为我的所有活动做到这一点?

1 个答案:

答案 0 :(得分:0)

我遇到了这个问题并使用计时器解决了它。在InvokeMember("click");之后,我启动计时器几秒钟,并在计时器勾选时检查ReadyState。如果完成 - 停止计时器,否则它将再次点火。

System.Windows.Forms.Timer yesTimer;
yesTimer.Interval = 2000;

public Main()
{
  webBrowser1.Navigate("http://www.mysite.com");
  yesTimer.Start();
}

  private void yesTimer_Tick(object sender, EventArgs e)
  {
     if (webBrowser1.ReadyState != WebBrowserReadyState.Complete)
     {
        return;
     }

     yesTimer.Stop();
     //do here whatever you want then webBrowser1 is completed
  }