我正在用python编写一个程序,它将从Selenium测试中生成更强大的数据和报告。我希望能够从Firefox导出Selenium IDE中的测试用例,而无需修改特定的导出python文件,将其注入我的脚本并允许我的脚本进行修改,例如更改webdriver(实现的一部分用于Nagios服务器,它将使用PhantomJS作为驱动程序)并提取请求信息和屏幕截图进行报告(顺便说一句,我知道我可以在IDE模板中更改驱动程序,但这只是一个例子)。
假设我有一个从IDE 路径/导出到/ 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()
我希望我的脚本能够执行此操作:
python -m my_wrapper mytests.search --url 'http://www.google.com'
以某种方式导入 search.py ,从中创建一个新的测试用例,并允许我覆盖setUp / tearDown方法(将驱动程序更改为PhantomJS,从sys修改基本URL)。 argv),并允许捕获错误并写入与失败的测试可能已停止的位置相关的信息(因为有两个不同的URL调用,该页面的屏幕截图将导出到驱动程序当前所在的位置)。
我在想像 my_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
无论如何,对此有任何帮助将不胜感激。我真的希望尽可能简单地使用尽可能简单的代码来保持这些代码。
注意:除了selenium和PhantomJS之外,出于多种策略原因,我也担心使用非标准库等其他依赖项。 ...
答案 0 :(得分:1)
嗨,我的朋友,我已经搜索了几天这样的事情。我在stackoverflow中找到了这个问题
Python unittest passing arguments
所以你的代码应该是这样的:
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()
我希望这就是你要找的东西。
执行你应该这样做:
python mySearchTest.py "http://example.com"