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

如何在单个Selenium WebDriver实例中执行多个unittest测试用例?

解决unittest中Selenium复用浏览器会话的问题

核心问题分析

  • setUp是实例方法,每个测试用例执行前都会调用,导致每次新建WebDriver实例,登录会话无法复用
  • test_MyDevices中直接使用未定义的browser变量,未通过self.browser引用类实例属性,引发报错

解决方案

1. 改用类级别的初始化方法

把WebDriver的初始化放到setUpClass(类方法,用@classmethod装饰),整个测试类只会初始化一次浏览器实例,所有测试用例共用同一个登录会话。

2. 修复变量引用错误

所有测试方法中必须通过self.browser访问浏览器实例,不能直接使用未定义的browser变量。

3. 适配手动验证码输入

在登录流程中添加终端输入提示,让你手动输入短信验证码,完成登录后后续测试直接复用已登录状态。

修正后的完整代码

import time
import unittest
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as ec

class LoginTest(unittest.TestCase):
    # 类级初始化,整个测试类仅执行一次
    @classmethod
    def setUpClass(cls):
        cls.browser = webdriver.Safari()
        cls.browser.maximize_window()

    # 类级清理,所有测试完成后执行一次
    @classmethod
    def tearDownClass(cls):
        cls.browser.quit()

    def test_LoginIn(self):
        browser = self.browser
        # 打开目标登录页面
        browser.get("你的登录页面URL")
        
        # 输入账号(示例,根据实际页面元素调整)
        username_input = WebDriverWait(browser, 10).until(
            ec.presence_of_element_located((By.ID, "username"))
        )
        username_input.send_keys("你的账号")
        
        # 输入密码
        password_input = browser.find_element(By.ID, "password")
        password_input.send_keys("你的密码")
        
        # 点击获取验证码按钮
        get_code_btn = browser.find_element(By.ID, "get-verification-code")
        get_code_btn.click()
        
        # 终端提示输入验证码
        verification_code = input("请输入短信验证码:")
        
        # 输入验证码并提交登录
        code_input = browser.find_element(By.ID, "verification-code")
        code_input.send_keys(verification_code)
        
        login_btn = browser.find_element(By.ID, "login-btn")
        login_btn.click()
        
        # 验证登录成功(等待首页加载)
        WebDriverWait(browser, 10).until(
            ec.title_contains("首页")
        )

    def test_MyDevices(self):
        browser = self.browser
        # 等待"我的设备"按钮可点击并操作(替换为实际XPATH)
        my_devices_btn = WebDriverWait(browser, 10).until(
            ec.element_to_be_clickable((By.XPATH, "Some XPATH"))
        )
        my_devices_btn.click()
        
        # 验证页面跳转(示例)
        WebDriverWait(browser, 10).until(
            ec.title_contains("我的设备")
        )

if __name__ == '__main__':
    # 强制指定测试顺序,确保登录用例先执行
    unittest.TestLoader.sortTestMethodsUsing = lambda _, x, y: -1 if x == 'test_LoginIn' else 1
    unittest.main()

关键说明

  • setUpClass和tearDownClass是类方法,通过cls访问类属性cls.browser,确保全局唯一的浏览器实例
  • 显式等待(WebDriverWait)替代强制等待,避免因页面加载延迟导致的元素定位失败
  • 自定义测试方法排序,保证登录用例优先执行,后续测试基于已登录状态运行

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 20:35:37