web-dev-qa-db-fra.com

Détecter le chargement complet de la page WebBrowser

Comment détecter un chargement de contrôle System.Windows.Forms.WebBrowser terminé?

J'ai essayé d'utiliser les événements Naviguer et DocumentCompleted, mais les deux ont été soulevés à quelques reprises lors du chargement du document!

56
Neir0

Je pense que l'événement DocumentCompleted sera déclenché pour tous les documents enfants également chargés (comme JS et CSS, par exemple). Vous pouvez regarder le WebBrowserDocumentCompletedEventArgs dans DocumentCompleted et vérifier la propriété Url et la comparer à l'URL de la page principale.

34

J'ai fait ce qui suit:

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

  //The page is finished loading 
}

La dernière page chargée a tendance à être celle sur laquelle vous avez navigué, cela devrait donc fonctionner.

De ici .

29
Kyle Rozendo

Ce qui suit devrait fonctionner.

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
}
17
ePandit

Notez que l'URL dans DocumentCompleted peut être différent de celui utilisé pour la navigation en raison du transfert du serveur ou de la normalisation de l'URL (par exemple, vous accédez à www.Microsoft.com et avez http://www.Microsoft.com dans documentcomplete).

Dans les pages sans cadres, cet événement se déclenche une fois après la fin du chargement. Dans les pages comportant plusieurs cadres, cet événement est déclenché pour chaque cadre de navigation (la navigation par note est prise en charge à l'intérieur d'un cadre. Par exemple, si vous cliquez sur un lien dans un cadre, vous pouvez le déplacer vers une autre page). Le cadre de navigation de niveau supérieur, qui peut être ou non le navigateur de niveau supérieur, déclenche l'événement DocumentComplete final.

En code natif, vous devriez comparez l'expéditeur de l'événement DocumentComplete pour déterminer s'il s'agit ou non de l'événement final de la navigation . Toutefois, dans Windows Forms, le paramètre expéditeur n'est pas encapsulé par WebBrowserDocumentCompletedEventArgs. Vous pouvez soit recevoir l'événement natif pour obtenir la valeur du paramètre, ou vérifier la propriété readystate du navigateur ou documents de trame dans le gestionnaire d'événements DocumentCompleted. pour voir si toutes les images sont prêtes.

Il y a un problème avec la méthode readystate comme si un gestionnaire de téléchargement était présent et que la navigation était dirigée vers un fichier téléchargeable; la navigation pourrait être annulée par le gestionnaire de téléchargement et le readystate ne serait pas complet.

13

J'ai eu le même problème de plusieurs événements déclenchés par DocumentCompleted et j'ai essayé toutes les suggestions ci-dessus. Enfin, dans mon cas, il semble que ni la propriété IsBusy ne fonctionne correctement ni la propriété Url, mais que le ReadyState semble être ce dont j'avais besoin, car elle a le statut 'Interactive' le chargement de plusieurs cadres et le statut "Terminé" n’est obtenu qu’après le chargement du dernier. Ainsi, je sais quand la page est complètement chargée avec tous ses composants.

J'espère que cela pourra aider les autres aussi :)

4
iArv

Si vous utilisez WPF, il existe un événement LoadCompleted.

Si c'est Windows.Forms, l'événement DocumentCompleted devrait être le bon. Si la page que vous chargez contient des cadres, votre contrôle WebBrowser déclenchera l'événement DocumentCompleted pour chaque cadre (voir ici pour plus de détails). Je suggère de vérifier la propriété IsBusy à chaque fois que l'événement est déclenché et s'il est faux, le chargement de votre page est entièrement terminé.

3
alimbada

Il ne semble pas déclencher d'événements DocumentCompleted/Navigated pour les fichiers JavaScript ou CSS externes, mais cela se produira pour les iframes. Comme PK le dit, comparez la propriété WebBrowserDocumentCompletedEventArgs.Url (je n'ai pas encore le karma pour faire un commentaire).

3
Joel Rein

L'utilisation de l'événement DocumentCompleted avec une page comportant plusieurs cadres imbriqués ne fonctionnait pas pour moi.

J'ai utilisé la bibliothèque Interop.SHDocVW pour convertir le contrôle WebBrowser comme suit:

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;
    }

Ce code fonctionne pour moi lorsque je navigue vers une URL définie à l'aide de la méthode webBrowserControl.Navigate (url), mais je ne sais pas comment contrôler la fin de la page lorsqu'un bouton html est utilisé à l'aide de la commande htmlElement.InvokeMember ("clic").

0
Frank_FC

Vous pouvez utiliser l'événement ProgressChanged; la dernière fois qu'il sera levé indiquera que le document est entièrement rendu:

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