WEB自动化-10-Page Object 模型

10 Page Object 模型

10.1 概述

在针对一个WEB页面编写自动化测试用例时,需要引用页面中的元素( 数据)才能进行操作( 动作)并显示出页面内容。如果编写的测试用例是直接针对WEB页面元素进行操作,则无法应对经常发生变化的WEB页面,增加日后自动化代码的维护成本。而Page Object模型就是针对WEB页面和元素细节的封装,并对外提供应用级别的API,从而摆脱对WEB页面的高耦合情况。示意图如下所示:

WEB自动化-10-Page Object 模型

针对以上示例,可以大概总结出大概做法,如下所示:

  • 以页面为单位,独立建立模型
  • 隐藏实现细节
  • 本质是面向接口编程

以上示例图片位置:https://martinfowler.com/bliki/PageObject.html

10.2 定义

Page Object模型(简称为PO模式)是一种设计模式,其核心是 分层,实现 松耦合,从而实现 代码复用和其 易维护性。利用PO模型,为每个网页建立两个类:

  • *Page类

将每个页面封装为Page类, 页面元素为Page类 成员变量页面功能为Page类 方法里面

  • *Test类

针对Page类定义的测试类,在测试类中调用Page类中方法完成测试。其使用Page类中的方法与页面UI元素进行交互操作。若UI发生变化,仅需要更新Page类,测试类无需要更改。

10.3 为什么使用Page Object模式

WEB由各种WEB元素(文本框、复选框、多选/单选按钮等)组成。测试代码与这些元素进行交互,如果不能正确管理定位器,则代码的复杂性将成倍增加。当测试代码和定位器的重复使用,将降低代码的可读性,从而进一步加大测试代码的维护成本。 随着项目和需求的不断变化,开发和测试代码的复杂性会不断增加,维护性也随之增加。因此,需要一种方法来解决这种问题,所以我们需要使用PO来尝试解决这一类问题。

10.4 Page Object模型优点

主要优点如下所示:

  • *提高代码可复用性

不同PO类中的Pabe Object方法可以在不同的测试用例中复用,极大提高代码的复用性。

  • *提高代码可维护性

因测试场景和定位器是代码分开,使代码更加清晰,极大提高代码的可维护性。

  • *减少UI对用例造成的影响

尽管UI经常发生变更,也仅需要修改少量代码来应对更改,从而减少其带来的影响。

10.5 Page Object示例

10.5.1 演示环境搭建

我们以官方提供的示例为演示,操作步骤如下所示:

npm install minimist morgan body-parser express-session express hbs --save-dev
npm start server.js
  • 4、在浏览器中访问

WEB自动化-10-Page Object 模型

默认正确的用户名和密码,在 server.js中,可以自行修改,如下所示:

WEB自动化-10-Page Object 模型

10.5.2 演示代码

本代码仅仅是演示在Cypress中的Page Object模式(注意与Selenium的区别),主要示例代码如下所示:

  • 1、 新建定位器文件loginPageLoctor.json,用于存储元素定位器
{
   "loginPage":{
       "username":"input[name=\"username\"]",
       "passwd":"input[name=\"password\"]",
       "submit":"button[type=\"submit\"]",
       "loginFailedPrompt":".error"
   }
}
  • 2、 新建Page类loginPage.js,用于封装对象和定位元素
///

import LoginPageLocator from "./loginPageLoctor.json"

export default class LoginPage{
    constructor(visitUrl){
       this.url=visitUrl;
    }

    get username(){
        return cy.get(LoginPageLocator.loginPage.username);
    }

    get passwd(){
        return cy.get(LoginPageLocator.loginPage.passwd);
    }

    get submit(){
        return cy.get(LoginPageLocator.loginPage.submit);
    }

    get errorPrompt(){
        return cy.get(LoginPageLocator.loginPage.loginFailedPrompt);
    }

    get successUrl(){
        return cy.url();
    }

    visit(){
       cy.visit(this.url);
    }

    login(name,pwd) {
        if ( name !="" && pwd !=""){
            this.username.type(name);
        }

        if(pwd!=""){
            this.passwd.type(pwd);
        }

        this.submit.click();
    }

}
  • 3、 新建数据文件loginData.json,用于存储登录的数据和数据驱动
{

    "success": [
        {
            "caseTitle": "正确的用户名和密码,登录成功",
            "user": "jane.lane",
            "pwd": "password123",
            "checkpoint": "/dashboard"
        }
    ],

    "failed": [
        {
            "caseTitle": "错误的用户名和正确的密码,登录失败",
            "user": "Surpass",
            "pwd": "password123",
            "checkpoint": "Username and/or password is incorrect"
        },
        {
            "caseTitle": "正确的用户名和错误的密码,登录失败",
            "user": "jane.lane",
            "pwd": "Surpass",
            "checkpoint": "Username and/or password is incorrect"
        },
        {
            "caseTitle": "错误的用户名和错误的密码,登录失败",
            "user": "Surpass",
            "pwd": "Surpass",
            "checkpoint": "Username and/or password is incorrect"
        }
    ]

}
  • 4、 新建测试类testLogin.spec.js,测试用例代码
///

import LoginPage from "./loginPage"
import UserData from "./loginData.json"

describe('登录测试', () => {
    let baseUrl = "http://localhost:7077/login";
    let login = new LoginPage(baseUrl);
    beforeEach(() => {
        login.visit(baseUrl);
    });

    UserData.success.forEach((item)=>{
       it(item.caseTitle, () => {
           login.login(item.user,item.pwd);
           login.successUrl.should("contain",item.checkpoint)
       });
    });

    UserData.failed.forEach((item)=>{
       it(item.caseTitle, () => {
        login.login(item.user,item.pwd);
        login.errorPrompt.should("contain",item.checkpoint)
       });
    });
});

最终的运行结果如下所示:

WEB自动化-10-Page Object 模型

原文地址:https://www.jianshu.com/p/f6749544d6f8

本文同步在微信订阅号上发布,如各位小伙伴们喜欢我的文章,也可以关注我的微信订阅号:woaitest,或扫描下面的二维码添加关注:

WEB自动化-10-Page Object 模型

Original: https://www.cnblogs.com/surpassme/p/16729294.html
Author: Surpassme
Title: WEB自动化-10-Page Object 模型

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/581621/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • Linux内核驱动–硬件访问I/O【转】

    寄存器与内存 寄存器和内存之间有什么区别? [En] What is the difference between registers and memory? 寄存器和RAM的主要…

    Linux 2023年5月27日
    075
  • Python中的对象引用、浅拷贝与深拷贝

    最近项目中遇到一个Python浅拷贝机制引起的bug,由于对于Python中对象引用、赋值、浅拷贝/深拷贝机制没有足够的认识,导致调试了很久才发现问题,这里简单记录一下相关概念。 …

    Linux 2023年6月6日
    085
  • Redis内存满了怎么办

    Redis是基于内存的key-value数据库,因为系统的内存大小有限,所以我们在使用Redis的时候可以配置Redis能使用的最大的内存大小。 1、通过配置文件配置 通过在Red…

    Linux 2023年5月28日
    077
  • cmake 入门笔记

    1. cmake 是什么? 这些年大型 C/C++ 工程都纷纷转到了 cmake 环境下,那么这个工具到底有什么魅力吸引着大家呢?无它,软件工程崇尚实用主义,而 cmake 的功能…

    Linux 2023年6月6日
    0111
  • 那些技术实战中的架构设计方法

    上个月我写的一篇文章《关于技术能力的思考和总结》引起了大家的关注,好多读者的评论”以写代想、以想促真、以讲验真”,大家的感受很深刻,基于上次的文章,这篇文章…

    Linux 2023年6月8日
    090
  • Linux系统查看磁盘可用空间的5个命令

    大家好,我是良许。 工作中,经常会遇到磁盘爆满的情况,尤其是一台服务器运行了 N 年之后,里面会充满各种各样垃圾文件,比如:编译产生的中间文件、打包的镜像文件、日志文件,等等。 别…

    Linux 2023年5月27日
    0131
  • 【原创】linux设备模型之kset/kobj/ktype分析

    背 景 Read the fucking source code! –By 鲁迅 A picture is worth a thousand words. &#8211…

    Linux 2023年6月8日
    0112
  • Linux 下安装 node.js

    这里介绍两种安装方式: 编译安装和使用编译后的安装包安装。 安装目录: /usr/local 一、使用编译安装包安装 1、进入安装目录: 2、下载安装包: 3、解压: 4、进入解压…

    Linux 2023年6月13日
    0100
  • 领导:谁再用redis过期监听实现关闭订单,立马滚蛋!

    在电商、支付等领域,往往会有这样的场景,用户下单后放弃支付了,那这笔订单会在指定的时间段后进行关闭操作,细心的你一定发现了像某宝、某东都有这样的逻辑,而且时间很准确,误差在1s内;…

    Linux 2023年5月28日
    094
  • 前端Web实训项目-教务系统成绩查询

    通过暑期前半个月实训,我们选的方向是Web前端(虽然我想选Java全栈的),所以我们最终确立的主题是做一个网页。 这个项目是我们组四个人做的,因为技术水品都不咋样,所以有很多地方需…

    Linux 2023年6月7日
    0119
  • 常见Git命令汇总

    前言 最近,有朋友私信让我就 git 使用做篇文章分享,分享一下我在日常工作中是如何使用 git的。我当场就收费两包辣条,最后讨价还价,…

    Linux 2023年6月13日
    098
  • zabbix4.0 本地安装详解及步骤

    安装前说明下,下面安装过程中涉及selinux部分仅供参考,可能会导致启动服务时产生各种报错,作者也是在折腾了无数日夜后报错不断而放弃治疗,直接永久关闭了selinux(啊,没有s…

    Linux 2023年6月8日
    0103
  • redis

    redis 慢 开启 AOF 1、多加服务器 2、增加写的能力 +ssdb Original: https://www.cnblogs.com/y896926473/p/96929…

    Linux 2023年5月28日
    081
  • dotnet-cnblogs-tool使用与坑

    404. 抱歉,您访问的资源不存在。 可能是网址有误,或者对应的内容被删除,或者处于私有状态。 代码改变世界,联系邮箱 contact@cnblogs.com 园子的商业化努力-困…

    Linux 2023年6月6日
    084
  • MySQL(一)——查看密码与修改

    查看数据库密码,策略与修改 RPM安装: 源码安装: 进入:数据库 进入数据库后第一步设置密码: 查看密码策略 修改密码策略,长度 0宽容模式 混合模式,0关闭大小写 特殊字符 O…

    Linux 2023年6月13日
    088
  • DHCP欺骗攻击—模拟

    实验拓扑: 基本配置: DHCP服务器配置: 客户端配置: 攻击者配置: 使用云与kail桥接 云: kail虚拟机配置: 为kali linux也添加一张网卡,桥接到VMnet1…

    Linux 2023年6月13日
    095
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球