Python Selenium:跨文件复用登录类实现同浏览器测试求助
嘿,作为刚接触Python和Selenium的新手,你想实现登录模块复用、同一浏览器跑测试的需求其实很常见,我给你两种实用的实现方式,从基础到进阶都有,你可以根据自己的场景选:
方法1:手动传递浏览器实例(适合简单脚本)
核心思路是让登录模块创建的浏览器实例,通过方法暴露给测试用例模块,避免重复启动浏览器。
1. 重构你的登录模块(mylogin.py)
让Login类初始化时创建浏览器实例,同时提供方法返回这个实例,方便其他模块调用:
# mylogin.py 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 Login: def __init__(self): # 初始化浏览器实例(这里用Chrome,可替换为Firefox等) self.driver = webdriver.Chrome() self.driver.maximize_window() self.login_url = "https://your-actual-login-url.com" # 替换成你的登录地址 def perform_login(self, username, password): self.driver.get(self.login_url) # 定位用户名/密码输入框(替换成你网站实际的元素定位器) WebDriverWait(self.driver, 10).until( EC.presence_of_element_located((By.ID, "username")) ).send_keys(username) self.driver.find_element(By.ID, "password").send_keys(password) self.driver.find_element(By.ID, "login-submit-btn").click() # 等待登录完成(比如等待首页元素出现) WebDriverWait(self.driver, 10).until( EC.title_contains("首页") ) def get_driver(self): # 返回已登录的浏览器实例 return self.driver def close_browser(self): # 测试结束后关闭浏览器 self.driver.quit()
2. 在测试用例模块(myorder.py)中复用浏览器
创建Login实例完成登录后,获取它的浏览器实例,传入测试类执行后续操作:
# myorder.py from mylogin import Login from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC class OrderOperations: def __init__(self, driver): self.driver = driver self.order_page_url = "https://your-actual-order-page.com" # 替换成订单页面地址 def create_new_order(self): self.driver.get(self.order_page_url) # 执行创建订单的操作(替换成实际元素定位) WebDriverWait(self.driver, 10).until( EC.presence_of_element_located((By.ID, "select-product")) ).click() self.driver.find_element(By.ID, "confirm-order-btn").click() # 验证订单创建成功 assert "订单创建成功" in self.driver.page_source # 执行完整测试流程 if __name__ == "__main__": # 初始化登录模块并完成登录 login_module = Login() login_module.perform_login("your-test-username", "your-test-password") # 获取已登录的浏览器实例 logged_in_driver = login_module.get_driver() # 初始化订单测试类,传入同一个浏览器实例 order_test = OrderOperations(logged_in_driver) order_test.create_new_order() # 测试完成后关闭浏览器 login_module.close_browser()
方法2:用pytest Fixture复用(推荐用于自动化测试)
如果你的测试用例较多,用pytest的fixture可以更优雅地管理前置/后置操作,实现一次登录、多个测试用例复用同一浏览器。
1. 新建conftest.py(pytest的配置文件)
这里定义一个模块级别的fixture,负责创建登录后的浏览器实例:
# conftest.py import pytest from mylogin import Login @pytest.fixture(scope="module") def logged_in_driver(): # 前置操作:初始化登录并完成登录 login_module = Login() login_module.perform_login("your-test-username", "your-test-password") driver = login_module.get_driver() yield driver # 将浏览器实例传递给测试用例 # 后置操作:测试完成后关闭浏览器 login_module.close_browser()
2. 编写测试用例(myorder.py)
直接在测试函数中接收logged_in_driver参数,复用已登录的浏览器:
# myorder.py from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC def test_create_order(logged_in_driver): driver = logged_in_driver driver.get("https://your-actual-order-page.com") # 执行创建订单操作 WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "select-product")) ).click() driver.find_element(By.ID, "confirm-order-btn").click() assert "订单创建成功" in driver.page_source def test_view_order_list(logged_in_driver): driver = logged_in_driver driver.get("https://your-actual-order-list-page.com") # 验证订单列表是否加载成功 assert WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "order-list")) ).is_displayed()
新手小贴士
- 记得替换代码中的元素定位器(ID、XPath等)为你测试网站的实际元素
- 确保安装了对应版本的浏览器驱动(比如ChromeDriver要和Chrome版本匹配)
- 如果用pytest,先通过
pip install pytest安装
内容的提问来源于stack exchange,提问作者Nisheeth
相关产品推荐
相关产品推荐

