08 web 自动化之 PO 设计模式详解

文章目录

一、什么是 POM

POM page object model 页面对象模型 WEB 自动化测试框架应用最为广泛的一种框架设计模式
设计思路: web 项目由很多页面组成,把每个页面当做页面对象来进行设计
Python 专题: 什么是对象?通过类描述一组对象 对象=属性+方法

某电商项目 = n 个 页面

登录页面=对每个页面设计对应页面类=相同属性+相同的方法

class LoginPage:

#属性?元素、页面标题...

#方法?你在页面进行操作/行为:点击、定位、输入...等等元素及页面的操作

每个页面有相同的属性及方法 比如:点击、输入、元素定位
基于 POM 进行设计分为四层进行架构:

  • 第一层 basepage 层 每个页面有相同的属性及方法 比如:点击、输入、元素定位
  • 第二层 pageobjects 层 针对每个页面定义页面类 每个页面有独有的属性及方法
    登录页面 LoginPage 类
    注册页面 RegisterPage 类
  • 第三层 TestCases 层 用例层包含项目的业务流程
  • 第四层 TestData 测试数据

二、如何基于 POM 进行自动化框架架构?

1、base 层封装
复制代码
from selenium import webdriver
import time

class BasePage:
    """
    BasePage:定义每个页面的相同属性及方法
    相同属性?获取浏览器驱动对象(数据)
    相同方法?元素定位、点击、输入...等等操作
    """
    def __init__(self,driver=webdriver.Edge()):
        self.driver = driver
    def locator(self,loc):
        """元素定位"""
        # 参数loc,里面包含两个参数
        # loc = (By.LINK_TEXT,'登录')
        # *loc,是把外面括号去掉,变成2个参数
        return self.driver.find_element(*loc) # WebElement 对象
    def input(self,loc,value):
        """输入"""
        self.locator(loc).send_keys(value)
    def click(self,loc):
        """点击"""
        self.locator(loc).click()
    def sleep(self,s):
        time.sleep(s)
2、pageobjects 层封装
复制代码
from TestPOM.base.basepage import BasePage
from selenium.webdriver.common.by import By
class LoginPage(BasePage):
    """
    登录页面类=页面独有的属性及方法
    页面独有的属性:页面元素定位
    方法:登录页面的操作
    """
    # 登录页面的属性
    el_login = (By.XPATH, '//button[text()="登录"]')
    el_username = (By.NAME, "accounts")
    el_password = (By.XPATH, '//input[@type="password"]')
    url = "http://116.62.63.211/shop/user/logininfo.html"

    # 方法
    def login(self, username, password):
        # 实现登录步骤
        self.driver.get(self.url)
        self.sleep(1)
        # 输入用户名
        self.input(loc=self.el_username, value=username)
        # 输入密码
        self.input(loc=self.el_password, value=password)
        # 点击登录
        self.click(loc=self.el_login)
        self.sleep(1)
3、TestCases 层封装
复制代码
import unittest
from TestPOM.pageobjects.webpage import LoginPage

class TestLogin(unittest.TestCase):
    def test_login(self):
        # 实例化对象
        loginPage = LoginPage()
        username = "hc_test"
        password = "hctest123"
        loginPage.login(username=username, password=password)

三、元素和方法分离&数据分离

1、哪些部分可以进行分离
  • 1、页面对象类-元素定位+方法再一次进行分离:元素定位层+业务流程层,更利于团队分工合作
  • 2、项目数据分离
    • a、项目的全局配置数据进行分离:项目地址/根地址、页面地址、数据库账号及地址、测试报告路径、数据路径
    • b、业务流程中的数据进行分离
2、示例代码

a、Global_Datas.py 项目的全局配置数据

复制代码
# 根路径
base_url = "http://116.62.63.211/shop"
# 登录路径
login_url = base_url + "/user/logininfo.html"

b、login_datas.py 登录业务流程中的数据

复制代码
success = ("hc_test","hctest123")
fail = ("hc_test","hctest123456")

c、login_page_loc.py 登录页面的定位元素:

复制代码
from selenium.webdriver.common.by import By

"""
登录页面类=页面独有的属性及方法
页面独有的属性:页面元素定位
方法:登录页面的操作
"""
class LoginPageLoc:
    el_login = (By.XPATH, '//button[text()="登录"]')
    el_username = (By.NAME, "accounts")
    el_password = (By.XPATH, '//input[@type="password"]')

d、login_page.py 登录页面的操作方法

复制代码
from TestPOM.base.basepage import BasePage
from TestPOM.pagelocators.login_page_loc import LoginPageLoc as Locs
from TestPOM.testdatas import Global_Datas as GDatas

from selenium.webdriver.common.by import By
class LoginPage(BasePage):
    # 方法
    def login(self, username, password):
        # 实现登录步骤
        self.driver.get(GDatas.login_url)
        self.sleep(1)
        # 输入用户名
        self.input(loc=Locs.el_username, value=username)
        # 输入密码
        self.input(loc=Locs.el_password, value=password)
        # 点击登录
        self.click(loc=Locs.el_login)
        self.sleep(1)

e、testcase_login.py 登录页面的用例

复制代码
import unittest
from TestPOM.pageobjects.login_page import LoginPage
from TestPOM.testdatas import login_datas as ld

class TestLogin(unittest.TestCase):
    def test_login(self):
        # 实例化对象
        loginPage = LoginPage()
        loginPage.login(username=ld.success[0], password=ld.success[1])

四、总结

pom : 把每个页面或每个模块当做一个对象来进行编程 实现某个业务流程的测试=调用页面对象的一些属性及方法实现测试
数据驱动: 用外部数据驱动测试
关键字驱动: 所有业务流程封装成对应的函数 实现某个业务流程的测试=调用多个关键字

方法,实现业务流程的测试

相关推荐
代码搬运媛1 小时前
Jest 测试框架详解与实现指南
前端
LT10157974441 小时前
2026年国产兼容RPA选型指南:国产系统与软件全适配
自动化·rpa
counterxing2 小时前
我把 Codex 里的 Skills 做成了一个 MCP,还支持分享
前端·agent·ai编程
wangqiaowq2 小时前
windows下nginx的安装
linux·服务器·前端
qingfeng154152 小时前
企业微信机器人开发:如何实现自动化与智能运营?
人工智能·python·机器人·自动化·企业微信
pengyi8710152 小时前
独享IP池自动化维护方案,智能检测自动延长使用寿命
网络协议·tcp/ip·自动化
之歆2 小时前
DAY_12JavaScript DOM 完全指南(二):实战与性能篇
开发语言·前端·javascript·ecmascript
发现一只大呆瓜2 小时前
Vite凭什么这么快?3分钟带你彻底搞懂 Vite 热更新的幕后黑手
前端·面试·vite
Maimai108083 小时前
React如何用 @microsoft/fetch-event-source 落地 SSE:比原生 EventSource 更灵活的实时推送方案
前端·javascript·react.js·microsoft·前端框架·reactjs·webassembly
Agent手记3 小时前
异常考勤智能预警与处理与流程优化方案 | 基于企业级Agent的超自动化实战教程
运维·人工智能·ai·自动化