如何在我的测试类中共享一个webdriver实例?我使用Selenium2和Python

6 投票
1 回答
4606 浏览
提问于 2025-04-17 07:31

我的代码是这样的:

class class1(unittest.TestCase):
    def setUp(self):
        self.driver = webdriver.Firefox()

    def testListRolesTitle(self):
        driver=self.driver
        driver.get("www.google.com")

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)
        asert...


class class2(unittest.TestCase):

    def setUp(self):
        self.driver = webdriver.Firefox()

    def testListRolesTitle(self):
        driver=self.driver
        driver.get("www.google.com")
        assert...

    def tearDown(self):
        self.driver.quit()
        self.assertEqual([], self.verificationErrors)

def suite():
    s1 = unittest.TestLoader().loadTestsFromTestCase(class1)
    s2 = unittest.TestLoader().loadTestsFromTestCase(class2)

    return unittest.TestSuite([s1,s2])

if __name__ == "__main__":

    run(suite())

当我运行测试时,这两个测试类在设置方法中都启动了一个新的Firefox浏览器实例。我的问题是,是否可以让这两个测试类使用同一个Firefox实例?我不想把它们放在一个类里。

有什么想法吗?

1 个回答

3

你可以设置一个适用于整个模块的初始化函数,而不仅仅是针对某个类,具体可以参考这里的说明。

在你的情况下,可以这样做:

def setUpModule():
    DRIVER = webdriver.Firefox()

def tearDownModule():
    DRIVER.quit()

需要注意的是,这里的DRIVER是一个全局变量,这样它就可以被所有类的对象使用。

另外,要注意测试用例的顺序可能会导致你的模块初始化函数被多次调用,具体情况可以参考文档中的说明:

unittest测试加载器的默认测试顺序是将来自同一模块和类的所有测试分组在一起。这会导致setUpClass / setUpModule(等等)每个类和模块只被调用一次。如果你随机化测试顺序,使得来自不同模块和类的测试相邻,那么这些共享的初始化函数可能会在一次测试运行中被多次调用。

我认为这个例子可以清楚地说明每个初始化方法/函数何时被执行:

import unittest

def setUpModule():
    print 'Module setup...'

def tearDownModule():
    print 'Module teardown...'

class Test(unittest.TestCase):
    def setUp(self):
        print 'Class setup...'

    def tearDown(self):
        print 'Class teardown...'

    def test_one(self):
        print 'One'

    def test_two(self):
        print 'Two'

这个的输出结果是:

$ python -m unittest my_test.py

Module setup...
Class setup...
One
Class teardown...
.Class setup...
Two
Class teardown...
.Module teardown...

----------------------------------------------------------------------
Ran 2 tests in 0.000s

OK

撰写回答