Обнаружение полной загрузки страницы WebBrowser



Как я могу определить, когда система.Окна.Формы.WebBrowser control завершил загрузку?



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

1032   9  

9 ответов:

Я думаю DocumentCompleted событие будет запущено для всех дочерних документов, которые также загружаются (например, JS и CSS). Вы можете посмотреть на WebBrowserDocumentCompletedEventArgs in DocumentCompleted и проверьте свойство 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 и получил http://www.microsoft.com в documentcomplete)

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

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

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

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

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

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

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

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

использование события DocumentCompleted со страницей с несколькими вложенными фреймами не сработало для меня.

я использовал взаимодействия.Библиотека 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-адрес, используя элемент управления WebBrowser.Перейдите (url) метод, но я не знаю, как управлять страницей завершена, когда кнопка html нажата с помощью htmlElement.InvokeMember ("click").

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

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

Comments

    Ничего не найдено.