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

Selenium Python中如何实现AfterClass方法并添加driver.quit()

解决方案

首先你的代码存在一个问题:helper_actions.py和helper_assertions.py各自初始化了一个Chrome Driver实例,这会导致运行测试时打开两个独立的浏览器窗口,完全没必要。我们需要先统一Driver实例,再实现类级别的清理逻辑(对应Java的AfterClass)。

步骤1:统一Driver实例并实现类级别的初始化/清理

修改test_login.py,将Driver作为测试类的类属性,用setUpClass初始化,tearDownClass执行退出操作:

import unittest
from selenium import webdriver
from selenium.webdriver.chrome.service import Service as ChromeService
from webdriver_manager.chrome import ChromeDriverManager
from helper_actions import load_page, type_username, type_password, click_login_button
from helper_assertions import get_welcome_text, read_error_message

class LoginTests(unittest.TestCase):
    # 类级别的driver,所有测试方法共享
    driver = None

    @classmethod
    def setUpClass(cls):
        # 所有测试开始前只执行一次,初始化driver
        cls.driver = webdriver.Chrome(service=ChromeService(ChromeDriverManager().install()))
        print("Run once before all test methods")

    def setUp(self):
        super().setUp()
        print("Run before each method")
        # 将driver传给load_page函数
        load_page(self.driver)

    def test_valid_username_and_password(self):
        print("test_valid_username_and_invalid_password")
        type_username(self.driver, "admin")
        type_password(self.driver, "Ptl@#321")
        click_login_button(self.driver)
        assert get_welcome_text(self.driver) == "Welcome Admin"

    def test_valid_username_and_invalid_password(self):
        print("test_valid_username_and_invalid_password")
        type_username(self.driver, "admin")
        type_password(self.driver, "admin")
        click_login_button(self.driver)
        assert read_error_message(self.driver) == "Invalid credentials"

    def tearDown(self):
        print("Run after each method")
        super().tearDown()

    @classmethod
    def tearDownClass(cls):
        # 所有测试结束后只执行一次,退出driver
        print("Run once after all test methods")
        cls.driver.quit()

if __name__ == "__main__":
    unittest.main()

步骤2:修改helper模块,让函数接收Driver参数

修改helper_actions.py,移除自身的Driver初始化,每个函数都接收driver参数:

from selenium.webdriver.common.by import By

def load_page(driver):
    driver.get("http://hrm.pragmatictestlabs.com/")

def type_username(driver, username):
    driver.find_element(By.ID, "txtUsername").send_keys(username)

def type_password(driver, password):
    driver.find_element(By.ID, "txtPassword").send_keys(password)

def click_login_button(driver):
    driver.find_element(By.ID, "btnLogin").click()

修改helper_assertions.py,同样移除自身的Driver初始化,函数接收driver参数:

from selenium.webdriver.common.by import By

def get_welcome_text(driver):
    return driver.find_element(By.ID, "welcome").text

def read_error_message(driver):
    return driver.find_element(By.ID, "spanMessage").text

说明

  • @classmethod修饰的setUpClass:在整个测试类的所有测试方法执行前仅执行一次,用来初始化Driver。
  • @classmethod修饰的tearDownClass:在整个测试类的所有测试方法执行完成后仅执行一次,对应你要的AfterClass效果,这里执行driver.quit()关闭浏览器。
  • 所有helper函数现在都接收同一个driver实例,避免了多浏览器窗口的问题,也保证了操作的是同一个会话。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 19:45:51