3 votes

Importer le script de Selenium IDE comme unittest.TestCase et le modifier dynamiquement

Je suis en train d'écrire un programme en python qui va générer des données et des rapports plus robustes à partir des tests Selenium. Je veux être en mesure d'exporter un cas de test de Selenium IDE à partir de Firefox, et sans modifier ce fichier python exporté spécifique, l'injecter dans mon script et permettre à mon script d'effectuer des modifications telles que le changement de webdriver (une partie de la mise en œuvre est pour un serveur Nagios, qui utilisera PhantomJS comme pilote) et extraire des informations sur les demandes et des captures d'écran pour la création de rapports (je sais que je peux changer le pilote dans le modèle IDE, mais c'est juste un exemple).

Disons que j'ai un fichier exporté de l'IDE chemin/vers/mytests/search.py :

import...

class Search(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.base_url = 'http://www.example.com'

    def test_search(self):
        driver = self.driver
        driver.get(self.base_url)
        elem = self.driver.find_element_by_name('q')
        elem.send_keys('nagios')
        elem.send_keys(Keys.RETURN)
        assert 'No results found.' not in self.driver.page_source
        driver.get(self.base_url + '/status')
        assert 'OK' in self.driver.page_source

    def tearDown(self):
        self.driver.quit()

Je veux que mon script soit capable de faire ça :

python -m my_wrapper mytests.search --url 'http://www.google.com'

qui importera en quelque sorte search.py Il me permet de modifier les méthodes setUp/tearDown (en remplaçant le pilote par PhantomJS, en modifiant l'URL de base à partir de sys.argv), de détecter les erreurs et d'écrire les informations relatives à l'endroit où le test a échoué (puisqu'il y a deux appels d'URL différents, une capture d'écran de cette page sera exportée, quel que soit l'endroit où se trouve le pilote).

Je pense à quelque chose comme mon_wrapper.__main__ :

# get 'mytests.search' from argparse
dirname, module = os.path.split('mytests.search'.replace('.', '/'))
suite = unittest.TestLoader().discover(dirname, pattern='%s.py' % module)

# Modify testcases here <-- THIS IS THE HARD PART
#
# Is there a way to inject the tests into another testCase class?
#
# class BaseClass(unittest.TestCase):
#    def setUp(self):
#        self.driver = webdriver.PhantomJS()
#        ...
#
#    def runTest(self): pass
#
#    def tearDown(self): ...
#
# then...
new_suite = unittest.TestSuite()
for sub_suite in master_suite:  #<-- iterating over the above suite here
    for tests in sub_suite._tests:  #<-- why do you have to do this twice?
        for test_name in tests._tests:
            # This doesn't work but show's my thought process
            mytest = BaseClass(methodName=test_name)
            setattr(mytest, test_func, getattr(tests, test_name))
            new_suite.addTest(mytest)

try:
    result = unittest.TextTestRunner(verbosity=2).run(new_suite)
except (SOME_SELENIUM_ERROR):
    # get the screenshot, save to file <-- don't know how to do this either

Quoi qu'il en soit, toute aide dans ce domaine serait appréciée. J'aimerais vraiment garder ce code aussi simple que possible en utilisant autant que possible ce qui est disponible.

Remarque : outre Selenium et PhantomJS, je me méfie également de l'utilisation d'autres dépendances telles que les bibliothèques non standard, etc. pour un certain nombre de raisons stratégiques. ...

1voto

user2948547 Points 1

Bonjour mon ami, je suis à la recherche de quelque chose comme ça depuis quelques jours. J'ai trouvé cette question dans stackoverflow

Python unittest passant des arguments

donc votre code devrait être comme ceci :

import sys
import unittest

class Search(unittest.TestCase):
    URL = ""
    def setUp(self):
        self.driver = webdriver.Firefox()
        self.base_url = 'http://www.example.com'

    def test_search(self):
        driver = self.driver
        driver.get(self.base_url)
        elem = self.driver.find_element_by_name('q')
        elem.send_keys('nagios')
        elem.send_keys(Keys.RETURN)
        assert 'No results found.' not in self.driver.page_source
        driver.get(self.base_url + '/status')
        assert 'OK' in self.driver.page_source

    def tearDown(self):
        self.driver.quit()
if __name__ == "__main__":
    Search.URL=sys.argv.pop()
    unittest.main()

J'espère que c'est ce que vous recherchiez.

pour exécuter ce que vous devez faire :

python mySearchTest.py "http://example.com"

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X