如何檢測System.Windows.Forms.WebBrowser控件何時完成加載?檢測WebBrowser完整頁面加載
我試圖使用導航和DocumentCompleted事件,但他們都在文件加載過程中引發了幾次!
如何檢測System.Windows.Forms.WebBrowser控件何時完成加載?檢測WebBrowser完整頁面加載
我試圖使用導航和DocumentCompleted事件,但他們都在文件加載過程中引發了幾次!
我認爲DocumentCompleted
事件將被加載的所有子文檔(例如JS和CSS)觸發。您可以查看的DocumentCompleted
並檢查Url屬性並將其與主頁的Url進行比較。
這就是我自己解決這個問題的想法,我在廣告橫幅等東西上得到了一些額外的補充,我放棄了與我之後的URL不匹配的任何事件,並且它的工作原理如下: – 2010-05-06 02:38:36
@Loren Pechtel我很害怕說這種方法有三個問題:第一,當你的父母(頂層)url做一個服務器端的URL重定向時,這個文件的URL會與變化進行比較;第二,這裏有一個框架的情況和父頁面具有相同的url,它改變其他參數,如引用等etc的行爲,所以url是相同的。客戶端重定向 - 他們發生後,你認爲該頁面已加載和瀏覽器控制返回「一切都很好如果你想得到如何減少這些問題的幫助,請告訴我,我可以在這裏提供答案。 – 2012-02-01 12:24:35
@Paul Kearney - pk隨時可以閱讀我最後一次對Loren的評論。 – 2012-02-01 12:27:46
它似乎沒有爲外部Javascript或CSS文件觸發DocumentCompleted/Navigated事件,但它將用於iframe。正如PK所說,比較WebBrowserDocumentCompletedEventArgs.Url屬性(我沒有業力來發表評論)。
如果您使用的是WPF,則有一個LoadCompleted
事件。
如果是Windows.Forms
,DocumentCompleted
事件應該是正確的。如果您正在加載的頁面有幀,則您的WebBrowser
控件將觸發每幀的DocumentCompleted
事件(有關更多詳細信息,請參閱here)。我建議每次事件被觸發時檢查IsBusy
屬性,如果它是假的,那麼你的頁面已經完全加載。
我做了以下內容:
void BrowserDocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath)
return;
//The page is finished loading
}
加載的最後一頁往往是一個導航到,所以這應該工作。
從here。
注意在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 browser或frame documents以查看是否所有框架都處於就緒狀態。
有一個與readystate方法一樣的瑕疵,就好像download manager存在並且導航是可下載的文件,導航可以被下載管理器取消並且readystate不會完成。
+1瞭解詳情和鏈接 – 2011-06-14 08:52:59
我有多個DocumentCompleted
激發事件的相同問題,並嘗試了以上所有建議。最後,似乎在我的情況下,既沒有IsBusy
屬性正常工作,也沒有Url
屬性,但ReadyState
似乎是我所需要的,因爲它在加載多個框架時具有「交互式」狀態,並且只有在加載後才獲得狀態「完成」最後一個。因此,我知道該頁面何時全部裝入其所有組件。
我希望這可以幫助其他人:)
以下應該工作。
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
}
非常有幫助和簡單! – 2014-07-02 22:52:48
在我的應用程序中,該事件至少被觸發了四次 – 2015-05-06 15:55:55
@JackGriffin這是因爲每個iframe也是一個文檔,因此會觸發事件。這樣做很棘手。您可以在上面的答案中查看Paul提到的Url,但這也可能失敗,如Erx_VB.NExT.Coder所述。如果要打開的URL位於某個預定義的URL集內,您可能會知道如何避免這些。 例如,當我第一次遇到這個問題時,我知道哪些URL將被打開,所以我創建了一個WebBrowser類的子類並向其添加了一些附加信息。然後,很容易(通過提示發件人對象)來執行此操作。 – Transcendental 2015-06-08 14:59:27
將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按鈕時,不知道如何控制頁面完成。
您可以使用事件ProgressChanged;最後一次提高將表明該文檔已完全呈現:
this.webBrowser.ProgressChanged += new
WebBrowserProgressChangedEventHandler(webBrowser_ProgressChanged);
你怎麼知道它最後一次被叫? – tmorell 2014-01-30 16:59:13
您是如何使用c#?這是一個asp.net問題,還是你使用網絡瀏覽器控制? – kibibu 2010-05-06 01:42:14
@kibibu我正在使用WebBrowser控件。 – Neir0 2010-05-06 01:44:14
如果頁面有很多幀,則比較AbsolutePath可能不起作用。我嘗試過這種方式,但還沒有成功。我仍然堅持這個問題。 :(:( – 2010-11-27 03:42:49