Comment attendre pour jQuery Ajax de requêtes à partir de WatiN?
Je suis en train d'écrire WatiN tests pour tester un Ajax application web et suis tombé sur un problème de synchronisation avec des requêtes Ajax.
Après une requête Ajax est déclenchée par une action sur la page, j'aimerais WatiN attendre jusqu'à ce que la demande est complète avant de valider que la page a été mise à jour correctement.
J'ai le sentiment que la solution implique eval-ing JavaScript d'enregistrer des gestionnaires pour $.ajaxStart
et $.ajaxComplete
de savoir si les demandes sont en cours. Je vais creuser dans ce peu de temps, mais je voulais voir si quelqu'un d'autre a déjà réglé ce problème. Semble que c'est un problème commun avec l'Ajax d'essais.
OriginalL'auteur Randy Klingelheber | 2010-03-03
Vous devez vous connecter pour publier un commentaire.
J'ai créé quelques WatiN extension de Navigateur méthodes pour résoudre ce problème, mais je suis toujours intéressé à d'autres solutions.
La
InjectAjaxMonitor
méthode crée un javascript variable globale qui s'attache à la ajaxStart et ajaxComplete événements, de suivre le nombre de demandes en cours.Chaque fois que vous avez besoin d'attendre pour les requêtes AJAX pour terminer avant de passer, vous pouvez ensuite appeler
browserInstance.WaitForAjaxRequest();
.J'ai mis le mondial de l'ajax de gestionnaires d'événements dans mon application masterpage. Aussi je ne garde un semaphone bits au lieu d'un compteur: lebobitz.wordpress.com/2011/03/06/...
Un problème avec votre code - si le site n'a pas de prise en charge jQuery (comme dans mon cas) - vous pourriez vouloir "injecter" de la première. Il suffit d'ajouter ce code avant de le "surveiller script". const string jquerry = @"var element1 = document.createElement('script');element1.src = 'ajax.googleapis.com/ajax/libs/jquery/1.8.0/...;"; navigateur.Eval(jquerry);
en ce qui concerne @Alex commentaire, assurez-vous d'ajouter l'élément de trop.
document.body.appendChild(element1);
OriginalL'auteur Randy Klingelheber
Cette solution ne fonctionne pas très bien à cause de
.ajaxStart
est appelée pour la première requête Ajax, tandis que.ajaxComplete
est appelée à chaque fois qu'une requête ajax est fini. si vous exécutez ce code simple dans votre console :et ajouter un peu de journalisation dans le
.ajaxStart
et.ajaxComplete
méthodes de gestionnaire, vous pouvez voir que.ajaxStart
gestionnaire sera appelé qu'une seule fois et.ajaxComplete
gestionnaire de deux fois. DoncajaxRequestCount
devient négatif et tous vos conception est vissé.Je vous suggère d'utiliser
.ajaxSend
au lieu de.ajaxStart
si vous voulez garder votre conception.Une autre solution serait d'utiliser
.ajaxStop
au lieu de.ajaxComplete
, mais en procédant ainsi, vous n'avez pas besoin de laajaxRequestCount
, vous avez seulement besoin d'un booléen qui disent que si il y a des requêtes ajax, derrière la scène.Très utile d'informations peuvent être trouvées : http://api.jquery.com/category/ajax/global-ajax-event-handlers/
Espère que cette aide.
OriginalL'auteur Baptiste Pernet
Je viens de tomber sur ce problème moi-même tout en travaillant sur des tests à l'aide de WatiN. J'ai trouvé que dans version 1.1.0.4000 de WatiN (publié le 2 Mai 2007 (dernière version en cours de 2.0 RC2 du 20 décembre 2009)), il est affirmé qu'un meilleur support pour la manipulation de l'Ajax dans les tests ont été ajoutés:
Exemple:
Voir le lien vers les notes de version pour plus d'informations.
Je n'ai pas regardé en détail, de sorte que je ne peux pas dire dans quels cas il peut être utile ou pas. Mais il pense qu'il pourrait être utile de mentionner dans le cas où quelqu'un d'autre vient à travers cette question.
OriginalL'auteur Julian