Wykryj WebBrowser pełne ładowanie strony

Jak mogę wykryć, kiedy System.Okna.Formularze.Kontrola WebBrowser zakończyła Ładowanie?

Próbowałem użyć zdarzenia Nawiguj i DocumentCompleted, ale oba zostały podniesione kilka razy podczas ładowania dokumentu!

Author: Lu55, 2010-05-06

9 answers

Myślę, że zdarzenie DocumentCompleted zostanie wywołane również dla wszystkich załadowanych dokumentów potomnych (na przykład JS i CSS). Możesz spojrzeć na WebBrowserDocumentCompletedEventArgs w {[0] } i sprawdzić właściwość Url i porównać ją z adresem URL strony głównej.

 32
Author: Paul Kearney - pk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-23 20:20:27

Zrobiłem co następuje:

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

  //The page is finished loading 
}

Ostatnia załadowana strona jest zazwyczaj tą, do której nawigujesz, więc powinno to zadziałać.

Z tutaj .

 27
Author: Kyle Rozendo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:26:19

Poniższe powinny zadziałać.

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
}
 16
Author: ePandit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-03-23 07:59:14

Uwaga adres url w DocumentCompleted może być inny niż nawigacja url ze względu na transfer serwera lub normalizację adresu url (np. www.microsoft.com I got http://www.microsoft.com in documentcomplete)

Na stronach bez ramek zdarzenie zostanie wywołane jeden raz po zakończeniu wczytywania. Na stronach z wieloma ramkami to zdarzenie jest wywołane dla każdej ramki nawigacyjnej (Uwaga nawigacja jest obsługiwana wewnątrz ramki, na przykład kliknięcie łącza w ramce może nawigować ramka na inną stronę). Ramka nawigacyjna najwyższego poziomu, która może, ale nie musi być przeglądarką najwyższego poziomu, zostanie wywołana ostateczne Zdarzenie DocumentComplete.

W kodzie natywnym można porównać nadawcę zdarzenia DocumentComplete, aby określić, czy zdarzenie jest ostatnim zdarzeniem w nawigacji, czy nie. Jednak w Windows Forms parametr sender nie jest zawijany przez WebBrowserDocumentCompletedEventargs. Możesz albo zatopić natywne Zdarzenie , aby uzyskać wartość parametru, albo sprawdź właściwość readystate przeglądarki lub frame documents w obsłudze zdarzenia DocumentCompleted, aby sprawdzić, czy wszystkie ramki są w stanie gotowym.

Istnieje prolblem z metodą readystate tak, jakby był obecny menedżer pobierania i nawigacja jest do pliku do pobrania, nawigacja może zostać anulowana przez menedżera pobierania i readystate nie stanie się kompletna.

 13
Author: Sheng Jiang 蒋晟,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-01-29 22:35:23

Miałem ten sam problem z wieloma wystrzeliwanymi zdarzeniami DocumentCompleted i wypróbowałem wszystkie powyższe sugestie. Wreszcie, wydaje się, że w moim przypadku żadna Właściwość IsBusy nie działa poprawnie ani Url, ale ReadyState wydaje się być tym, czego potrzebowałem, ponieważ ma status "interaktywny" podczas ładowania wielu ramek i otrzymuje status "ukończony" dopiero po załadowaniu ostatniej. Tak więc wiem, kiedy strona jest w pełni załadowana wszystkimi jej komponentami.

Mam nadzieję, że to też pomoże innym:)

 4
Author: iArv,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-11-14 15:46:03

Wydaje się, że nie wywołuje zdarzeń zakończonych/Nawigowanych dla zewnętrznych plików Javascript lub CSS, ale będzie dla ramek iFrame. Jak mówi PK, porównaj dokumenty WebBrowserDocumentCompletedEventargs.Właściwość Url (nie mam jeszcze karmy, aby dodać komentarz).

 3
Author: Joel Rein,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-06 02:30:22

Jeśli używasz WPF, istnieje Zdarzenie LoadCompleted.

Jeśli jest to Windows.Forms, Zdarzenie DocumentCompleted powinno być poprawne. Jeśli ładowana strona ma ramki, sterowanie WebBrowser uruchomi Zdarzenie DocumentCompleted dla każdej klatki (zobacz tutaj po więcej szczegółów). Sugerowałbym sprawdzenie właściwości IsBusy za każdym razem, gdy zdarzenie jest wywołane i jeśli jest false, to Twoja strona jest w pełni załadowana.

 2
Author: alimbada,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-06 02:56:00

Używanie zdarzenia DocumentCompleted ze stroną z wieloma zagnieżdżonymi ramkami nie działało dla mnie.

Użyłem Interop.Biblioteka SHDocVW do oddania kontrolki WebBrowser w następujący sposób:
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;
    }

Ten kod działa dla mnie podczas przechodzenia do zdefiniowanego adresu URL za pomocą webBrowserControl.Nawiguj (url) metoda, ale nie wiem, jak kontrolować stronę kompletną, gdy przycisk html jest kliknięty za pomocą htmlElement.InvokeMember ("klik").

 0
Author: Frank_FC,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-08-29 21:17:56

Możesz użyć zdarzenia ProgressChanged ; ostatni raz, gdy zostanie wywołane, wskaże, że dokument jest w pełni renderowany:

this.webBrowser.ProgressChanged += new
WebBrowserProgressChangedEventHandler(webBrowser_ProgressChanged);
 0
Author: Vincent Lidou,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-12-18 00:31:20