如何在单个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
相关产品推荐
相关产品推荐

