0

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

如果我用 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;
}

如果我用一个按钮来做,它会失败。打开的站点是处于未登录状态的站点。我尝试添加 10 秒或更长时间的 Thread.Sleep(),但响应是相同的。

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

有什么不同?怎么解决?

4

1 回答 1

1

很可能,问题出在这个片段上:

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

你只调用Application.DoEvents一次(这本身就是一个邪恶),然后你阻塞了 UI 线程的消息泵Thread.Sleep(10000)长达 10 秒。WebBrowser需要一个功能正常的 Windows 消息泵才能正常工作。

这是一个如何在没有或嵌套消息循环WebBrowser的情况下异步驱动自动化的示例。Thread.Sleep

于 2013-10-17T00:09:33.017 回答