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
相关产品推荐
相关产品推荐

