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!
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.
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 .
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é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.
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 :)
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é.
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).
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").
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);