写点什么

Page Object 设计模式:实现 Selenium 测试用例的良好分层

  • 2024-11-26
    北京
  • 本文字数:2312 字

    阅读完需:约 8 分钟

全面解析软件测试开发:人工智能测试、自动化测试、性能测试、测试左移、测试右移到DevOps如何驱动持续交付 

在自动化测试中,代码可读性、复用性和维护性至关重要。随着测试脚本数量的增加,直接将元素定位和操作逻辑写入测试用例会导致代码耦合度高、复用性差,进而增加维护成本。为了解决这些问题,Page Object 设计模式应运而生。

本文将介绍 Page Object 设计模式的基本概念、核心思想和实现方法,并结合实例说明如何实现测试用例的良好分层。


一、Page Object 设计模式的核心理念

Page Object 模式是一种基于页面或组件进行对象化管理的设计模式。其核心理念是将页面的元素定位与操作行为抽象为类,使测试用例与页面细节解耦。

1. 核心思想

  • 页面对象化:每个页面或页面的部分功能对应一个类。

  • 职责分离:页面操作逻辑封装在页面对象中,测试用例只关注测试逻辑。

  • 高复用性:页面对象可以在多个测试用例中复用。

2. Page Object 的组成

  • 页面元素:页面上的控件,如输入框、按钮、下拉菜单等。

  • 操作方法:对页面元素执行的操作,如点击、输入、获取文本等。


二、Page Object 设计模式的优点

  1. 增强可维护性


    页面对象集中管理,当页面布局或元素定位发生变化时,只需修改对应的页面对象类,无需修改所有测试用例。

  2. 提升复用性


    多个测试用例可以复用相同的页面对象类,避免代码重复。

  3. 提高可读性


    测试用例更加专注于业务逻辑,易于理解和扩展。

  4. 支持良好的分层设计


    测试代码分为页面对象层和测试用例层,各司其职,职责清晰。


三、Page Object 模式的分层设计

在实现 Page Object 模式时,通常将项目代码划分为以下层次:

1. 页面对象层(Page Layer)

封装页面元素定位和操作行为。

2. 测试用例层(Test Layer)

定义具体的测试场景,调用页面对象提供的方法完成测试。

3. 工具层(Utils Layer)

提供公共方法或工具类,例如日志记录、截图功能、等待机制等。

4. 配置层(Config Layer)

管理项目的配置文件,如测试环境 URL、浏览器选项等。


四、Page Object 模式的实现步骤

1. 初始化项目结构

project/├── pages/                # 页面对象层│   ├── login_page.py     # 登录页面对象│   ├── home_page.py      # 首页对象├── tests/                # 测试用例层│   ├── test_login.py     # 测试登录功能├── utils/                # 工具层│   ├── browser_helper.py # 浏览器辅助方法├── config/               # 配置层│   ├── config.yaml       # 配置文件
复制代码
  1. 页面对象的实现以登录页面为例,定义 LoginPage 类:


from selenium.webdriver.common.by import By


class LoginPage:def init(self, driver):self.driver = driverself.username_input = (By.ID, "username")self.password_input = (By.ID, "password")self.login_button = (By.ID, "loginButton")


def enter_username(self, username):    self.driver.find_element(*self.username_input).send_keys(username)
def enter_password(self, password): self.driver.find_element(*self.password_input).send_keys(password)
def click_login(self): self.driver.find_element(*self.login_button).click()
复制代码


  1. 测试用例的实现在测试用例层调用页面对象方法:


import pytestfrom selenium import webdriverfrom pages.login_page import LoginPage


@pytest.fixturedef driver():driver = webdriver.Chrome()driver.implicitly_wait(10)yield driverdriver.quit()


def test_valid_login(driver):# 打开登录页面 driver.get("https://example.com/login")


# 实例化 LoginPage 对象login_page = LoginPage(driver)
# 执行登录操作login_page.enter_username("testuser")login_page.enter_password("password123")login_page.click_login()
# 断言验证登录结果assert "Dashboard" in driver.title
复制代码

五、扩展:支持多页面的复杂场景在实际项目中,测试场景往往涉及多个页面的交互。以下是一个从登录到首页操作的示例:


  1. 首页对象的实现 from selenium.webdriver.common.by import By


class HomePage:def init(self, driver):self.driver = driverself.profile_button = (By.ID, "profileButton")


def click_profile(self):    self.driver.find_element(*self.profile_button).click()
复制代码


  1. 跨页面的测试用例 from pages.login_page import LoginPagefrom pages.home_page import HomePage


def test_navigate_to_profile(driver):# 登录页面操作 login_page = LoginPage(driver)driver.get("https://example.com/login")login_page.enter_username("testuser")login_page.enter_password("password123")login_page.click_login()


# 首页操作home_page = HomePage(driver)home_page.click_profile()
# 断言验证是否进入个人资料页assert "Profile" in driver.title
复制代码


六、Page Object 模式的最佳实践遵循单一职责原则每个页面对象只封装该页面的元素和操作,避免跨页面逻辑。统一元素定位方式使用类变量统一管理定位符,方便维护和调整。适当封装公共操作将常见操作提取到基类中,如等待元素可见、执行点击等。保持测试用例的独立性测试用例应尽量独立运行,避免前置依赖造成的执行顺序问题。结合日志与截图功能在页面对象的操作方法中添加日志或失败截图,方便调试与分析。七、总结 Page Object 设计模式通过将页面元素和操作行为封装为独立的类,有效提升了测试代码的可读性、复用性和可维护性。在 Selenium 自动化测试中,合理应用 Page Object 模式能够实现清晰的分层结构,简化复杂测试场景的实现,并降低代码维护成本。


希望本文能为您理解和实践 Page Object 模式提供有价值的指导!



用户头像

社区:ceshiren.com 微信:ceshiren2023 2022-08-29 加入

微信公众号:霍格沃兹测试开发 提供性能测试、自动化测试、测试开发等资料、实事更新一线互联网大厂测试岗位内推需求,共享测试行业动态及资讯,更可零距离接触众多业内大佬

评论

发布
暂无评论
Page Object 设计模式:实现 Selenium 测试用例的良好分层_测试_测吧(北京)科技有限公司_InfoQ写作社区