2013-10-16 59 views
0

我使用WebBrowser-Control模擬登錄,然後從HTNML Source的頁面讀取數據。WebBrowser-Control Navigate() - 錯誤

如果我和兩個按鈕和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

最有可能的,問題是這個片段:

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

你叫Application.DoEvents(這是一個evil on its own)只有一次,那麼你阻止用戶界面線程與Thread.Sleep(10000)消息泵爲長10秒。 WebBrowser需要功能性Windows消息泵才能正常工作。

Here's a example如何驅動WebBrowser自動化異步,沒有Thread.Sleep或嵌套消息循環。

相關問題