重构Pytest页面对象模型后出现多浏览器启动及测试失败问题
问题分析:测试用例执行时启动两个浏览器的原因及修复方案
问题背景
你有三个测试相关文件:
utlis.py:页面操作的基础PO类login_page_po.py:登录页的PO文件test_login.py:测试用例文件
最初的测试可以正常执行,仅启动一个浏览器运行两个测试用例。但在重构代码,将登录逻辑迁移到login_page_po.py的Login类后,测试开始失败——执行时会启动两个浏览器,第一个无操作,测试用例在第二个浏览器中运行。
核心问题
你重复创建了DriverUtil实例:
- 在
TestLogin的setup_class方法中,你初始化了一个self.driver = DriverUtil(),这会启动第一个浏览器 - 同时在
Login类的__init__方法中,又初始化了self.driver = DriverUtil(),这会启动第二个浏览器
两个独立的浏览器实例导致了测试行为异常。
修复方案
正确的PO设计应该是复用同一个浏览器驱动实例,而不是在PO类中重新创建。具体修改如下:
1. 修改login_page_po.py
让Login类的构造函数接收外部传入的driver实例,不再自行创建:
from utlis import DriverUtil elementsMap = { 'usernameInputField': 'input[name="username"]', 'passwordInputField': 'input[name="password"]', 'login_button': 'input[value="login"]', 'error_message': 'div >p' } class Login: # 接收外部传入的driver def __init__(self, driver): self.driver = driver # 页面跳转逻辑交给测试用例的setup处理 def login_method(self, username, password): self.driver.input_text(elementsMap['usernameInputField'], username) self.driver.input_text(elementsMap['passwordInputField'], password) self.driver.click_element(elementsMap['login_button'])
2. 修改test_login.py
在初始化Login实例时,将已创建的driver传递进去,避免重复创建:
from utlis import DriverUtil from login_page_po import Login class TestLogin: def setup_class(self): self.driver = DriverUtil() # 复用同一个driver实例传给Login类 self.login = Login(self.driver) self.driver.openurl('https://www.stealmylogin.com/demo.html') def teardown_class(self): self.driver.quit_driver() def setup(self): self.driver.openurl('https://www.stealmylogin.com/demo.html') def test_wrong_username(self): self.login.login_method('wrongadmin', 'admin') def test_wrong_password(self): self.login.login_method('admin', 'wrongpassword')
额外优化(可选)
你可以把setup方法中的重复打开URL逻辑,封装到Login类中,进一步减少冗余:
# 在Login类中添加页面跳转方法 def navigate(self): self.driver.openurl('https://www.stealmylogin.com/demo.html') # 然后在TestLogin的setup中调用 def setup(self): self.login.navigate()
内容的提问来源于stack exchange,提问作者Jeff
相关产品推荐
相关产品推荐

