检测WebBrowser完整的页面加载

如何检测System.Windows.Forms.WebBrowser控件何时完成加载?

我尝试使用Navigate和DocumentCompleted事件,但在文档加载过程中,它们都被引发了几次。

我认为DocumentCompleted事件也会被加载的所有子文档(例如JS和CSS)触发。 您可以查看DocumentCompleted中的WebBrowserDocumentCompletedEventArgs ,并检查Url属性并将其与主页面的Url进行比较。

我做了以下几点:

 void BrowserDocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) { if (e.Url.AbsolutePath != (sender as WebBrowser).Url.AbsolutePath) return; //The page is finished loading } 

加载的最后一页往往是一个导航到,所以这应该工作。

从这里 。

以下应该工作。

 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 } 

请注意,由于服务器传输或URL规范化,DocumentCompleted中的url可能与导航url不同(例如,您导航到www.microsoft.com,并在documentcomplete中获得http://www.microsoft.com

在没有框架的页面中,这个事件在加载完成后触发一次。 在具有多个帧的页面中,针对每个导航框架触发该事件(注意在框架内支持导航,例如单击框架中的链接可以将框架导航到另一个页面)。 最高级别的导航框架,可能或不可能是顶级浏览器,触发最终的DocumentComplete事件。

在本机代码中,您将比较DocumentComplete事件的发件人,以确定事件是否是导航中的最终事件 。 但是,在Windows窗体中,sender参数不包含在WebBrowserDocumentCompletedEventArgs中。 您可以吸收本地事件以获取参数的值,也可以检查DocumentCompleted事件处理程序中的浏览器或框架文档的readystate属性,以查看是否所有框架都处于就绪状态。

现成的方法有一个臃肿,就好像下载pipe理器存在,导航到可下载的文件,导航可以被下载pipe理器取消,并且就绪状态不会完成。

我有多个DocumentCompleted触发事件的相同问题,并尝试了上面的所有build议。 最后,似乎在我的情况下既不IsBusy属性工作正确, Url属性,但ReadyState似乎是我所需要的,因为它具有加载多个帧时的状态“交互式”,它只有在加载后获得状态“完成”最后一个。 因此,我知道什么时候页面已经完全加载了所有的组件。

我希望这可以帮助别人:)

它似乎没有为外部Javascript或CSS文件触发DocumentCompleted / Navigated事件,但它将为iframes。 正如PK所说,比较WebBrowserDocumentCompletedEventArgs.Url属性(我没有业力做评论呢)。

如果您使用的是WPF,则会出现LoadCompleted事件。

如果是Windows.Forms ,则DocumentCompleted事件应该是正确的。 如果您正在加载的页面有框架,您的WebBrowser控件将触发每个框架的DocumentCompleted事件(请参阅此处了解更多详细信息)。 我build议每次事件被触发时检查IsBusy属性,如果它是假的,那么你的页面完全加载。

与具有多个嵌套框架的页面使用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”)单击htmlbutton时,我不知道如何控制页面完成。

您可以使用事件ProgressChanged; 最后一次提出将表明文档已完全呈现:

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