3分钟彻底搞懂Web UI自动化测试之【POM设计模式】

为什么要用POM设计模式

前期,我们学会了使用Python+Selenium编写Web UI自动化测试线性脚本

线性脚本(以快递100网站登录举例):

  1. import time

  2. from selenium import webdriver

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

  4. driver = webdriver.Chrome()

  5. driver.get("https://sso.kuaidi100.com/sso/v2/authorize.do")

  6. driver.maximize_window()

  7. driver.find_element(By.ID, 'name').send_keys("***********")

  8. driver.find_element(By.ID, 'password').send_keys("***********")

  9. driver.find_element(By.ID, 'submit').click()

  10. time.sleep(2)

  11. text = driver.find_element(By.PARTIAL_LINK_TEXT, '首页').text

  12. assert text == '首页'

  13. driver.close()

使用以上代码,最基础最简单的Web UI 自动化测试就做起来了,但是,问题也随之而来,线性脚本的缺点也暴露出来了:

  • Web UI自动化测试,简单来说,就是模拟人在浏览器上的操作,打开浏览器-定位元素-操作元素-模拟页面动作-断言结果
  • 由于线性脚本中的元素定位、元素操作细节、测试数据、结果验证(断言)是捆绑在一起的,代码会显得非常冗余、可读性差、不可复用、工作量大且可维护性差
  • 刚开始,少数的测试用例维护起来可能很容易,但随着时间迁移、产品迭代、测试套件持续增长,脚本也越来越臃肿,可能需要维护几十个页面,且很多页面是公用的,元素的任何改变都会让我们的脚本变得繁琐复杂、耗时易出错。例如:十几个用例中都用到了A元素,某一天A元素被前端改成了B元素,我们就需要去十几个用到A元素的地方,将A元素修改为B元素
  • 如果可以把公共元素抽取出来,即使元素被前端修改,我们也只需更新元素的定位方式,而不用修改每条测试用例,无论多少用例用到该元素,都只需修改元素定位方式,重新获取元素即可
  • 所以我们引入了PageObject这种解决方案,它可以帮我们解决设计上的问题,可以将testcase和page分层,形成一个非常好的结果

什么是POM设计模式

  • POM:Page Object Model,页面对象模型的简称

  • 13年,由Martin Fowler提出了PageObject的观点

  • 作者的观点是一种封装思想,旨在为每个待测页面创建一个页面对象,从而将繁琐的定位操作、操作细节封装到这个页面对象中,对外只提供必要的操作接口,在调用的时候只调用提供的接口,不用去调用操作细节,最终实现程序的高内聚低耦合,使程序模块的可重用性、移植性大大增强

  • 在这种模式下,对于应用程序中的每个页面都应该有相应单独的页面类(例如:login_page、userinfo_page),类中应该包含此页面上的元素对象和操作这些元素对象所需要的方法
  • 再将流程所关联的页面作为对象,将对象串联起来形成不同的业务流程,例如:在登录页面完成登录操作后跳转到用户中心页面进行个人信息的修改

Selenium官方对PageObject的引入

历史

  • Selenium官方对PageObject进行引入:

    PageObjects · SeleniumHQ/selenium Wiki · GitHub

  • Selenium更新文档地址:

    Page object models | Selenium

PageObject六大原则

  • The public methods represent the services that the page offers

用公共方法表示页面提供的服务

例如:登录页面,有用户名输入框、密码输入框、登录按钮,于是就可以用input_username()代表输入用户名、用input_password()代表输入密码、用click_submit()代表点击登录按钮

  • Try not to expose the internals of the page

尽量不要暴露页面的内部信息

将操作细节封装成方法,对外只提供对应的方法供调用

  • Generally don’t make assertions

一般不使用断言

断言要和Page代码分开,不要将断言写在PageObject层

  • Methods return other PageObjects

方法返回其他PageObjects

例如:首页有个方法是点击登录图标跳转到登录页面,因此这个方法应该返回login_page

  • Need not represent an entire page

不需要表示整个页面

不需要对页面中的每一个元素进行建模,只需要关注我们需要用到的元素。例如:登录页面除了账号密码登录,还有快捷登录、手机短信登录、扫码登录等

  • Different results for the same action are modelled as different methods

同一行为的不同结果可以用不同的方法来模拟

例如:对一个页面进行操作,可能出现正确的结果或者错误的结果,可以为这两种不同的结果分别创建两个不同的方法

POM框架

GitHub开源代码和我留言就好了。

  • base:base_page,基类,定义项目所需的基础方法,对Selenium一些常用的api进行二次封装,如:find_element、click、send_keys、screenshot、调用JavaScript脚本的方法以及其他与浏览器相关的操作
  • 为什么要有基类?
  • 由于每个页面都会频繁使用这些方法,若单纯使用Selenium原始api,可能遇到一些问题,例如:某个按钮未加载完成,但已触发了点击事件,导致元素定位不到而报错。这时就可以对原始api进行二次封装,如:加入等待时间、对异常进行捕获并打印日志等,之后所有的PageObject都继承BasePage类,后续只需要调用这些封装好的方法,增强复用性
  • 假设以后不使用Selenium这个框架,就只需要修改BasePage中的方法,不用去修改具体的测试用例业务代码

  • pages:page_object,页面对象层,也是PO的核心层,继承BasePage,管理页面元素以及操作元素的方法(将操作元素的动作写成方法)
  • cases:测试用例层,用于管理测试用例,这里会用到单元测试框架,如:Pytest、Unittest。
  • data:测试数据层,用于测试数据的管理,数据与脚本分离,降低维护成本,提高可移植性,如:yml 文件数据
  • config:配置文件层,存放整个项目需要用到的配置项,如:URL、数据库信息等
  • utils:CommonUtil,公共模块,将一些公共函数、方法以及通用操作进行封装,如:日志模块、yaml 操作模块、时间模块等
  • run.py:批量执行测试用例的主程序,根据不同需求不同场景进行组装,遵循框架的灵活性和扩展性
  • logs:日志模块,用于记录和管理日志,针对不同情况,设置不同的日志级别,方便定位问题
  • reports:测试报告层,用于测试报告的生成和管理,如:基于 Allure 生成的定制化报告
     

 

总结:

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

 

          视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方进群即可自行领取。

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

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

相关文章

Python SSH协议库之paramiko使用详解

概要 在网络编程中,远程操作是一项非常常见的需求,特别是在服务器管理和自动化任务执行方面。Python提供了许多库来实现远程操作,其中Paramiko是一个备受欢迎的选择。Paramiko是一个纯Python编写的SSH协议库,它提供了一种简单而强大的方式来执行远程命令、上传和下载文件等…

YUNBEE云贝-热烈祝贺Guo同学成功通过Oracle 19c OCP认证考试!

恭喜Guo同学在 #Oracle19c OCP 考试中取得了OCP证书!该认证是Oracle公司的权威技术标准,适用于有资格为Oracle核心产品提供服务和支持的专业人员。尽管OCP认证考题随着版本变化,并且是全英文考试,对中文习惯的人来说有一定的难度&…

怎样将PPT转成文本格式?PPT文本一键生成文本格式 工作经验分享

在日常工作和学习中,我们经常需要将PPT文件转换为文本格式,以便更好地进行编辑、搜索和分享。下面,我将介绍2种常见的PPT转文本格式的方法,帮助大家轻松实现这一需求。 方法一、使用汇帮PDF转换器软件里的“PPT文件操作”菜单进行…

Git的一些基础命令

使用Git主要涉及以下几个基本步骤和概念。 1. 安装Git 首先,你需要在你的计算机上安装Git。可以从Git的官方网站下载安装程序。 2. 配置Git 安装Git后,需要配置用户信息(用户名和电子邮件地址),因为Git的每次提交都会…

我们做的小工具,爆了!

好消息,好消息,江南皮革。。 开个玩笑,大家好,我是程序员鱼皮。 前段时间我在公众号发文宣传了团队新开发的小工具《代码小抄》,这是一个简单易用的代码分享工具,可以快速、跨设备地自由分享代码。 网址&…

K8S Pod

基本概念 Pod是K8S中非常重要的概念之一,是整个K8S架构的基础和核心。Pod是K8S调度的最小单位,是一个不可拆分的独立个体,K8S将多个业务上相关联的容器(Docker容器)合并到一起,组合成一个Pod,这…

使用Office的小伙伴一定要把这个打开!关键时候能保命

使用电脑办公的小伙伴一定离不开Office。很多小伙伴在使用Office的时候,基本上都是双击打开对应的软件(Word/Excel/Powerpoint)就直接使用。 这种直接打开之后就使用的习惯很不值得提倡。除非你要记录的东西是一分钟就能完成的。 小白在企业上…

php 上传文件报错The file failed to upload

描述:环境lnmp 框架laravel 上传接口调用报错The file failed to upload 一、终端搜索php.ini文件位置 [root90f8687c2388 /]# whereis php.ini php: /usr/bin/php /usr/local/php二、修改文件php.ini配置文件upload_max_filesize项 ; Maximum allowed size for …

在四维轻云中,能够上传哪些地理空间数据?

四维轻云是一款地理空间数据在线管理平台,支持各类地理空间数据的在线管理、浏览及分享,用户可不受时间地点限制,随时随地上传、管理、查看及分享各类地理空间数据。平台具有项目管理、场景搭建、素材库等功能模块,支持在线协作管…

《JAVA与模式》之合成模式

系列文章目录 文章目录 系列文章目录前言一、合成模式二、安全式合成模式的结构三、透明式合成模式的结构四、两种实现方法的选择前言 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站,这篇文章男女通用,看懂了就去分享…

DNS欺骗攻击技术详解及实战代码解析

简介 ARP(Address Resolution Protocol)欺骗和DNS(Domain Name System)欺骗是两种常见的网络攻击手段。本文将通过一段Python代码,详细解析如何利用Scapy库实现ARP欺骗与DNS欺骗,并进行实际操作。 实现原…

有哪些知识管理软件适合中小型企业,高管必看!

在经济加速发展的今天,企业对信息和知识的管理需求越来越高,于是,各类知识管理软件应运而生。对于中小型企业来说,选择一款高效、省时、方便的知识管理软件尤其重要。下面,我为大家推荐三款知识管理软件,适…

力扣L6--- 两数之和(java版)--2024年3月12日

1.题目 2.知识点 注1:在Java中,数组的长度不是通过调用一个方法获得的,而是通过一个属性直接获得的。因此,正确的语法是nums.length而不是nums.length()。 所以应该使用int m nums.length; 注2:return new int[]{i,…

计算机视觉2024年趋势简报

计算机视觉2024年趋势简报: **增强现实(AR)整合:**随着Apple和Meta等巨头推出消费级AR设备,预计计算机视觉将在日常应用中更为普及,如在制造、零售和教育领域提供沉浸式体验及操作支持。 **机器人-视觉语言…

【数据库】索引 视图 触发器 分页查询

目录 1、索引 2、视图 3、触发器 4、分页查询⚠️ 1、索引 提升查询效率、当数据量小的时候,索引看不出来效果,当数据量很大的时候,索引会显著提高查询速度 当给表添加索引之后,新插入一条数据,就会让索引进行重新…

SpringBoot注解事务失效列举总结

Spring事务注解 Transactional失效 常规写法不会有脏数据插入。 情景一、内部调用导致事务失效 数据库中出现测试回滚的脏数据 导致该问题原因为spring执行方法数据库操作的时候会生成一个动态代理类去执行代理类的该方法,代理类在执行updateUser时,执…

2024-3-11-C++作业

1>试编程 要求&#xff1a; 提示并输入一个字符串&#xff0c;统计该字符中大写、小写字母个数、数字个数、空格个数以及其他字符个数 源代码: #include <iostream>using namespace std;int main() {string s;cout << "请输入字符串&#xff1a;"…

CentOS 7 基于开源项目制作openssh 9.7p1二进制rpm包(内含ssh-copy-id、显示openssl版本信息)—— 筑梦之路

可参考之前的文章&#xff1a;CentOS 5/6/7 基于开源项目制作openssh 9.6p1 rpm包—— 筑梦之路_centos6 openssh9.6rpm-CSDN博客 2024年3月12日 植树节制作&#xff0c;相关文件见我的资源

java算法第20天 | ● 654.最大二叉树 ● 617.合并二叉树 ● 700.二叉搜索树中的搜索 ● 98.验证二叉搜索树

654.最大二叉树 和根据后/前中序遍历数组生成树结构的思路一样。首先要明确参数和返回值。 每次递归需要传入数组&#xff0c;和开始和结束的位置&#xff0c;返回的是二叉树的根节点。 /*** Definition for a binary tree node.* public class TreeNode {* int val;* …

解决对接淘宝开放平台添加商品图片问题

问题 之前工作因队友离开&#xff0c;只一天接手其部分且第二天就要上线此工具产品&#xff0c;测试提了一些Bug&#xff0c;在Bug中有一个是添加商品图片。前端告知不能用、电话离职队友说能用。没办法自己上、追踪代码。 en这块代码跟需求好像不太相符&#xff0c;重写。 …