C# 检测WebBrowser是否完成页面加载

C# 检测WebBrowser是否完成页面加载,c#,winforms,webbrowser-control,C#,Winforms,Webbrowser Control,如何检测System.Windows.Forms.WebBrowser控件何时完成加载 我尝试使用Navigate和DocumentCompleted事件,但在文档加载过程中,这两个事件都引发了几次 我认为DocumentCompleted事件也会对所有加载的子文档(例如JS和CSS)触发。您可以查看DocumentCompleted中的WebBrowserDocumentCompletedEventArgs,检查Url属性并将其与主页的Url进行比较 它似乎不会为外部Javascript或CS

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


我尝试使用Navigate和DocumentCompleted事件,但在文档加载过程中,这两个事件都引发了几次

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

它似乎不会为外部Javascript或CSS文件触发DocumentCompleted/Navigated事件,但会为iFrame触发。正如PK所说,比较WebBrowserDocumentCompletedEventArgs.Url属性(我还没有发表评论的理由)。

如果您使用WPF,则存在一个
LoadCompleted
事件

如果是
Windows.Forms
,则
DocumentCompleted
事件应该是正确的。如果正在加载的页面具有帧,则
WebBrowser
控件将为每个帧触发
DocumentCompleted
事件(有关详细信息,请参阅)。我建议每次触发事件时检查
IsBusy
属性,如果为false,则说明页面已完全加载完毕。

我执行了以下操作:

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
}

From.

注意,由于服务器传输或url规范化,DocumentCompleted中的url可能与导航url不同(例如,您导航到www.microsoft.com并进入documentcomplete)

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

在本机代码中,您可以使用。但是,在Windows窗体中,发件人参数不是由WebBrowserDocumentCompletedEventArgs包装的。您可以获取参数的值,也可以检查DocumentCompleted事件处理程序中的或,以查看是否所有帧都处于就绪状态


readystate方法存在问题,因为如果存在,并且导航到可下载的文件,则下载管理器可能会取消导航,readystate将无法完成。

我遇到了多个
DocumentCompleted
激发事件的相同问题,并尝试了上述所有建议。最后,在我的例子中,
IsBusy
属性和
Url
属性似乎都不正确,但
ReadyState
似乎是我所需要的,因为它在加载多个帧时的状态为“Interactive”,只有在加载最后一个帧后才获得状态“Complete”。因此,我知道页面何时满载其所有组件


我希望这也能对其他人有所帮助:)

以下方法应该有效

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
}

将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时,此代码对我有效,但我不知道如何在使用HtmleElement.InvokeMember(“单击”)单击html按钮时控制页面完成。

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

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

你如何使用c#?这是一个asp.net问题,还是您正在使用web浏览器控件?@kibibu我正在使用WebBrowser控件。如果页面有许多帧,比较绝对路径可能不起作用。我以前试过那种方法,但还没有成功。我仍然被这个问题困扰着(:(这就是我自己从解决这个问题中得出的结论。我在广告横幅之类的东西上得到了一大堆额外的补全。我丢弃了任何与我要查找的URL不匹配的事件,它就可以工作了。@Loren Pechtel我很吃惊地说,这种方法有3个问题。首先,当你的父母(最高级别)url执行服务器端url重定向,文档的url试图与更改进行比较。其次,框架和父页面具有相同url的情况会改变其他参数(如Referer等)的行为,因此url是相同的。此外,客户端重定向-它们发生在您认为页面已加载和webbrowser c之后ontrol返回“一切就绪”。如果您想获得有关如何减少这些内容的帮助,请告诉我&我可以在这里提供答案。@Paul Kearney-pk请随意阅读我对Loren的最后一条评论。从臀部射击-但我会打赌脚本不会发射documentloaded-因为它们没有“附加”DOMDocument。这可能是框架,因为包含框架集的html段是从技术上讲,我需要在windows中嵌入windows—因此有多个documentsPerfect—这正是我所需要的。解释了为什么有时显示整个页面,有时只显示部分页面。只需将其更改为((WebBrowser)sender.Url;-)不是很有效。问题是有facebook和twitter内容,主要问题是页面是否通过js和ajax加载内容。documentReady事件中的所有内容。如何调用它?我尝试调用它
BrowserDocumentCompleted(发件人,e);
@vanloc名称无关紧要。您只需将其分配给WebBrowser控件的DocumentCompleted事件。您如何知道上次调用它的时间?非常有用且简单!在我的应用程序中,事件至少触发了四次times@JackGriffin这是因为每个iframe也是一个文档,因此将触发事件要做到这一点很难。你可以像Paul在上面的回答中提到的那样检查URL,但这也可能失败,正如Erx_VB所描述的那样。