前言

Page Object(PO)模式,是Selenium实战中最为流行,并且被自动化测试同学所熟悉和推崇的一种设计模式之一。在设计测试时,把页面元素定位和元素操作方法按照页面抽象出来,分离成一定的对象,然后再进行组织。

相信每个做自动化测试的同学,一定会遇到这样一个非常头疼的问题,那就是页面变化,如果没有使用Page Object设计模式,这就意味着以前的定位元素方法不能用了,需要重新修改元素定位方式。你需要一个一个从测试脚本中把需要修改的元素定位方式找出来,然后再进行修改。这势必会使脚本维护的成本变高,显然这样的自动化脚本就不会有人愿意使用。

那这时我们使用Page Object模式就可以解决这个问题了。

PageObject 的优点

  • 减少代码冗余
  • 业务和实现分离
  • 降低代码维护成本

Page Object模式

Page Object 见名知意,就是页面对象,并将页面元素定位方法和元素操作进行分离。

在实际自动化测试实战过程中,我们一般对脚本的实现分为三层:

  • 对象层:用于存放页面元素定位和控件操作。
  • 逻辑层:则是一些封装好的功能用例模块。
  • 业务层:则是我们真正的测试用例的操作部分。

使用 Page Object 类来分离页面元素

对象层

首先我们新建一个类login_page,登录页面内编写需要操作的元素定位方式和控件操作,具体代码示例如下:

# -*- coding: utf-8 -*-
"""
# @Time : 2022/11/26 22:16
# @Author : longrong.lang
# @FileName: login_page.py
# @Software: PyCharm
# @Blog :https://www.cnblogs.com/longronglang/
# @Motto:ABC(Always Be Coding)
"""
import time from selenium.webdriver.common.by import By class LoginPage:
"""
封装元素定位及控件
""" def __int__(self, driver):
self.driver = driver # 打开浏览器
def open(self, url):
self.driver.get(url) # 用户名元素定位
def user_name(self):
return self.driver.find_element(By.CSS_SELECTOR, "input[type='text']") # 密码元素定位
def pass_word(self):
return self.driver.find_element(By.CSS_SELECTOR, "input[type='password']") # 登录元素定位
def login_btn(self):
return self.driver.find_element(By.CSS_SELECTOR, "button[name='submit']") # 错误提示
def error_msg(self):
return self.driver.find_element(By.ID, "alert") # 输入用户名
def send_username(self, username):
self.user_name().clear()
self.user_name().send_keys(username) # 输入密码
def send_password(self, password):
self.pass_word().clear()
self.pass_word().send_keys(password) # 点击登录
def click_login(self):
self.login_btn().click() # 获取错误提示
def get_errorMsg(self):
time.sleep(1)
return self.error_msg().text # 退出浏览器
def quit(self):
self.driver.quit()

这里我只对用户名和密码输入框进行了封装,有兴趣的同学也可以接着进行全部元素操作封装。

操作层

我们再新建一个类login_action,用于登录逻辑的封装,供业务层调用,具体代码示例如下:

# -*- coding: utf-8 -*-
"""
# @Time : 2022/11/26 22:33
# @Author : longrong.lang
# @FileName: login_action.py
# @Software: PyCharm
# @Blog :https://www.cnblogs.com/longronglang/
# @Motto:ABC(Always Be Coding)
"""
import time from pageobject.login_page import LoginPage class LoginAction(LoginPage): def login(self, username, password, expected):
self.open("http://localhost:8080/login")
self.send_username(username)
self.send_password(password)
self.click_login()
time.sleep(1)
msg = self.get_errorMsg()
assert msg == expected
self.quit()

业务层

最后我们新建一个类test_login,用于业务层的封装,具体代码示例如下:

# -*- coding: utf-8 -*-
"""
# @Time : 2022/11/26 22:43
# @Author : longrong.lang
# @FileName: test_login.py
# @Software: PyCharm
# @Blog :https://www.cnblogs.com/longronglang/
# @Motto:ABC(Always Be Coding)
"""
from pageobject.login_action import LoginAction
from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager class TestLogin(LoginAction):
def test_login(self):
self.driver = webdriver.Chrome(ChromeDriverManager().install())
self.driver.maximize_window()
self.driver.implicitly_wait(5)
self.login("username", "pwd", "登录失败!")

小结

虽然该实现方法看上去复杂多了,但其中的设计好处是不同层关心不同的问题。页面对象只关心元素的定位,测试用例只关心测试数据。

login_page类中主要对登录页面上元素进行封装,使其成为具体的操作方法。如对用户名、密码框都封装成方法,然后定义login(self, username, password, expected)方法将单个元素操作组成一个完整的动作,包含输入用户名、密码并点击登录按钮等。

使用时将driver、username、pwd、expected作为函数的入参,这样的方法具有很强的可重用性。

最后使用test_login()方法进行用户操作行为,现在只关心用哪个浏览器、登录的用户名和密码是什么,至少输入框、按钮是如何定位的,则不关心。即实现了不同层关心不同问题。如果再有定位元素变化,只需login_page这个类维护即可,显然方便了很多。

Selenium4+Python3系列(十) - Page Object设计模式的更多相关文章

  1. Selenium(十九):unittest单元测试框架(五) Page Object设计模式

    1. Page Object设计模式 Page Object是Selenium自动化测试项目开发实践的最佳设计模式之一,它主要体现在对界面交互细节的封装,这样可以使测试方案更关注于业务而非界面细节.从 ...

  2. Page Object设计模式实践

    Page Object模式是使用Selenium的广大同行最为公认的一种设计模式.在设计测试时,把元素和方法按照页面抽象出来,分离成一定的对象,然后再进行组织. Page Object模式,创建一个对 ...

  3. selenium+Python(Page Object 设计模式实例)

    以下实例演示了采用了page Object设计模式的方式登录qq空间: 1.创建基础类page:在初始方法__init__()定义驱动的(driver),基本url(base_url)和超时时间(ti ...

  4. Page Object 设计模式介绍

    Page Object 是 Selenium 自动化测试项目开发实践的最佳设计模式之一,Page Object 的主要体现于对界面交互细节的封装,这样可以使测试案例更关注与业务而非界面细节,提高测试案 ...

  5. Python+selenium之Page Object设计模式

    Page Object是selenium自动化测试项目开发实践的最佳设计模式之一,他主要提现在对界面交互细节的封装,这样可以使测试案例隔你给加关注于业务而非界面细节,从而提高测试案例的可读性. Pag ...

  6. Selenium+java - Page Object设计模式

    前言 Page Object(页面对象)模式,是Selenium实战中最为流行,并且被自动化测试同学所熟悉和推崇的一种设计模式之一.在设计测试时,把页面元素定位和元素操作方法按照页面抽象出来,分离成一 ...

  7. web端自动化——selenium Page Object设计模式

    Page Object设计模式的优点如下: ①    减少代码的重复. ②    提高测试用例的可读性. ③    提高测试用例的可维护性,特别是针对UI频繁变化的项目. 当为Web页面编写测试时,需 ...

  8. Selenium 2自动化测试实战39(Page Object设计模式)

    Page Object设计模式 Page object是selenium自动化测试项目开发时间的最佳设计模式之一,主要体现在对界面交互细节的封装. 1.认识page object优点如下:1.减少代码 ...

  9. 18、Page Object 设计模式

    Page Object 设计模式的优点如下: 减少代码的重复. 提高测试用例的可读性. 提高测试用例的可维护性, 特别是针对 UI 频繁变化的项目. 当你针对网页编写测试时,你需要引用该网页中的元素, ...

  10. Page Object设计模式(一)

    一.简介 主要特点体现在“对界面交互细节的封装”上,使测试用例更专注于业务的操作,从而提高测试用例的可维护性.解决UI变动问题. page对象的一个基本原则经验法则是:凡是人能做的事,page对象通过 ...

随机推荐

  1. 从零打造“乞丐版” React(一)——从命令式编程到声明式编程

    这个系列的目的是通过使用 JS 实现"乞丐版"的 React,让读者了解 React 的基本工作原理,体会 React 带来的构建应用的优势 1 HTML 构建静态页面 使用 HT ...

  2. PostgreSQL逻辑复制解密

    在数字化时代的今天,我们都认同数据会创造价值.为了最大化数据的价值,我们不停的建立着数据迁移的管道,从同构到异构,从关系型到非关系型,从云下到云上,从数仓到数据湖,试图在各种场景挖掘数据的价值.而在这 ...

  3. 如何修改 Kubernetes 节点 IP 地址

    转载自:https://www.qikqiak.com/post/how-to-change-k8s-node-ip/ 昨天网络环境出了点问题,本地的虚拟机搭建的 Kubernetes 环境没有固定 ...

  4. 关闭You have new mail in /var/spool/mail/root提醒

    echo "unset MAILCHECK">> /etc/profile #以root权限执行 或者用sudo source /etc/profile cat /de ...

  5. JDK19新特性使用详解

    前提 JDK19于2022-09-20发布GA版本,本文将会详细介绍JDK19新特性的使用. 新特性列表 新特性列表如下: JPE-405:Record模式(预览功能) JPE-422:JDK移植到L ...

  6. 挑战海量数据:基于Apache DolphinScheduler对千亿级数据应用实践

    点亮 ️ Star · 照亮开源之路 GitHub:https://github.com/apache/dolphinscheduler 精彩回顾 近期,初灵科技的大数据开发工程师钟霈合在社区活动的线 ...

  7. 华为设备配置和使用FTP服务命令

    配置SFTP Server与Client server:aaa 进入aaa视图 local-user huawei2 password cipher huawei2 设置用户名和密码 local-us ...

  8. 构造器与this、package、import关键字的使用

    构造器一.构造器的作用: 1.创建对象 2.初始化对象的信息 二.说明: 1.如果没有显式的定义类的构造器的话,则系统默认提供一个空参的构造器 2.定义构造器的格式:权限修饰符 类名(形参列表){} ...

  9. day01-3-界面显示&用户登录&餐桌状态显示

    满汉楼01-3 4.功能实现02 4.2菜单界面显示 4.2.1功能说明 显示主菜单.二级菜单和退出系统功能 4.2.2代码实现 先搭建界面显示的大体框架,具体的功能后面再实现 创建MHLView类: ...

  10. FTP文本传输协议

    一.存储类型 存储类型分为三种: 直连式存储:Direct-Attached Storage,简称DAS 网络附加存储:Network-Attached Storage,简称NAS(存储和管理空间都在 ...