WebBrowser-Control Navigate() - 错误

时间:2013-10-16 18:48:34

标签: c# webbrowser-control

我使用WebBrowser-Control模拟登录,之后我从HTNML Source中读取页面中的数据。

如果我使用2个按钮和2次单击进行,它可以完美地运行:

private void btnTest_Click(object sender, EventArgs e)
{
   Login();
}

private void btnTest2_Click(object sender, EventArgs e)
{
   ReadData();
}

private static void Login()
{
   browser.Navigate("www.site.de");
   while (browser.ReadyState != WebBrowserReadyState.Complete)
   {
      Application.DoEvents();
      richLog.Text += "Warten...";
      Thread.Sleep(1000);
   }
   browser.Document.GetElementById("login_username").SetAttribute("value", username);
   browser.Document.GetElementById("login_password").SetAttribute("value", password);
   browser.Document.GetElementById("login_submit_6b86b171").InvokeMember("click");

   while (browser.ReadyState != WebBrowserReadyState.Complete)
   {
      Application.DoEvents();
      richLog.Text += Environment.NewLine + "Warten...";
      Thread.Sleep(10000);
   }
}

private static void ReadData()
{
   browser.Navigate("www.site.de/data");
   while (browser.ReadyState != WebBrowserReadyState.Complete)
   {
      Application.DoEvents();
      richLog.Text += Environment.NewLine + "Warten...";
      Thread.Sleep(1000);
   }
   richText.Text = browser.DocumentText;
   richLog.Text += Environment.NewLine + "Posts ausgelesen - Seite " + site;
}

如果我用一个按钮执行此操作,则会失败。打开的站点是NOT LOGGED-Status中的站点。我尝试添加一个10秒或更长的Thread.Sleep(),但响应是相同的。

private void btnTest_Click(object sender, EventArgs e)
{
   Login();
   ReadData();
}

区别是什么?怎么解决?

1 个答案:

答案 0 :(得分:1)

最有可能的问题是这个片段:

   while (browser.ReadyState != WebBrowserReadyState.Complete)
   {
      Application.DoEvents();
      richLog.Text += Environment.NewLine + "Warten...";
      Thread.Sleep(10000);
   }

您只需调用一次Application.DoEventsevil on its own},然后用Thread.Sleep(10000)阻止UI线程的消息泵长达10秒。 WebBrowser需要功能正常的Windows消息泵才能正常工作。

Here's a example如何异步驱动WebBrowser自动化,没有Thread.Sleep或嵌套的消息循环。