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. ...