【WEB自动化测试】-PO设计模式

这篇具有很好参考价值的文章主要介绍了【WEB自动化测试】-PO设计模式。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、PO模式V2版本实现浏览器打开方法的前置:setup_class

class TestLoginPage(object):
    login_data = [{'resault':'账户不存在','username':'admin1','pwd':'123456'},
                  {'resault':'密码错误','username':'admin','pwd':'1234567'}]
    def setup_class(self):
        # 浏览器打开和设置一次
        self.driver = webdriver.Chrome()
        self.driver.get('http://localhost/backend/page/login/login.html')
        self.driver.maximize_window()
        self.driver.implicitly_wait(10)

    def teardown_class(self):
        time.sleep(5)
        self.driver.quit()

    def setup(self):
        time.sleep(2)
        # 登陆方法执行前,刷新一次首页,可以去掉上一次执行的弹出框
        self.driver.get('http://localhost/backend/page/login/login.html')

    def teardown(self):
        pass

    @pytest.mark.parametrize('login_info',login_data)
    def test_login(self,login_info):

        holder = self.driver.find_element(By.CSS_SELECTOR,'[placeholder="账号"]')
        holder.clear()
        holder.send_keys(login_info['username'])

        pwd = self.driver.find_element(By.CSS_SELECTOR, '[placeholder="密码"]')
        pwd.clear()
        pwd.send_keys(login_info['pwd'])
        self.driver.find_element(By.CSS_SELECTOR, 'button[class*=login-btn]').click()

二、PO模式V3版本

如用例多了,那么登陆的代码就需要在每个模块化中都加入,所以考虑公共部分提取出来,做成一个公共的工具类。习惯命名为utils.py。

2.1 定义获取驱动对象的工具类

  • 定义获取驱动对象的工具类
  • 封装"获取弹出框的提示信息"
"""
utils.py
公共方法模块:习惯命名 utils
"""
def get_alert_msg():
    time.sleep(0.5)
    msg = DriverUtil.get_driver().find_element(By.CSS_SELECTOR, 'p[class="el-message__content"]').text
    return msg


class DriverUtil(object):
    """浏览器对象管理类"""
    __driver = None

    @classmethod   #类装饰器,类方法可以直接由类对象调用,省略实例化对象步骤
    def get_driver(cls):
        """获取浏览器对象方法"""
        if cls.__driver is None:
            cls.__driver = webdriver.Chrome()
            cls.__driver.get('http://localhost:8001/backend/page/login/login.html')
            cls.__driver.maximize_window()  # 窗口最大化
            cls.__driver.implicitly_wait(10)  # 隐式等待
        return cls.__driver

    @classmethod
    def quit_driver(cls):
        """推出浏览器方法"""
        if cls.__driver:
            time.sleep(3)
            cls.__driver.quit()
            cls.__driver = None

    @classmethod
    def refresh_windows(cls):
        time.sleep(2)
        cls.__driver.get('http://localhost:8001/backend/page/login/login.html')

2.2 调用utils

class TestLoginPage(object):
    login_data = [{'resault':'账户不存在','username':'admin1','pwd':'123456'},
                  {'resault':'密码错误','username':'admin','pwd':'1234567'}]
    def setup_class(self):
        # 浏览器打开和设置一次
        self.driver = DriverUtil.get_driver()

    def teardown_class(self):
        DriverUtil.quit_driver()

    def setup(self):
        DriverUtil.refresh_windows()

    def teardown(self):
        pass

    @pytest.mark.parametrize('login_info',login_data)
    def test_login(self,login_info):

        holder = self.driver.find_element(By.CSS_SELECTOR,'[placeholder="账号"]')
        holder.clear()
        holder.send_keys(login_info['username'])

        pwd = self.driver.find_element(By.CSS_SELECTOR, '[placeholder="密码"]')
        pwd.clear()
        pwd.send_keys(login_info['pwd'])
        self.driver.find_element(By.CSS_SELECTOR, 'button[class*=login-btn]').click()
        msg = get_alert_msg()
        print("错误信息为:"+msg)
        assert msg == login_info['resault']

三、PO设计模式

PO是Page Object的缩写,PO模式是自动化测试项目开发实践的最佳设计模式之一。核心思想是通过对界面元素的封装减少冗余代码,同时在后期维护中,若元素定位发生变化,只需要调整页面元素封装的代码,提高测试用例的可维护性,可读性。

PO模式可以把一个页面分为三层,对象库层,操作层,业务层。每一层对应一个类。

  • 对象库层:封装定位元素的方法:page(页面对象)
  • 操作层:封装对元素的操作   base(基类,操作元素的类)
  • 业务层:将一个或多个操作组合起来完成一个业务功能,比如登录:需要输入账号,密码,点击登录三个操作。

3.1 代码

base/base.py-操作元素的类

from selenium.webdriver.support.wait import WebDriverWait

"""
元组解包:loc变量:类型为元组,*loc为解包
"""
class Base(object):
    # 初始化
    def __init__(self,driver):
        self.driver = driver

    # 查找元素方法(提供:点击、输入、获取文本等方法使用)
    # loc:元素的配置信息,格式为元组,例如(By.ID, "username")
    def base_find_element(self, loc, timeout=30, poll=0.5):
        return WebDriverWait(self.driver, timeout=timeout, poll_frequency=poll).until(lambda x: x.find_element(*loc))

    # 点击控件方法
    def base_click(self, loc):
        self.base_find_element(loc).click()

    # 输入控件方法
    def base_input(self, loc, value):
        ele = self.base_find_element(loc)
        # 清空
        ele.clear()
        # 输入
        ele.send_keys(value)

    # 获取文本方法
    def base_get_text(self, loc):
        return self.base_find_element(loc).text

    # 截图方法
    def base_get_image(self, imagepath):
        self.driver.get_screenshot_as_file(imagepath)

page/__init__.py-存储元素

from selenium.webdriver.common.by import By

# 用户名
login_username = By.ID, "username"
# 密码
login_pwd = By.CSS_SELECTOR, 'input[placeholder="密码"]'
# 登录按钮
login_btn = By.XPATH, '//button[contains(@class,"login-btn")]'
# 错误信息
login_error_msg = By.CSS_SELECTOR,'div[class="el-message el-message--error"]'

page/page_login.py-封装元素,继承自base

from pompage.base.base import Base
from pompage import page


class PageLogin(Base):
    
    def __init__(self,driver):
        super(PageLogin, self).__init__(driver)

    # 输入用户名
    def page_input_username(self,username):
        self.base_input(page.login_username,username)

    # 输入密码
    def page_input_pwd(self, pwd):
        self.base_input(page.login_pwd, pwd)

    # 点击登录
    def page_click_btn(self):
        self.base_click(page.login_btn)

    # 获取错误信息
    def page_error_msg(self):
        return self.base_get_text(page.login_error_msg)

    def page_login(self, username, pwd):
        self.page_input_username(username)
        self.page_input_pwd(pwd)
        self.page_click_btn()

scripts/test_login.py -- 用例执行


import pytest

from pompage.utils import DriverUtil
from pompage.page.page_login import PageLogin

def get_login_data():
    return [{'resault':'账户不存在','username':'admin1','pwd':'123456'},
                {'resault':'密码错误','username':'admin','pwd':'1234567'}]
class TestLogin(object):

    def setup_class(self):
        self.driver = DriverUtil.get_driver()
        self.login = PageLogin(self.driver)

    def teardown_class(self):
        DriverUtil.quit_driver()

    def setup(self):
        DriverUtil.refresh_windows()

    def teardown(self):
        pass

    @pytest.mark.parametrize("login_info",get_login_data())
    def test_login(self,login_info):
        self.login.page_login(login_info['username'],login_info['pwd'])
        msg = self.login.page_error_msg()
        assert msg == login_info['resault']


utils.py-公共类文章来源地址https://www.toymoban.com/news/detail-569223.html

import time

from selenium import webdriver
from selenium.webdriver.common.by import By

"""
公共方法模块:习惯命名 utils
"""
def get_alert_msg():
    time.sleep(0.5)
    msg = DriverUtil.get_driver().find_element(By.CSS_SELECTOR, 'p[class="el-message__content"]').text
    return msg


class DriverUtil(object):
    """浏览器对象管理类"""
    __driver = None

    @classmethod   #类装饰器,类方法可以直接由类对象调用,省略实例化对象步骤
    def get_driver(cls):
        """获取浏览器对象方法"""
        if cls.__driver is None:
            cls.__driver = webdriver.Chrome()
            cls.__driver.get('http://localhost:8001/backend/page/login/login.html')
            cls.__driver.maximize_window()  # 窗口最大化
            cls.__driver.implicitly_wait(10)  # 隐式等待
        return cls.__driver

    @classmethod
    def quit_driver(cls):
        """推出浏览器方法"""
        if cls.__driver:
            time.sleep(3)
            cls.__driver.quit()
            cls.__driver = None

    @classmethod
    def refresh_windows(cls):
        time.sleep(2)
        cls.__driver.get('http://localhost:8001/backend/page/login/login.html')

到了这里,关于【WEB自动化测试】-PO设计模式的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • web自动化测试-PageObject 设计模式

    为 UI 页面写测试用例时(比如 web 页面,移动端页面),测试用例会存在大量元素和操作细节。当 UI 变化时,测试用例也要跟着变化, PageObject 很好的解决了这个问题。 使用 UI 自动化测试工具时(包括 selenium,appium 等),如果无统一模式进行规范,随着用例的增多会变得难

    2024年02月14日
    浏览(29)
  • 软件测试/测试开发丨Web自动化 PageObject设计模式

    本文为霍格沃兹测试开发学社学员学习笔记分享 原文链接:https://ceshiren.com/t/topic/27167 马丁福勒个人博客 selenium 官网 无法适应 UI 频繁变化 无法清晰表达业务用例场景 大量的样板代码 driver/find/click 降低 UI 变化导致的测试用例脆弱性问题 让用例清晰明朗,与具体实现无关 字

    2024年02月10日
    浏览(42)
  • 〖Python WEB 自动化测试实战篇⑫〗- 实战 - PageObject框架设计(亦叫做 “页面对象” 模式)

    订阅 Python全栈白宝书-零基础入门篇 可报销! 白嫖入口-请点击我。 推荐他人订阅,可获取扣除平台费用后的35%收益,文末名片加V! 说明:该文属于 Python全栈白宝书专栏, 免费阶段订阅数量4300+ , 购买任意白宝书体系化专栏可加入 TFS-CLUB 私域社区。 福利:加入社区的小伙

    2024年02月02日
    浏览(32)
  • 自动化测试po模式是什么

    全称:page object model  简称:POM/PO PO模式最核心的思想是分层,实现松耦合!实现脚本重复使用,实现脚本易维护性! 主要分三层: 1.基础层BasePage:封装一些最基础的selenium的原生的api方法,元素定位,框架跳转等。 2.PO层:元素定位、获得元素对象,页面动作 3.测试用例层

    2024年01月19日
    浏览(32)
  • Web 自动化测试(Selenium) PO 模型

     🔥 交流讨论: 欢迎加入我们一起学习! 🔥 资源分享 : 耗时200+小时精选的「软件测试」资料包 🔥  教程推荐: 火遍全网的《软件测试》教程   📢 欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正! 1. po 模型介绍 在自动化中,Selenium 自动化测试中有一个名字经常被提

    2024年04月13日
    浏览(21)
  • 如何搭建自动化测试框架?资深测试整理的PO模式,一套打通自动化...

    Po模型介绍 1、简介 在自动化中,Selenium自动化测试中有一个名字经常被提及PageObject(思想与面向对象的特征相同),通常PO模型可以大大提高测试用例的维护效率 2、为什么要用PO 基于selenium2开始ui自动化测试脚本的编写不是多么艰巨的任务。只需要定位到元素,执行对应元素的

    2024年02月13日
    浏览(35)
  • UI 自动化测试框架:PO 模式+数据驱动

    PO(PageObject)设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个 Page 类,并以页面为单位来写测试用例,实现页面对象和测试用例的分离。 PO 模式的设计思想与面向对象相似,能让测试代码变得可读性更好,可维护性高,复用性高。 PO 模式可以把一个

    2024年02月06日
    浏览(30)
  • UI 自动化测试框架:PO模式+数据驱动

    1. PO 设计模式简介 什么是 PO 模式? PO(PageObject)设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个 Page 类,并以页面为单位来写测试用例,实现页面对象和测试用例的分离。 PO 模式的设计思想与面向对象相似,能让测试代码变得可读性更好,可维护性

    2024年02月04日
    浏览(26)
  • UI 自动化测试框架:PO 模式+数据驱动!

    PO(PageObject)设计模式将某个页面的所有元素对象定位和对元素对象的操作封装成一个 Page 类,并以页面为单位来写测试用例,实现页面对象和测试用例的分离。 PO 模式的设计思想与面向对象相似,能让测试代码变得可读性更好,可维护性高,复用性高。 PO 模式可以把一个

    2024年02月03日
    浏览(24)
  • selenium UI自动化PO模式测试框架搭建

    熟悉业务-》确定方案-》选取场景-》了解前端-》定位元素-》编写脚本-》运行优化-》回归报告-》项目汇总 价值意义: 自动化执行需要:模块化 需要可制定化执行 可复用性 PO模式: 将页面定位和业务分开,元素的定位单独处理,执行脚本单独封装。维护方便。 封装BasePag

    2024年02月04日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包