将Selenium IDE脚本导入为unittest.TestCase并动态修改

时间:2016-08-31 19:22:00

标签: python unit-testing selenium phantomjs

我正在用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之外,出于多种策略原因,我也担心使用非标准库等其他依赖项。     ...

1 个答案:

答案 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"