Detect WebBrowser chargement complet de la page
Comment détecter un système.Windows.Forme.Le contrôle WebBrowser a terminé le chargement?
j'ai essayé d'utiliser les événements naviguer et DocumentCompleted, mais les deux ont été soulevées à quelques reprises lors du chargement de documents!
9 réponses
je pense que l'événement DocumentCompleted
sera viré pour tous les documents enfants qui sont chargés aussi (comme JS et CSS, par exemple). Vous pouvez regarder le WebBrowserDocumentCompletedEventArgs
dans DocumentCompleted
et vérifier la propriété Url et comparer cela à L'Url de la page principale.
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 vers laquelle on navigue, donc ça devrait marcher.
à Partir de ici .
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
}
notez que L'url dans DocumentCompleted peut être différente de l'url de navigation en raison du transfert du serveur ou de la normalisation de l'url (par exemple, vous naviguez vers www.microsoft.com et j'ai eu http://www.microsoft.com in documentcomplete)
dans les pages sans cadre, cet événement se déclenche une fois que le chargement est terminé. Dans les pages avec plusieurs cadres, cet événement se déclenche pour chaque cadre de navigation (note la navigation est supportée à l'intérieur d'un cadre, par exemple en cliquant sur un lien dans un cadre pourrait naviguer dans le cadre à une autre page). Le cadre de navigation de niveau le plus élevé, qui peut être ou non le navigateur de niveau le plus élevé, déclenche l'événement final D'achèvement de document.
en code natif vous comparez l'expéditeur de L'événement DocumentComplete pour déterminer si l'événement est l'événement final dans la navigation ou non . Cependant, dans Windows Forms, le paramètre sender n'est pas Enveloppé par WebBrowserDocumentCompletedEventargs. Vous pouvez soit évier de la maternelle de l'événement pour obtenir la valeur du paramètre, ou cocher la case propriété readystate du navigateur ou cadre " documents dans le DocumentCompleted gestionnaire d'événements pour voir si toutes les images sont dans l'état prêt.
Il ya un prolblem avec la méthode readystate comme si un download manager est présent et la navigation est vers un fichier téléchargeable, la navigation pourrait être annulée par le gestionnaire de téléchargement et le readystate ne deviendra pas complète.
j'ai eu le même numéro de plusieurs DocumentCompleted
événements tirés et essayé toutes les suggestions ci-dessus. Enfin, il semble que dans mon cas, ni la propriété IsBusy
ne fonctionne correctement ni la propriété Url
, mais la propriété ReadyState
semble être ce dont j'avais besoin, parce qu'elle a le statut "Interactive" lors du chargement des cadres multiples et elle obtient le statut "complète" seulement après avoir chargé le dernier. Ainsi, je sais quand la page est entièrement chargée avec tous ses composants.
j'espère que cela peut aider les autres aussi :)
il ne semble pas déclencher D'événements Documentcomplet/Navigated pour les fichiers Javascript ou CSS externes, mais il le fera pour les iframes. Comme le dit PK, comparez le document de Webbrowserpletedeventargs.Propriété Url (Je n'ai pas encore le karma de faire un commentaire).
si vous utilisez WPF, il y a un événement LoadCompleted
.
si c'est Windows.Forms
, l'événement DocumentCompleted
devrait être le bon. Si la page que vous chargez a des cadres, votre commande 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 si elle est fausse, alors votre page est entièrement chargée.
L'utilisation de L'événement DocumentCompleted avec une page avec plusieurs cadres imbriqués n'a pas fonctionné pour moi.
j'ai utilisé L'Interop.Bibliothèque SHDocVW pour lancer le contrôle WebBrowser comme ceci:
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 quand je navigue vers une URL définie en utilisant le webBrowserControl.Naviguer (url) méthode, mais je ne sais pas comment contrôler la page complète quand un bouton html est cliqué en utilisant le htmlElement.InvokeMember ("clic").
vous pouvez utiliser l'événement ProgressChanged ; la dernière fois qu'il est soulevé indiquera que le document est entièrement rendu:
this.webBrowser.ProgressChanged += new
WebBrowserProgressChangedEventHandler(webBrowser_ProgressChanged);