我使用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();
}
区别是什么?怎么解决?
答案 0 :(得分:1)
最有可能的问题是这个片段:
while (browser.ReadyState != WebBrowserReadyState.Complete)
{
Application.DoEvents();
richLog.Text += Environment.NewLine + "Warten...";
Thread.Sleep(10000);
}
您只需调用一次Application.DoEvents
(evil on its own},然后用Thread.Sleep(10000)
阻止UI线程的消息泵长达10秒。 WebBrowser
需要功能正常的Windows消息泵才能正常工作。
Here's a example如何异步驱动WebBrowser
自动化,没有Thread.Sleep
或嵌套的消息循环。