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)

大家都在看

  • 日常开发方案设计指北

    互联网公司管理研发流程,常常使用TAPD一类的敏捷工具。一个需求从提出到上线要经历至少七个流程: 1)需求评审:产品经理给出需求文档,邀请技术参与需求评审,目的是扫清需求疑点,排除…

    Linux 2023年6月6日
    0114
  • PowerShell yarn : 无法加载文件 C:UsersAdminAppDataRoamingnpmyarn.ps1,因为在此系统因为在此系统上禁止运行脚本。

    1、搜索powershell,右键以管理员身份运行 2、若要在本地计算机上运行您编写的未签名脚本和来自其他用户的签名脚本,请使用以下命令将计算机上的 执行策略更改为 RemoteS…

    Linux 2023年5月28日
    0115
  • 使用bt面板中Python项目管理部署Django项目找不到static采坑记

    工作需要,准备在用django做一个小项目,本地测试没有问题,但是使用bt的工具”python项目管理器”部署到服务器上,找不到static文件 于是尝试解…

    Linux 2023年6月14日
    0117
  • CentOS——Redis远程连接可视化工具Rdis Desktop Manage

    前排提示 Centos没有安装Redis的可参考 https://www.cnblogs.com/tianhengblogs/p/15265028.html 一。 修改redis….

    Linux 2023年5月28日
    0170
  • mit6.824 笔记 一

    分布式是复杂的系统再考虑分布式系统前应该尽可能尝试其他方法。 人们使用大量的相互协作的计算机驱动力是: 人们需要获得更高的计算性能。可以这么理解这一点,(大量的计算机意味着)大量的…

    Linux 2023年6月7日
    0109
  • 记一次burp suite文件上传漏洞实验

    一·文件上传漏洞概念文件上传漏洞是指 Web 服务器允许用户在没有充分验证文件名称、类型、内容或大小等内容的情况下将文件上传到其文件系统。未能正确执行这些限制可能意味着即使是基本的…

    Linux 2023年6月7日
    0104
  • JavaScript原型链

    <!doctype html> <html lang="en"> <head> <title>&#x53…

    Linux 2023年6月13日
    084
  • Linux下出现Permission denied解决

    输入命令设置root密码 sudo passwd 得到的答复是 We trust you have received the usual lecture from the loca…

    Linux 2023年6月14日
    095
  • MTSP问题的简单介绍

    1. TSP问题与MTSP问题 1.1 TSP与MTSP问题的介绍: TSP:是指旅行家(1名)要旅行n个城市,要求各个城市经历且仅经历一次然后回到出发城市,并要求所走的 路程最短…

    Linux 2023年6月14日
    0158
  • vscode搜索所有文件夹中所有文件的方法

    最近在看opencv相关的内容,看到画图这一部分时,提示我 这些代码都来自OpenCV代码的sample文件夹。 按照他的提示,我打开了相应的文件夹,却发现,so many 文件 …

    Linux 2023年6月14日
    0275
  • VMware ESXi 7.0 U2 SLIC 2.6 & Unlocker 集成 Intel NUC 网卡、USB 网卡和 NVMe 驱动

    404. 抱歉,您访问的资源不存在。 可能是URL不正确,或者对应的内容已经被删除,或者处于隐私状态。 [En] It may be that the URL is incorre…

    Linux 2023年5月27日
    089
  • 微服务网关Gateway实践总结

    有多少请求,被网关截胡; 一、Gateway简介 微服务架构中,网关服务通常提供动态路由,以及流量控制与请求识别等核心能力,在之前的篇幅中有说过Zuul组件的使用流程,但是当下Ga…

    Linux 2023年6月14日
    0110
  • 我的第一个博客

    我就是想试一试 .阿西吧 段狗是傻逼,段狗请看右边的看板娘 posted @2020-06-22 18:56 xiao-c 阅读(17 ) 评论() 编辑 Original: ht…

    Linux 2023年6月7日
    0141
  • Popovers

    弹出式窗口弹出式窗口是一个短暂的视图,当你点击一个控件或一个区域时,它就会出现在屏幕上的其他内容之上。通常情况下,弹出窗口包括一个箭头,指向它出现的位置。弹出式窗口可以是非模态或模…

    Linux 2023年6月7日
    0100
  • 【V4L2】V4L2框架浅析

    概述 V4L2(Video4Linux的缩写)是Linux下关于视频采集相关设备的驱动框架,为驱动和应用程序提供了一套统一的接口规范。 V4L2支持的设备十分广泛,但是其中只有很少…

    Linux 2023年6月13日
    0121
  • 【论文笔记】(2015,JSMA)The Limitations of Deep Learning in Adversarial Settings

    本文是早期的对抗文章,发表于 EuroS&P 2016会议,最主要的工作是:提出了一个生成对抗样本的算法– JSMA(Jacobian Saliency Map…

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