2009-05-23 10 views
3

J'écris un test Selenium en PHP pour vérifier les performances d'une application web dans Firefox. Je veux utiliser ceci comme ligne de base pour comparer différentes améliorations de performance (mise à niveau de JQuery, PHP 5.3, etc.). L'application web est très AJAX intense et jusqu'à présent je n'ai rencontré qu'un seul problème.Selenium element not found

J'ai un appel AJAX qui charge du contenu dans un div existant. Pour tester si l'appel est terminé, je suis en utilisant la ligne de code suivante:

$selenium->waitForCondition('$(\'div[id="divId"]\').height() > 100', $timeout); 

Cela fonctionne comme je m'y attendais, mais lorsque je tente de taper dans une entrée chargée dans la div, le sélénium jette l'erreur « élément entrée [@ id = "inputId"] introuvable ".

J'ai vérifié que l'identifiant de l'entrée est correct et j'ai essayé avec d'autres éléments d'entrée qui sont chargés dans la div et aucun d'entre eux ne fonctionne. J'ai également essayé d'ajouter un sommeil (30) pour que je sache avec certitude que les éléments sont dans le DOM et sur l'écran, mais encore une fois, cela n'a fait aucune différence.

Je suis vraiment bloqué à ce stade et je ne peux pas continuer jusqu'à ce que ce problème soit résolu. Toute aide est grandement appréciée.

Merci, James Armes

Répondre

4

Je regarde quelques petites choses:

  1. Assurez-vous que la condition que vous vérifiez contre est pas vrai avant que les articles sont chargés. La vérification height semble suspecte, par exemple - ne serait-il pas préférable de tester s'il y a des enfants présents dans la div? En fonction de la façon dont vous écrivez le sélecteur, Selenium peut penser que input[@id='inputId'] est l'identificateur actuel du sélecteur (et pas seulement inputId). Assurez-vous que ce n'est pas le cas. Essayez simplement d'utiliser inputId, ce qui devrait suffire car c'est un identifiant.

  2. Le sélénium peut être finicky. Essayez différents navigateurs pour voir si vous obtenez des résultats différents. Si c'est le cas, cela peut représenter une zone que le sélénium ne couvre pas bien. Bien que ceux-ci soient généralement rares et espacés, c'est possible. Mais nous aurions besoin de voir plus de code avant d'être sûr que c'est le cas.

+1

Le numéro 2 a résolu mon problème ici. En ce qui concerne le numéro 1, cela ne semble pas fonctionner comme prévu. Je vérifie la taille parce que la div a déjà des enfants, plus précisément une table. L'appel AJAX ajoute des lignes à la table (il le remplace en réalité par un nouveau avec le même identifiant). Une idée de comment je pourrais mieux le détecter? J'ai lu à propos des fonctions de waitForElement *, mais je ne les vois pas à ma disposition. – JamesArmes

+0

JamesArmes: Si l'appel ajoute des lignes, il suffit de stocker le nombre de lignes avant de passer l'appel. Puis comparez le nombre de lignes et voyez si elles sont modifiées, c'est-à-dire quelque chose comme '$ (" # tableId tr "). Size()> [ancienne taille ici]'. –

+0

John Feminella: J'ai essayé, mais il semble que l'exécution se poursuive comme si l'évaluation était vraie immédiatement. J'ai même essayé d'entrer une valeur littérale au lieu d'une variable que je savais être plus que la table d'origine et moins que la nouvelle sans différence. Juste pour voir ce qui se passerait, je l'ai aussi mis à un nombre beaucoup plus élevé que l'un ou l'autre table serait et il a juste continué l'exécution. – JamesArmes