GUI自动化测试进阶:页面对象模式

news2024/11/28 0:35:58

本文介绍的是页面对象设计模式及其常见的滥用继承的错误。

本文和语言无关,但作者主要使用python和java。本文假设读者已经具有了一定的python或java基础,知道类和方法是什么。

如果完全没有这方面的基础,请看我的《测试人员如何学Python》。

页面对象模式主要用于基于图形界面的自动化测试,如果没有这方面的基础,请看我的《Selenium的学习》。当然,本文也适用于移动端的图形界面自动化。


一、页面对象模式简介

在使用页面对象模式之前的脚本,可能是这样的:

这样的脚本的问题就是,我如果创建了100个脚本,每个脚本里都有用户登录。

当有一天用户登录的页面改了:以前id叫username的文本框改成了id叫user。

我就不得不更新这全部的100个脚本。而网站往往隔三差五就要改版。这一百个脚本的维护工作很快就会把测试人员压垮。

于是,我们引入了页面对象,

所谓页面对象,即是页面元素加页面服务:

在引入页面对象之后,代码的组织是这样的:

 

 具体到页面类内部,是这样的:

于是你看到的页面类这样的,此处我使用伪代码来描述,请自行转化成自己使用的语言。这里我是假设有一个在线电影网站(我的第一个自动化框架就是针对一个在线电影网站),提供用户注册功能。

 

而脚本则是这样的

 

这里脚本的脚本本身只有一行代码:

从注册页开始,先注册新用户,然后返回首页,然后搜索一部电影“雷神”,最后购买。注意,这仅仅是一个例子,我以方法链的形式来写了这个脚本,而且没有加断言。实际工作中,不建议你以方法链的方式来写脚本,实际上的脚本可能是写成这样的:

 

看完这个解释,大家是否对页面对象有了一定的理解了呢?

那么请尝试一下,找一个网站,给他的某个页面建立一个XXXPage类,然后封装一些这个页面的元素和服务吧。

二、面向对象不仅仅是继承

提到面向对象,大家可能在脑海里马上联想到了父类和子类,多态,接口等等。这部分是面向对象的主要内容,但并非全部内容。我在日常工作中,常常见到一些编码人员(测试或开发)写的代码是这样的,一个类套一个类,一个继承一个,十七八个类这么继承下来,使后续的维护者一头雾水。有时候维护者想要修改一些东西,不知道该改哪个类。这就说明原作者的设计过头了。所谓的“设计过度”的历史遗留代码,是我在工作中遇到的一个很常见的实际问题。

继承可能是这样的:

 

 

这样由上往下,从父类到子类。子类具有父类的属性和方法,并且有自己独有的新的属性和方法。

假设现在有一个在线电影网站要做自动化(这个网站大多数页面都带头部导航栏,导航栏里包括了“电影”,“电视剧”,“综艺”等菜单链接。),该自动化脚本的作者想要用页面对象模式封装这些页面。由于这位测试人员学过继承,于是他在测试框架里写了这样的类:

这是最典型的错误:滥用继承。

错误的点在于带导航栏的页面和不带导航栏的页面,不应该划分为两个类。

设想以下场景:

如果有一天需求变了。该网站支持了一批从第三方接入的用户(这也是一个我遇到过的实际需求噢)。对于这批新用户,要新增一种新版的头部导航栏,有些链接到原有内容,有些链接到这批用户独享的内容。网站改版成新旧导航栏并存。对老用户只开放老版导航栏,对第三方接入的新用户只开放新版导航栏。而页面本体没有其他任何变化。那么按照这种设计就会变成这样:

然后问题就来了:

页面1、2、3和7、8、9除了导航栏不一样以外,内容是完全一样的。

而只有页面10是专属于新的用户类型才能访问的页面。

此时,页面123和789里完全一样的内容写了两遍。那么日常维护量就变成了两倍。为了解决这种问题,需要引入组合模式。

三、加入组合模式

所谓组合模式,是这样的:

 

 引入了组合模式后,页面对象模式是这样的:

于是,在刚才的RegisterPage类里加入了导航栏的实例之后,这个页面的代码就是类似于这样的: 

仅仅只增加了一行代码,但是这个页面就得到了导航栏类的所有功能。假设导航栏里提供了goto_xxx_page()这样的方法,那么在调用时,只要

register_page.nav.goto_xxx_page()

这样就能在registerpage类里调用到导航栏类里的方法。

这样,就通过组合的方式,实现了页面之间功能更好的抽象。回头看那个导航栏发生变化的需求,一开始如果用了组合模式,那这个就不需要重复定义页面789了。

最后我们记住设计的原则:

把页面里可重用的模块,看作一个又一个的小页面。在页面类里通过组合的方式,把这些小页面组合进来。而不是搞一个复杂的继承树,一层套一层。

最后: 为了回馈铁杆粉丝们,我给大家整理了完整的软件测试视频学习教程,朋友们如果需要可以自行免费领取 【保证100%免费】

 全套资料获取方式:点击下方小卡片自行领取即可

 

 

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/793576.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TPS54620RHLR是一款同步降压转换器

TPS54620RHLR是一款同步降压转换器,通过高效率和集成高压侧和低压侧MOSFET,为小型设计进行了优化。通过电流模式控制实现了进一步的空间节省,从而减少了元件数量,并通过选择高开关频率,减少了电感器的占地面积。输出电…

Redis源码篇 - QuickList数据结构

Quicklist是Redis3.2之后引入的一个双向链表结构,其本质是对ziplist弊端的一个优化数据结构,ziplist是一种连续的内存空间,用于减少碎片化,减少内存占用,但是正是因为需要连续的内存空间,当数量越来越大时&…

023 - group by

GROUP BY语句将具有相同值的行分组到汇总行中 GROUP BY语句通常与聚合函数(COUNT,MAX,MIN,SUM,AVG)一起使用,将结果集分组为一列或多列。 SQL GROUP BY 语法 SELECT column_name(s) FROM tabl…

antd中的Cascader级联选择框怎么清空重置React

项目场景: React项目,使用antd中的Cascader级联选择框 问题描述: 通过其他按钮无法重置选择框中的项 原因分析:(对应解决办法一和二) 1、级联选择框的数据默认是根据options绑定的数组中的value值来进行…

Audio Clip

Unity支持的音频格式: aiff/wav:适用于较短声音片段 mp3/OGG:适用于较长的音乐片段 多声道强制转为单声道,减小所占内存。 勾选后会对声音有优化 在后台加载声音 Load Type: 第一个,以不压缩的形式存在内存&#…

idea插件开发-自定义语言02-Lexer

词法分析器或词法分析器定义文件内容如何分解为标记。词法分析器是自定义语言插件几乎所有功能的基础,比如基本语法突出显示到高级代码分析功能。由Lexer来定义。IDE在三个主要上下文中调用词法分析器,插件可以根据需要提供不同的词法分析器实现&#xf…

中南大学硕士论文latex版本全指导

要毕业了,闲下点时间写的东西。之前一直收益与师兄师姐流传下来的latex版本,用起来很舒服,希望后面的学弟学妹也能完美用上。latex功能很强大,不需要自己排版,只管内容即可,但是安装流程会多一丢丢。 目录 …

QT--day2(信号与槽,多界面跳转)

第一个界面头文件&#xff1a; #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QIcon> //图标头文件 #include <QPushButton> //按钮类头文件QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACEclass Widget : public…

弱电系统与IBMS系统,强强联手打造智能建筑

随着科技的飞速发展和人们对建筑设施需求的不断提升&#xff0c;智能建筑正逐渐成为建筑行业的重要发展方向。智能建筑是指通过应用先进的技术和系统&#xff0c;对建筑物的结构、系统、服务和管理等进行优化组合&#xff0c;实现建筑设施的智能化和自动化。当前&#xff0c;智…

全网低价乱价怎么解决

随着品牌的逐步发展&#xff0c;销售渠道也会渐渐增多&#xff0c;比如电商平台中的产品链接&#xff0c;会随着品牌销售店铺的增多、销售SKU的增多&#xff0c;链接量逐步上升&#xff0c;各链接的价格也会有高有低&#xff0c;有些还会低于品牌要求的建议销售价&#xff0c;所…

Java spring Aop实战

0目录 Spring AOP 1.实战 1.实战 创建工程和依赖 数据库建表 实体类 Mapper 接口 方法一 方法二 Service包 接口1&#xff1a; 实现接口 Mapper Mapper 1 Mapper 2 配置xml文件 Xml 1 Xml 2 Spring 配置文件 Mybatis配置文件 测试类 数据库结果 …

信息系统项目管理师(第四版)教材精读思维导图-第三章信息系统治理

请参阅我的另一篇文章&#xff0c;综合介绍软考高项&#xff1a; 信息系统项目管理师&#xff08;软考高项&#xff09;备考总结_计算机技术与软件专业技术_铭记北宸的博客-CSDN博客 目录 3.1 IT治理 3.2 IT审计 3.1 IT治理 3.2 IT审计

小创业公司死亡剧本

感觉蛮真实的&#xff1b;很多小创业公司没有阿里华为的命&#xff0c;却得了阿里华为的病。小的创业公司要想活无非以下几点&#xff1a; 1 现金流&#xff0c;现金流&#xff0c;现金流&#xff1b; 2 产品&#xff0c;找痛点&#xff0c;不要搞伪需求&#xff1b; 3 根据公司…

DAY2,Qt(继续完善登录框,信号与槽的使用 )

1.继续完善登录框&#xff0c;当登录成功时&#xff0c;关闭登录界面&#xff0c;跳转到新的界面中&#xff0c;来回切换页面&#xff1b; ---mychat.h chatroom.h---两个页面头文件 #ifndef MYCHAT_H #define MYCHAT_H#include <QWidget> #include <QDebug> /…

Error in onLoad hook: “ReferenceError: plus is not defined“ found in

项目场景&#xff1a; 项目背景如下所示&#xff1a; 使用 HBuilder X 开发 项目&#xff0c; 调整页面时&#xff0c;直接运行到 浏览器查看页面设置效果&#xff0c;导致控制台出现下述报错信息 例如&#xff1a; 问题描述 遇到的问题如下所示&#xff1a; APP 中接收数据…

aigo S7 PSSD 固态硬盘提示“没有初始化”的修复分享

关于固态硬盘 我们知道,固态硬盘(SSD)因其轻、薄、快、低耗电、耐震、稳定性高、耐低温等优点得到了快速的应用,在存储设备市场中占有很大份额并在持续增长。但是,我们的固态硬盘一旦损坏,数据就比较难以恢复。 今天粉丝送来的一个aigo S7 PSSD 固态硬盘进行修复,插入…

XCP详解「3.2·CANape新建工程导入A2L」

返回 XCP详解「总目录」 目录 1、新建APE工程 2、导入A2L文件 3、查看信号 4、记录数据 1、新建APE工程 打开CANape 17.0 创建新工程 创建工程名 选择保存路径 完成后&#xff0c;会开启新工程空白界面 2、导入A2L文件 导入3.1中建好的A2L文件 根据需要设置Channel&#…

第七章:WILDCAT: 弱监督学习的深度卷积神经网络用于图像分类、点位定位和分割

0.摘要 本文介绍了WILDCAT&#xff0c;一种深度学习方法&#xff0c;它旨在通过对齐图像区域来获得空间不变性和学习强烈局部化特征。我们的模型仅使用全局图像标签进行训练&#xff0c;并致力于三个主要的视觉识别任务&#xff1a;图像分类、弱监督的逐点对象定位和语义分割。…

1500多名开发者集体提起诉讼,苹果公司回应:不垄断,还提供价值

根据路透社报道&#xff0c;1500多名开发者集体提起诉讼&#xff0c;指控苹果公司在其App Store上存在不公平行为并征收高额佣金。该诉讼要求赔偿高达7.85亿英镑&#xff08;约合72.38亿元人民币&#xff09;。 根据9to5Mac报道&#xff0c;苹果公司对最新起诉提出回应&#xf…

优秀的帮助中心可不能缺少这些元素

随着服务行业越来越卷&#xff0c;很多企业都不满足于只用人工客服来宣传自己的产品和维持售后服务&#xff0c;更多企业开始把目光投向了在线的帮助中心。不仅可以解决人工成本高的问题&#xff0c;还可以实现24小时的全天候服务。是一个绝佳的选择。 优秀的帮助中心必备元素 …