2012-09-27 90 views
3

我是新來的C#及其概念,所以我很抱歉,如果這個問題是一種愚蠢的。 我嘗試使用的WinForms WebBrowser控件WebBrowser控件 - 等待頁面加載後提交表格

elements = webBrowser1.Document.GetElementsByTagName("input"); 
foreach (HtmlElement element in elements) 
{ 
    if (element.GetAttribute("value") == "Anzeigen") 
    element.InvokeMember("click"); 
} 

while (webBrowser1.ReadyState != WebBrowserReadyState.Complete) Application.DoEvents(); 

// do some math on recived html 
// ...... 

// show results 
MessageBox.Show(numPlanets.ToString()); 

所以做一些automatation,來解釋它: 進出口尋找值爲「Anzeigen」按鈕,模擬就可以了一下,然後等到新頁然後加載並做我的計算。 不幸的是,我的計算是在舊的HTML內容上完成的,因爲它沒有等待頁面加載。奇怪的是,如果我輸入一個Thread.Sleep(5000);在foreach循環之後,在模擬點擊之前執行該睡眠,並且計算也失敗。

我只是需要一些同步行爲,沒有使用事件。

希望你能幫助我與,對不起我的英文不好

編輯: 解決這樣的: 變量BOOL webbbrowserfinished裏面的類=假,如果我想要同步的行爲,我不喜歡這樣:

webbrowserfinished = false; 
    // do navigation here 

    while (!webbrowserfinished) 
    { 
     Application.DoEvents(); 
     Thread.Sleep(100); 
    } 
    webbrowserfinished = false; 
+0

爲什麼不你想使用事件嗎? –

+0

這是不可能的,國際海事組織。我使用了web瀏覽器控件_a lot_,包括[編輯模式](http://www.codeproject.com/Articles/43954/ZetaHtmlEditControl)。我從來沒有找到同步解決方案,因爲我確實認爲加載只是異步進行的。 –

回答

5

您可以試試WebBrowser.DocumentCompleted Event 當WebBrowser控件完成加載文檔時發生。

private void Form1_Load(object sender, EventArgs e) 
{ 
    webBrowser1.Navigate("google.com"); 
    webBrowser1.DocumentCompleted += new WebBrowserDocumentCompletedEventHandler(webBrowser1_DocumentCompleted); 
} 

void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    MessageBox.Show("Completed Now!"); 
} 
+0

不幸的是,他說「沒有使用事件」。 –

+0

哎呀對不起,讀了 –

+0

我的事件的問題是,我不得不一遍又一遍地做這個。我去一個新的頁面,做數學,去一個新的一頁,做數學,去一個新的頁面....我認爲這不能解決優雅的事件,糾正我,如果我錯了 –

0

那麼它是不是最好的解決方案,但是當網絡瀏覽器導航你總是可以啓動一個定時器,並設置timer1.Tick成類似3000,那麼timer1_Tick方法中,你可以做在你的計算新頁面,然後timer1.Stop();

使用事件可能有更好的解決方案,但我對自己的Web瀏覽器不太滿意。

+0

這似乎也使用事件;-) –

0

您可以使用Thread.sleep(5000)等待你的頁面加載,因爲如果你不這樣做,導航方法將加載一個新文檔到Web瀏覽器的控制,但它不會叫document_complete_event_handler