如何在Selenium Python的另一个测试用例中复用Driver对象(不重复开浏览器)
解决unittest框架下Selenium Driver复用问题(避免重复打开浏览器)
嘿,我碰到过一模一样的问题!你遇到的NameError是因为file1.py里的driver是test_login方法的局部变量,作用域只限于那个方法内部,file2.py的test_Search根本访问不到它。要实现Driver复用且不重复打开浏览器,我们可以借助unittest的类级别的 setUp/tearDown 方法,配合基类继承来实现。
下面是具体的解决方案:
步骤1:创建一个基础测试基类
首先创建一个BaseTest.py文件,把Driver的初始化和销毁逻辑放在这里,作为所有测试类的父类:
import unittest from selenium import webdriver class BaseTest(unittest.TestCase): @classmethod def setUpClass(cls): # 类级别的初始化:整个测试类只会执行一次,不会重复打开浏览器 cls.driver = webdriver.Chrome() cls.driver.implicitly_wait(10) # 隐式等待,避免元素加载问题 cls.driver.maximize_window() @classmethod def tearDownClass(cls): # 所有测试方法执行完毕后,关闭浏览器 cls.driver.quit()
步骤2:修改LoginTest类(继承基类)
更新file1.py的LoginTest,让它继承BaseTest,直接使用基类初始化好的self.driver:
import unittest from BaseTest import BaseTest # 确保BaseTest在同一个目录下 class LoginTest(BaseTest): def test_login(self): # 直接使用继承来的self.driver,无需重新初始化 self.driver.get("https://你的登录页面URL") # 执行登录操作(示例代码,替换成你实际的元素定位) self.driver.find_element("id", "username").send_keys("你的用户名") self.driver.find_element("id", "password").send_keys("你的密码") self.driver.find_element("id", "login-btn").click() # 可选:添加断言验证登录成功 self.assertEqual(self.driver.title, "登录后的预期页面标题")
步骤3:修改SearchList类(同样继承基类)
更新file2.py的SearchList,同样继承BaseTest,复用已经处于登录状态的Driver:
import unittest from BaseTest import BaseTest class SearchList(BaseTest): def test_Search(self): # 复用基类的self.driver,此时浏览器已经是登录状态 self.driver.get("https://你的搜索页面URL") # 执行搜索操作(示例代码,替换成你实际的元素定位) self.driver.find_element("id", "search-box").send_keys("搜索关键词") self.driver.find_element("id", "search-btn").click() # 可选:添加断言验证搜索结果 search_results = self.driver.find_elements("css selector", ".search-result-item") self.assertGreater(len(search_results), 0, "未找到搜索结果")
步骤4:按顺序运行测试(重要!)
因为test_Search依赖test_login的登录状态,所以需要指定测试运行顺序。创建一个run_tests.py文件,用测试套件来控制执行顺序:
import unittest from file1 import LoginTest from file2 import SearchList if __name__ == "__main__": # 创建测试套件,先执行登录测试,再执行搜索测试 test_suite = unittest.TestSuite() test_suite.addTest(LoginTest("test_login")) test_suite.addTest(SearchList("test_Search")) # 运行测试 runner = unittest.TextTestRunner(verbosity=2) runner.run(test_suite)
关键知识点解释
setUpClassvssetUp:setUp是每个测试方法执行前都会运行一次,而setUpClass是整个测试类只运行一次,正好符合我们只初始化一次Driver的需求。- 类属性共享:
cls.driver是基类的类属性,所有继承它的子类都能通过self.driver访问到同一个Driver实例,实现复用。 - 避免作用域问题:原来的局部变量
driver无法跨方法/跨类访问,提升为类属性后就解决了这个问题。
内容的提问来源于stack exchange,提问作者Taha
相关产品推荐
相关产品推荐

