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

重构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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 00:54:12