2012-12-20 51 views
1

我開始在C#中第一次使用WebBrowser控件。我正在嘗試做一些非常簡單的事情:在文本框中編寫文本,然後單擊登錄按鈕。使用DocumentComplete事件C#

WebContest wc_class = new WebContest(); 
... 

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

這裏的readyState的登錄頁面worck完美,接下來繼續寫在一個文本框文本,然後點擊一個按鈕

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頁面?

如何爲頁面導航中的所有事件做到這一點?

回答

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 
    } 
+0

但是,如果應用程序是爲羣衆寫的,會發生什麼? 我們都有不同的互聯網,您的方法可能不適合在某些情況下。 – Johnny

+0

@Johnny爲什麼不呢?正如我所說,計時器將觸發每一個讓我們說2秒,直到WebBrowserReadyState ==完成 – VladL

+0

okey,你能爲這個問題做一個完整的例子嗎? 我測試一些像這樣: this.wb.wbThread1.DocumentCompleted + = new System.Windows.Forms.WebBrowserDocumentCompletedEventHandler(this.wbThread1_DocumentCompleted); 它不能正常播種。 – Johnny