Определить полную загрузку страницы WebBrowser - PullRequest
55 голосов
/ 06 мая 2010

Как определить, когда элемент управления System.Windows.Forms.WebBrowser завершил загрузку?

Я пытался использовать события Navigate и DocumentCompleted, но оба они возникали несколько раз во время загрузки документа!

Ответы [ 9 ]

34 голосов
/ 06 мая 2010

Я думаю, что событие DocumentCompleted будет запущено для всех дочерних документов, которые также загружаются (например, JS и CSS). Вы можете посмотреть на WebBrowserDocumentCompletedEventArgs в DocumentCompleted, проверить свойство Url и сравнить его с URL-адресом главной страницы.

29 голосов
/ 06 мая 2010

Я сделал следующее:

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

  //The page is finished loading 
}

Последняя загруженная страница, как правило, является той, к которой обращались, поэтому это должно работать.

С здесь .

17 голосов
/ 23 марта 2012

Должно работать следующее.

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
}
13 голосов
/ 06 мая 2010

Обратите внимание, что URL-адрес в DocumentCompleted может отличаться от навигационного URL-адреса из-за передачи или нормализации URL-адреса сервера (например, вы переходите на сайт www.microsoft.com и получаете http://www.microsoft.com в documentcomplete)

На страницах без фреймов это событие вызывается один раз после завершения загрузки. На страницах с несколькими фреймами это событие вызывается для каждого навигационного фрейма (навигация по заметкам поддерживается внутри фрейма, например, щелкнув ссылку в фрейме, можно переместиться на фрейм на другую страницу). Навигационный фрейм самого высокого уровня, который может быть или не быть браузером верхнего уровня, запускает конечное событие DocumentComplete.

В нативном коде вы сравниваете отправителя события DocumentComplete, чтобы определить, является ли это событие последним в навигации или нет . Однако в Windows Forms параметр отправителя не переносится в WebBrowserDocumentCompletedEventArgs. Вы можете либо погасить нативное событие , чтобы получить значение параметра, либо проверить свойство readystate браузера или в фрейме документов в обработчике событий DocumentCompleted, чтобы увидеть, все кадры находятся в состоянии готовности.

Существует проблема с методом readystate, как если бы присутствовал менеджер загрузок , и навигация к загружаемому файлу, навигация может быть отменена менеджером загрузки, и состояние готовности не будет завершено .

4 голосов
/ 14 ноября 2011

У меня была одна и та же проблема с несколькими DocumentCompleted событиями, и я попробовал все предложения выше. Наконец, кажется, что в моем случае ни свойство IsBusy не работает правильно, ни свойство Url, но мне кажется, что ReadyState - это то, что мне нужно, потому что он имеет статус «Интерактивный» при загрузке нескольких кадров и получает статус «Завершить» только после загрузки последнего. Таким образом, я знаю, когда страница полностью загружена со всеми ее компонентами.

Надеюсь, это может помочь и другим:)

3 голосов
/ 06 мая 2010

Если вы используете WPF, событие LoadCompleted.

Если это Windows.Forms, событие DocumentCompleted должно быть правильным. Если на загружаемой странице есть фреймы, ваш элемент управления WebBrowser будет запускать событие DocumentCompleted для каждого фрейма (см. здесь для получения дополнительной информации). Я бы посоветовал проверять свойство IsBusy каждый раз, когда происходит событие, и если оно ложно, загрузка страницы завершена.

3 голосов
/ 06 мая 2010

Похоже, что он не вызывает события DocumentCompleted / Navigated для внешних файлов Javascript или CSS, но это будет для фреймов. Как говорит PK, сравните свойство WebBrowserDocumentCompletedEventArgs.Url (у меня пока нет кармы, чтобы комментировать).

0 голосов
/ 18 декабря 2013

Вы можете использовать событие ProgressChanged;последний раз, когда он поднимается, будет указывать, что документ полностью обработан:

this.webBrowser.ProgressChanged += new
WebBrowserProgressChangedEventHandler(webBrowser_ProgressChanged);
0 голосов
/ 30 августа 2013

Использование события 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;
    }

Этот код работает для меня при переходе к определенному URL-адресу с помощью метода webBrowserControl.Navigate (url), но я не знаю, как контролировать заполнение страницы при нажатии кнопки html с помощью htmlElement.InvokeMember («click»).

...