Je suis en train de tester une application django avec du sélénium, et une de mes pages utilise le jquery ui tabs element. L'un des onglets contient un tableau simple répertoriant certains utilisateurs, et est chargé via ajax. Lorsque vous utilisez l'application, l'onglet fonctionne très bien, mais lors de l'automatisation du test avec du sélénium, l'onglet ne semble pas charger son contenu! J'écris les tests moi-même en python. Au début, j'utilisais la méthode click de sélénium RC, mais comme je l'ai appris d'un test précédent, c'est plutôt bogué quand il s'agit de balises d'ancrage, donc j'ai eu recours à la solution que j'ai utilisée auparavant: wait_for_condition méthode et explicitement appelé l'événement de clic onglet (et même l'événement de chargement!) et néanmoins l'onglet était encore ne fonctionne pas!
Je suis au désespoir ici, la majorité de mes tests dépendent de cette page et près de la moitié d'entre eux sont sur cette table, mais, hélas, il semble que le sélénium vole le javascript! (J'ai d'autres tests dans la classe, et ils fonctionnent très bien, donc rien de bizarre ne se passe au niveau du serveur, ça semble être un problème causé par le sélénium du côté client) Mon code de test est similaire à ceci:Comment tester les jquery ajax avec du sélénium?
class TestMyApp(TransactionTestCase):
urls = 'myapp.test_urls'
def setUp(self):
self.verificationErrors = []
self.selenium = selenium("localhost", 4444, "*chrome", "http://localhost:8000/")
self.selenium.start()
#self.selenium.set_speed(2000)
self.selenium.window_maximize()
def test_users_list(self):
"""Test that an app's users are correctly listed"""
sel = self.selenium
users = []
for u in range(settings.FREE_USER_LIMIT/2):
users.append(self.app.users.create(name="testUser_%s"%uuid4()))
sel.open("/")
sel.wait_for_page_to_load("30000")
sel.wait_for_condition('selenium.browserbot.getCurrentWindow().jQuery("#tabs").tabs("select",1);\
selenium.browserbot.getCurrentWindow().jQuery("#tabs").tabs("load",1);',
3000)
for user in users:
try: self.failUnless(sel.is_text_present(user.name))
except AssertionError, e: self.verificationErrors.append(str(e))
try: self.failUnless(sel.is_text_present(str(user.added.date())))
except AssertionError, e: self.verificationErrors.append(str(e))
def tearDown(self):
self.selenium.stop()
self.assertEqual([], self.verificationErrors)
ipython est idéal pour cela, btw. http://ipython.scipy.org/moin/ – Purrell
Nice, j'ai effectivement installé ipython il y a quelques jours et c'est vraiment cool! Donc, j'ai fait ce que vous dites, je l'ai pris étape par étape patiemment et j'ai découvert que c'était, en fait * ma * faute: pour les tests j'utilisais un URLConf personnalisé (mappage des urls en django) et l'appel ajax augmentait -silently- un 404, donc l'élément n'a jamais vraiment apparu! Votre réponse est excellente, et va sûrement m'aider avec des problèmes similaires, merci! – lfborjas
:) Ouais pas de problème du tout, je suis content que cela ait aidé. J'ai été dans la même situation des dizaines (des centaines?) De fois alors je sais ce que c'est. Ce genre de chose peut arriver fréquemment, alors j'essaie vraiment de minimiser le temps de dépannage en faisant très attention, mais le truc de débogage interactif d'ipython fait des miracles et fait gagner du temps quand les caprices inévitables arrivent. J'ai vu des ateliers d'ingénierie qui essayent de faire des suites de test de Se à Java ... ouf, soyez heureux pour Python l'interprète! À la votre! – Purrell