web UI自动化之PO模式

web UI自动化之PO模式PO是什么:PO模式,PageObject的缩写,页面对象,设计框架的思想,分层思想在PO下,应用程序的每一个页面都有一个对应的pageclass每一个pageclass维护着该web页的元素集和操作这些元素的方法pageclass中的方法命名最好根据对应的业务场景进行,例如通常登录后我们需要等待几秒钟PO的优势:PO提供了一种业务流程与页面元素操作分离的模式,这使得测试代码变得更加清晰页面对象与用例分离,使得我们更好的复用对象可复用的页面方法代码会变得更加优化更加有效的命名

大家好,又见面了,我是你们的朋友全栈君。

PO是什么:

  1. PO模式,Page Object的缩写,页面对象,设计框架的思想,分层思想
  2. 在PO下,应用程序的每一个页面都有一个对应的page class
  3. 每一个page class维护着该web页的元素集和操作这些元素的方法
  4. page class中的方法命名最好根据对应的业务场景进行,例如通常登录后我们需要等待几秒钟

PO的优势:

  1. PO提供了一种业务流程与页面元素操作分离的模式,这使得测试代码变得更加清晰
  2. 页面对象与用例分离,使得我们更好的复用对象
  3. 可复用的页面方法代码会变得更加优化
  4. 更加有效的命名方式使得我们更加清晰的知道方法所操作的UI元素

主要的分层方式:

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

一般分为三层:

  1. 按照页面划分,把每个页面可能涉及到的步骤写下来 pageObject包,页面的配置信息写在这个包的__init__里面
  2. 把页面的步骤组合在一起形成一个业务 pageAction包
  3. 测试用例的书写,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()
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/136431.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • cs模型介绍_cs武器介绍

    cs模型介绍_cs武器介绍1、C/S模型(Client/Server—客户端/服务端)—需要下载app2、B/S模型(Browser/Server—浏览器/服务端)—网页浏览即可

    2025年12月14日
    1
  • uu怎么卸载_卸载deepin引导

    uu怎么卸载_卸载deepin引导ubutun干净卸载删除wineQQ博主原本想要在ubuntu18.04安装wineQQ,在安装完成后却显示QQ版本过低无法运行,只能卸载重装,不然那个QQ标志在软件列表非常碍眼。这个是之前安装wineQQ的教程【QQ版本已过期】问题:卸载不掉该软件且网上大多数指令都过期了解决方案:在deepinwine的应用容器中,用sudoaptremove软件包主名命令来删除。比如d…

    2025年9月19日
    8
  • 回发或回调参数无效。在配置中使用 <pages enableEventValidation=”true”/> 或在页面中使用 <%@ Page EnableEventValidation=”true”

    回发或回调参数无效。在配置中使用 <pages enableEventValidation=”true”/> 或在页面中使用 <%@ Page EnableEventValidation=”true”回发或回调参数无效。在配置中使用或在页面中使用启用了事件验证。出于安全目的,此功能验证回发或回调事件的参数是否来源于最初呈现这些事件的服务器控件。如果数据有效并且是预期的,则使用ClientScriptManager.RegisterForEventValidation方法来注册回发或回调数据以进行验证。这两天写程序总是遇到相似的程序在不同页面,出现不一样的结果。以下是

    2022年7月24日
    9
  • GIT问题:fatal: Out of memory, malloc failed问题的解决[通俗易懂]

    执行gitconfig–globalpack.windowMemory1024m解决多数人抄袭这个,尝试过后没有效果 目录\.git\config[core]repositoryformatversion=0filemode=truebare=true[pack]   window=0 …

    2022年4月15日
    66
  • JavaCV开发详解之3:通用拉流器实现,从流媒体服务器拉流rtsp/rtmp录制成视频文件

    JavaCV开发详解之3:通用拉流器实现,从流媒体服务器拉流rtsp/rtmp录制成视频文件javaCV系列文章:javacv开发详解之1:调用本机摄像头视频javaCV开发详解之2:推流器实现,推本地摄像头视频到流媒体服务器以及摄像头录制视频功能实现(基于javaCV-FFMPEG、javaCV-openCV)javaCV开发详解之3:收流器实现,录制流媒体服务器的rtsp/rtmp视频文件(基于javaCV-FFMPEG)javaCV开发详解之4:转流器实现(也可作…

    2022年5月8日
    135
  • 什么是CMS_SiteServer CMS

    什么是CMS_SiteServer CMS纵观现如今国内CMS程序,大有百花争艳的感觉,随着企业建站需求的复杂度和功能的不断扩展,传统的三五个人写一段代码即告网站建已经行不通,于是以内容管理为应用核心的CMS产品大行其道。  这些CMS系统大体上基于两套框架编写:PHP+MySQL和.NET+MSSQL。在PHP中比较有名的就有DeDeCMS、PHP168、帝国CMS、Supesite等,在.NET方面就有zoomla!…

    2022年9月29日
    2

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号