2011-02-07 6 views
5

J'ai un projet Django pour lequel j'essaie d'écrire des tests d'interaction avec le sélénium. Mon objectif est de faire automatiser les tests de Hudson/Jenkins. Jusqu'à présent, je suis en mesure d'obtenir le test sur le serveur Django, mais à partir des journaux du serveur, je vois qu'il frappe l'URL /selenium-server/driver au lieu du bon chemin.Automatisation des tests de sélénium en Python

Voici mon code (basé sur ce qui a été généré par le plug-in IDE Sélénium pour Firefox:

from selenium import selenium 


class AccountAdminPageTests(unittest.TestCase): 
    def setUp(self): 
     self.selenium = selenium("localhost", 
           8000, 
           "*chrome", 
           "http://localhost:8000/") 
     self.selenium.start() 
     self.selenium.open("/") 

    def test_ok(self): 
     self.assertTrue(self.selenium.is_text_present('OK')) 

    def tearDown(self): 
     self.selenium.stop() 


if __name__ == "__main__": 
    unittest.main() 

Tous les indices

+0

vous devez avoir le sélénium exécuté sur un port différent (la valeur par défaut est 4444). Que c'est la raison pour laquelle vous frappez la mauvaise URL – retornam

Répondre

9

jamais vu l'erreur exacte, mais je pense que Sélénium tente de se connecter à votre application plutôt que le sélénium serveur (un fichier .jar).

Port du serveur de sélénium devrait être le premier argument de sélénium()

Cela devrait par défaut au port 4444, vous avez probablement commencer avec

$ java -jar selenium-server.jar 

FWIW voici comment je suis arrivé des tests de sélénium en cours d'exécution sur un serveur CI ...

from multiprocessing import Process 
from django.test import TestCase 
from selenium import selenium 

class SeleniumFixtureCase(TestCase): 
""" 
Wrapper to multiprocess localhost server and selenium instance on one 
test run. 
""" 

def setUp(self): 
    "Make the selenium connection" 
    TestCase.setUp(self) 
    self.server = Process(target=serve) 
    self.server.start() 
    self.verificationErrors = [] 
    self.selenium = selenium("localhost", 4444, "*firefox", 
          "http://localhost:8000/") 
    self.selenium.start() 

def tearDown(self): 
    "Kill processes" 
    TestCase.tearDown(self) 
    self.server.terminate() 
    self.selenium.stop() 
    self.assertEqual([], self.verificationErrors) 

def _login(self): 
    "Login as Albert Camus" 
    self.selenium.open("http://localhost:8000/admin/") 
    self.selenium.wait_for_page_to_load("30000") 
    self.selenium.type("id_username", "albert") 
    self.selenium.type("id_password", "albert") 
    self.selenium.click("//input[@value='Log in']") 
    self.selenium.wait_for_page_to_load("30000") 
+7

pour ce que self.server = Processus (cible = servir) signifie? il n'y a pas de mention de service ... –

1

Le deuxième argument de la selenium() appel est censé être le numéro de port du serveur Selenium (comme écrit dans la réponse de David), pas le numéro de port de l'application testée. Le numéro de port par défaut est 4444. Je remplacerais l'appel avec:

self.selenium = selenium("localhost", 4444, .... 
4

un collègue et moi-même créé quelques tests de sélénium automatisés utilisant django et le sélénium 2. Il fonctionne sans avoir à utiliser les fichiers jar. Voici un link to the code qui montre nos cas de test.

+0

+1 pour le code de lien. Je dois essayer ça. –

3

Nous courons actuellement des tests django avec succès de Jenkins en utilisant django-jenkins: https://github.com/kmmbvnr/django-jenkins

FWIW aujourd'hui django apporte son soutien à Sélénium sous forme de LiveServerTestCase: https://docs.djangoproject.com/en/1.4/topics/testing/#django.test.LiveServerTestCase

LiveServerTestCase lance un serveur django qui permet aux clients comme Selenium pour s'y connecter.

En outre, vous pouvez maintenant utiliser PhantomJs comme un pilote Web pour les tests sans tête. Cela facilite l'intégration de CI.

+1

Avec LiveServerTestCase, vous n'avez pas besoin d'avoir un serveur en cours d'exécution en parallèle, et il utilisera la base de données de test (y compris en honorant la variable fixtures!). C'est définitivement la voie à suivre pour l'intégration continue.Le module staticfiles a également une sous-classe pour LiveServerTestCase pour gérer les fichiers statiques dans ce cas correctement. – Risadinha

+0

La mention @Risadinha de la sous-classe est 'StaticLiveServerTestCase': http://django.readthedocs.org/en/latest/ref/contrib/staticfiles.html#django.contrib.staticfiles.testing.StaticLiveServerTestCase – mynameistechno

0

Pour l'automatisation des tests de sélénium, j'utiliserais certainement une solution CI comme Jenkins. Vous pouvez configurer Jenkins pour extraire votre référentiel de code et déclencher les tests Selenium à partir de votre serveur. J'ai utilisé Pytest pour le faire de Jenkins.

Vous pouvez trouver un tutoriel étape par étape de configuration Jenkins avec Github et Sélénium ici: http://www.6020peaks.com/2015/12/how-to-build-a-test-automation-solution-for-your-web-projects/

Questions connexes