Подтвердить что ты не робот

Обнаружение полной загрузки веб-браузера

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

  //The page is finished loading 
}

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

От здесь.

Ответ 3

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

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
}

Ответ 4

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

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

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

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

Ответ 5

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

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

Использование события 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 the main frame who called the event.
        if (pDisp == _webBrowserControl.ActiveXInstance)
            _complete = true;
    }

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

Ответ 9

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

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