You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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)

关键知识点解释

  1. setUpClass vs setUp:setUp是每个测试方法执行前都会运行一次,而setUpClass是整个测试类只运行一次,正好符合我们只初始化一次Driver的需求。
  2. 类属性共享:cls.driver是基类的类属性,所有继承它的子类都能通过self.driver访问到同一个Driver实例,实现复用。
  3. 避免作用域问题:原来的局部变量driver无法跨方法/跨类访问,提升为类属性后就解决了这个问题。

内容的提问来源于stack exchange,提问作者Taha

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 23:52:44