web UI自动化之PO模式

web UI自动化之PO模式PO 是什么 PO 模式 Page Object 的缩写 页面对象 设计框架的思想 分层思想 在 PO 下 应用程序的每一个页面都有一个对应的 page class 每一个 page class 维护着该 web 页的素集和操作这些素的方法 page class 中的方法命名最好根据对应的业务场景进行 例如通常登录后我们需要等待几秒钟 PO 的优势 PO 提供了一种业务流程与页面素操作分离的模式

PO是什么:

PO模式,Page Object的缩写,页面对象,设计框架的思想,分层思想

在PO下,应用程序的每一个页面都有一个对应的page class

每一个page class维护着该web页的元素集和操作这些元素的方法

page class中的方法命名最好根据对应的业务场景进行,例如通常登录后我们需要等待几秒钟

PO的优势:

PO提供了一种业务流程与页面元素操作分离的模式,这使得测试代码变得更加清晰

页面对象与用例分离,使得我们更好的复用对象

可复用的页面方法代码会变得更加优化

更加有效的命名方式使得我们更加清晰的知道方法所操作的UI元素

主要的分层方式:

两层:对象逻辑层+业务数据层

三层:对象库层+逻辑层+业务数据层

四层:对象库层+逻辑层+业务层+数据层

一般分为三层:

按照页面划分,把每个页面可能涉及到的步骤写下来 pageObject包,页面的配置信息写在这个包的__init__里面

把页面的步骤组合在一起形成一个业务 pageAction包

测试用例的书写,case层,跟单元测试框架结合使用,断言,参数化,报告 case包


普通模式:

import time
import page
from base.baseApi import Base
from base.driver import Driver


class Login(Base):
def __init__(self):
# 定义实例属性driver
self.driver = webdriver.Chrome('E:\\chromedriver.exe')
# 窗口最大化
self.driver.maximize_window()

# 打开首页
def open_index(self):
self.driver.get('链接地址')
time.sleep(1)

# 在首页点击登录链接
def click_login_link(self):
self.base_click(page.loc_login_link) # 相同名字,只能找到第一个

# 页面动作划分
# 输入用户名
def input_username(self):
self.base_input(page.loc_username, 'xueqing')

# 输入密码
def input_password(self):
self.base_input(page.loc_password, '123456')

# 点击登录
def click_login(self):
self.base_click(page.loc_login)

def login_business(self):
# 点击登录链接
self.click_login_link()
# 输入用户名
self.input_username()
# 输入密码
self.input_password()
# 点击登录按钮
self.click_login()

# 断言
def assert_business(self):
# 页面加载速度比较快,代码运行速度比较快,所以有时候需要让代码等等页面
time.sleep(5)
assert 'xueqing' in self.driver.page_source

# 退出浏览器
def close_driver(self):
self.driver.close()

PO模式:

页面操作page_login.py

import pageObject
import allure
from base.baseApi import Base

class PageLogin(Base):

# 页面动作划分
# 输入用户名
@allure.step('输入用户名')
def input_username(self, username):
self.base_input(pageObject.login_username, username)

# 输入密码
@allure.step('输入密码')
def input_password(self, password):
self.base_input(pageObject.login_password, password)

# 点击登录
@allure.step('点击登录')
def click_login_button(self):
self.base_click(pageObject.login_button)

组合业务login_action.py

import time
from pageAction.action_manager import ActionManager

# 继承ActionsManager,做到了页面对象类实例化的最大复用性
class Login(ActionManager):
''' 组合业务 1. 登录业务需要哪几个页面的哪几个步骤 2. 登录页面 3个步骤 3. index页面 1个步骤 '''

def login_success(self):
# 点击登录链接
self.pageindex.click_login_link()
# 输入用户名
self.pagelogin.input_username('xueqing')
# 输入密码
self.pagelogin.input_password('123456')
# 点击登录按钮
self.pagelogin.click_login_button()
time.sleep(1)

def login_business(self, username, password):
# 点击登录链接
self.pageindex.click_login_link()
# 输入用户名
self.pagelogin.input_username(username)
# 输入密码
self.pagelogin.input_password(password)
# 点击登录按钮
self.pagelogin.click_login_button()

测试用例test_login.py

import pytest
import allure
import time
from base.driver import Driver
from pageAction.login_action import Login
from tool.readData import ReadData
from base.baseApi import Base

data = ReadData().get_yaml('test_login', 'login_data.yml')

@allure.feature('登录功能的测试用例')
class TestLogin():

def setup_class(self):
''' 初始化chrome对象 :return: '''
# 创建driver对象
self.driver = Driver().get_dirver()
# 创建login的业务对象
self.login = Login(self.driver)
# 创建base对象,调用page_source方法
self.base = Base(self.driver)

@pytest.mark.parametrize('args', data)
@allure.title('登录功能的正向与逆向用例')
def test_login(self, args):
self.login.login_business(args['accounts'], args['pwd'])
time.sleep(2)
assert args['assert'] in self.base.base_page_source

def teardown_class(self):
''' 所有测试用例执行完毕,关闭浏览器 :return: '''
Driver().close_driver()
编程小号
上一篇 2025-03-17 16:01
下一篇 2025-09-19 21:33

相关推荐

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/hz/137013.html