检测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);