2010-05-06 393 views
51

如何檢測System.Windows.Forms.WebBrowser控件何時完成加載?檢測WebBrowser完整頁面加載

我試圖使用導航和DocumentCompleted事件,但他們都在文件加載過程中引發了幾次!

+0

您是如何使用c#?這是一個asp.net問題,還是你使用網絡瀏覽器控制? – kibibu 2010-05-06 01:42:14

+0

@kibibu我正在使用WebBrowser控件。 – Neir0 2010-05-06 01:44:14

+0

如果頁面有很多幀,則比較AbsolutePath可能不起作用。我嘗試過這種方式,但還沒有成功。我仍然堅持這個問題。 :(:( – 2010-11-27 03:42:49

回答

31

我認爲DocumentCompleted事件將被加載的所有子文檔(例如JS和CSS)觸發。您可以查看的DocumentCompleted並檢查Url屬性並將其與主頁的Url進行比較。

+0

這就是我自己解決這個問題的想法,我在廣告橫幅等東西上得到了一些額外的補充,我放棄了與我之後的URL不匹配的任何事件,並且它的工作原理如下: – 2010-05-06 02:38:36

+5

@Loren Pechtel我很害怕說這種方法有三個問題:第一,當你的父母(頂層)url做一個服務器端的URL重定向時,這個文件的URL會與變化進行比較;第二,這裏有一個框架的情況和父頁面具有相同的url,它改變其他參數,如引用等etc的行爲,所以url是相同的。客戶端重定向 - 他們發生後,你認爲該頁面已加載和瀏覽器控制返回「一切都很好如果你想得到如何減少這些問題的幫助,請告訴我,我可以在這裏提供答案。 – 2012-02-01 12:24:35

+0

@Paul Kearney - pk隨時可以閱讀我最後一次對Loren的評論。 – 2012-02-01 12:27:46

3

它似乎沒有爲外部Javascript或CSS文件觸發DocumentCompleted/Navigated事件,但它將用於iframe。正如PK所說,比較WebBrowserDocumentCompletedEventArgs.Url屬性(我沒有業力來發表評論)。

2

如果您使用的是WPF,則有一個LoadCompleted事件。

如果是Windows.FormsDocumentCompleted事件應該是正確的。如果您正在加載的頁面有幀,則您的WebBrowser控件將觸發每幀的DocumentCompleted事件(有關更多詳細信息,請參閱here)。我建議每次事件被觸發時檢查IsBusy屬性,如果它是假的,那麼你的頁面已經完全加載。

26

我做了以下內容:

void BrowserDocumentCompleted(object sender, 
     WebBrowserDocumentCompletedEventArgs e) 
{ 
    if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath) 
    return; 

    //The page is finished loading 
} 

加載的最後一頁往往是一個導航到,所以這應該工作。

here

+4

就像一個魅力。 ..除了它實際工作。 – ImGreg 2012-05-11 16:41:31

+0

完美 - 正是我需要的。解釋爲什麼有時整個頁面出現,有時只是部分頁面。 – Elie 2012-12-28 04:08:05

+0

只需將其更改爲((WebBrowser)發件人).Url ;-) – juFo 2013-04-09 14:48:33

13

注意在DocumentCompleted的URL可以比導航網址由於服務器傳輸或URL規範化(例如,你導航到www.microsoft.com並得到了在一個DocumentComplete http://www.microsoft.com

在沒有框架的網頁,這個事件不同加載完成後觸發一次。在具有多個幀的頁面中,針對每個導航幀觸發該事件(注意在幀內支持導航,例如,單擊幀中的鏈接可將幀導航到另一個頁面)。最高級別的導航框架可能會或可能不是頂級瀏覽器,會觸發最終的DocumentComplete事件。

在本地代碼中,您將compare the sender of the DocumentComplete event to determine if the event is the final event in the navigation or not。但是,在Windows窗體中,sender參數未包含在WebBrowserDocumentCompletedEventArgs中。您可以使用sink the native event來獲取參數的值,也可以檢查DocumentCompleted事件處理程序中的readystate property of the browserframe documents以查看是否所有框架都處於就緒狀態。

有一個與readystate方法一樣的瑕疵,就好像download manager存在並且導航是可下載的文件,導航可以被下載管理器取消並且readystate不會完成。

+0

+1瞭解詳情和鏈接 – 2011-06-14 08:52:59

4

我有多個DocumentCompleted激發事件的相同問題,並嘗試了以上所有建議。最後,似乎在我的情況下,既沒有IsBusy屬性正常工作,也沒有Url屬性,但ReadyState似乎是我所需要的,因爲它在加載多個框架時具有「交互式」狀態,並且只有在加載後才獲得狀態「完成」最後一個。因此,我知道該頁面何時全部裝入其所有組件。

我希望這可以幫助其他人:)

16

以下應該工作。

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) 
{ 
    //Check if page is fully loaded or not 
    if (this.webBrowser1.ReadyState != WebBrowserReadyState.Complete) 
     return; 
    else 
     //Action to be taken on page loading completion 
} 
+0

非常有幫助和簡單! – 2014-07-02 22:52:48

+1

在我的應用程序中,該事件至少被觸發了四次 – 2015-05-06 15:55:55

+0

@JackGriffin這是因爲每個iframe也是一個文檔,因此會觸發事件。這樣做很棘手。您可以在上面的答案中查看Paul提到的Url,但這也可能失敗,如Erx_VB.NExT.Coder所述。如果要打開的URL位於某個預定義的URL集內,您可能會知道如何避免這些。 例如,當我第一次遇到這個問題時,我知道哪些URL將被打開,所以我創建了一個WebBrowser類的子類並向其添加了一些附加信息。然後,很容易(通過提示發件人對象)來執行此操作。 – Transcendental 2015-06-08 14:59:27

0

將DocumentCompleted事件與具有多個嵌套框架的頁面結合使用對我來說不起作用。

我用Interop.SHDocVW庫投WebBrowser控件是這樣的:

public class webControlWrapper 
{ 
    private bool _complete; 
    private WebBrowser _webBrowserControl; 

    public webControlWrapper(WebBrowser webBrowserControl) 
    { 
     _webBrowserControl = webBrowserControl; 
    } 

    public void NavigateAndWaitForComplete(string url) 
    { 
     _complete = false; 

     _webBrowserControl.Navigate(url); 

     var webBrowser = (SHDocVw.WebBrowser) _webBrowserControl.ActiveXInstance; 

     if (webBrowser != null) 
      webBrowser.DocumentComplete += WebControl_DocumentComplete; 

     //Wait until page is complete 
     while (!_complete) 
     { 
      Application.DoEvents(); 
     } 
    } 

    private void WebControl_DocumentComplete(object pDisp, ref object URL) 
    { 
     // Test if it's the main frame who called the event. 
     if (pDisp == _webBrowserControl.ActiveXInstance) 
      _complete = true; 
    } 

導航使用webBrowserControl.Navigate(URL)方法所定義的URL時,此代碼對我的作品,但我不當使用htmlElement.InvokeMember(「click」)單擊html按鈕時,不知道如何控制頁面完成。

0

您可以使用事件ProgressChanged;最後一次提高將表明該文檔已完全呈現:

this.webBrowser.ProgressChanged += new 
WebBrowserProgressChangedEventHandler(webBrowser_ProgressChanged); 
+10

你怎麼知道它最後一次被叫? – tmorell 2014-01-30 16:59:13