2011-08-18 5 views
5

J'utilise Selenium pour tester une application web qui utilise Dojo, et il utilise le script Java pour afficher certains éléments. Je veux attendre que tous les éléments soient affichés avant d'essayer de manipuler la page, mais j'ai des problèmes.Comment compter les délais d'attente javascript actifs?

J'ai commencé en attendant que la variable dojo inFlight soit 0, ceci indique que tout ajax a fini. Cela ne fonctionne pas toujours parce qu'il semble faire certaines choses sur un timeout après.

J'ai également essayé à plusieurs reprises de chercher l'élément, mais ce n'est pas trop agréable, car peut-être il y aura plus tard du javascript qui utilisera ce champ d'une manière ou d'une autre. Donc, fondamentalement, je veux une méthode (dans firefox au moins) pour interroger le javascript en attente d'exécution sur un setTimeout (ou setInterval) Je pourrais même faire face à un moyen d'encapsuler l'appel intégré par une fonction de mon propre pour garder une trace de cela.

Toutes pensées ou suggestions appréciées!

Répondre

5

Toutes les fonctions de JavaScript peuvent être remplacées. Pensez à quelque chose comme ceci:

window.originalSetTimeout = window.setTimeout; 

window.setTimeout = function(func, delay, params) { 
    window.timeoutCounter++; 
    window.originalSetTimeout(window.timeoutCallback, delay, [func, params]); 
} 

window.timeoutCallback = function(funcAndParams) { 
    window.timeoutCounter--; 
    func = funcAndParams[0]; 
    params = funcAndParams[1]; 
    func(params); 
} 

Puis:

selenium.waitForCondition("window.timeoutCounter == 0"); 
1

Chaque fois que vous appelez setTimeout de setInterval - un identifiant de temporisateur est renvoyé.

  1. Enregistrer cet identifiant de minuterie dans un tableau
  2. Dans la fonction que vous appelez le délai d'attente, pop que id de minuterie du tableau. Parce que nous devons retirer cet identifiant du tableau dès que le timer se termine.
  3. Chaque fois que vous voulez vérifier le no. des temporisateurs actifs, interrogez simplement la longueur de ce tableau.
+0

Salut, merci pour votre réponse. Nous n'appelons pas setTimeout ou setInterval directement. Ils sont appelés par la bibliothèque Dojo, qui est utilisée par nos développeurs d'interface utilisateur. Nous essayons de tester l'application avec du sélénium, donc nous avons accès à exécuter javascript dans la page, mais nous ne pouvons pas facilement interférer avec le fonctionnement du code que nous testons. Peut-être y a-t-il un plugin firefox qui pourrait garder une trace de ceci pour nous et en quelque sorte superposer le mécanisme de timeout intégré? –

Questions connexes