Web自动化-PO模式

2024-05-07 03:04
文章标签 模式 web 自动化 po

本文主要是介绍Web自动化-PO模式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目标

  1. 深入理解方法封装的思想
  2. 能够使用方法封装的思想对代码进行优化
  3. 深入理解PO模式的思想
  4. 熟练掌握PO模式的分层思想 PO模式学习思路 采用版本迭代的方式来学习,便于对不同版本的优缺点进行对比和理解。
  • V1:不使用任何设计模式和单元测试框架
  • V2:使用UnitTest管理用例
  • V3:使用方法封装的思想,对代码进行优化
  • V4:采用PO模式的分层思想对代码进行拆分
  • V5:对PO分层之后的代码继续优化
  • V6:PO模式深入封装,把共同操作提取封装到父类中,子类直接调用父类的方法

一、无模式

目标

1. 熟悉web自动化测试代码编写的基本流程

2. 掌握如何使用UnitTest管理测试脚本

1、案例说明

对TPshop项目的登录模块进行自动化测试。

提示:登录模块包含了很多测试用例,比如:账号不存在、密码错误、验证码错误、登录成 功等等。 为了节省时间我们只选取几个有代表性的用例来演示。

1.1 选择的测试用例

账号不存在

  1.  点击首页的‘登录’链接,进入登录页面
  2.  输入一个不存在的用户名
  3.  输入密码
  4.  输入验证码
  5.  点击登录按钮
  6.   获取错误提示信息

密码错误

  1. 点击首页的‘登录’链接,进入登录页面
  2. 输入用户名
  3. 输入一个错误的密码
  4. 输入验证码
  5. 点击登录按钮
  6. 获取错误提示信息

2. V1版本

不使用任何设计模式和单元测试框架。 每个文件里编写一个用例,完全的面向过程的编程方式。

2.1 存在的问题

一条测试用例对应一个文件,用例较多时不方便管理维护 代码高度冗余

2.2 示例代码

登录功能-账号不存在

from selenium import webdriver
# 创建浏览器驱动对象,并完成初始化操作
driver = webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("http://localhost")
"""
登录功能-账号不存在
"""
# 点击首页的‘登录’链接,进入登录页面
driver.find_element_by_link_text("登录").click()
# 输入用户名
driver.find_element_by_id("username").send_keys("13099999999")
# 输入密码
driver.find_element_by_id("password").send_keys("123456")
# 输入验证码
driver.find_element_by_id("verify_code").send_keys("8888")
# 点击‘登录’按钮
driver.find_element_by_name("sbtbutton").click()
# 获取提示信息
msg = driver.find_element_by_class_name("layui-layer-content").text
print("msg=", msg)
# 关闭驱动对象
driver.quit()

登录功能-密码错误

from selenium import webdriver
# 创建浏览器驱动对象,并完成初始化操作
driver = webdriver.Firefox()
driver.maximize_window()
driver.implicitly_wait(10)
driver.get("http://localhost")
"""
登录功能-密码错误
"""
# 点击首页的‘登录’链接,进入登录页面
driver.find_element_by_link_text("登录").click()
# 输入用户名
driver.find_element_by_id("username").send_keys("13012345678")
# 输入密码
driver.find_element_by_id("password").send_keys("error")
# 输入验证码
driver.find_element_by_id("verify_code").send_keys("8888")
# 点击‘登录’按钮
driver.find_element_by_name("sbtbutton").click()
# 获取提示信息
msg = driver.find_element_by_class_name("layui-layer-content").text
print("msg=", msg)
# 关闭驱动对象
driver.quit()

3. V2版本

使用UnitTest管理用例,并断言用例的执行结果

3.1 引入UnitTest的好处

  • 方便组织、管理多个测试用例
  • 提供了丰富的断言方法
  • 方便生成测试报告
  • 减少了代码冗余

3.2 存在的问题

  • 代码冗余

3.3 示例代码

import unittest
from selenium import webdriver
class TestLogin(unittest.TestCase):"""对登录模块的功能进行测试"""@classmethoddef setUpClass(cls):cls.driver = webdriver.Firefox()cls.driver.maximize_window()cls.driver.implicitly_wait(10)cls.driver.get("http://localhost")@classmethoddef tearDownClass(cls):cls.driver.quit()def setUp(self):# 打开首页self.driver.get("http://localhost")# 点击首页的‘登录’链接,进入登录页面self.driver.find_element_by_link_text("登录").click()# 账号不存在def test_login_username_is_error(self):# 输入用户名self.driver.find_element_by_id("username").send_keys("13099999999")# 输入密码self.driver.find_element_by_id("password").send_keys("123456")# 输入验证码self.driver.find_element_by_id("verify_code").send_keys("8888")# 点击‘登录’self.driver.find_element_by_name("sbtbutton").click()# 断言提示信息msg = self.driver.find_element_by_class_name("layui-layer-content").textprint("msg=", msg)self.assertIn("账号不存在", msg)# 密码错误def test_login_password_is_error(self):# 输入用户名self.driver.find_element_by_id("username").send_keys("13012345678")# 输入密码self.driver.find_element_by_id("password").send_keys("error")# 输入验证码self.driver.find_element_by_id("verify_code").send_keys("8888")# 点击‘登录’self.driver.find_element_by_name("sbtbutton").click()# 断言提示信息msg = self.driver.find_element_by_class_name("layui-layer-content").textprint("msg=", msg)self.assertIn("密码错误", msg)

二、方法封装

目标

  1. 深入理解方法封装的思想
  2. 能够使用方法封装的思想对代码进行优化

1. 方法封装

方法封装:是将一些有共性的或多次被使用的代码提取到一个方法中,供其他地方调用。

封装的好处:

  • 避免代码冗余
  • 容易维护
  • 隐藏代码实现的细节

目的:用最少的代码实现最多的功能

2. V3版本

使用方法封装的思想,对代码进行优化。

  • 定义获取驱动对象的工具类
  • 封装“获取弹出框的提示消息”

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

对登录流程的代码进行优化,定义获取驱动对象的工具类

# utils.py
class DriverUtil:"""浏览器驱动工具类"""_driver = None@classmethoddef get_driver(cls):"""获取浏览器驱动对象,并完成初始化设置:return: 浏览器驱动对象"""if cls._driver is None:cls._driver = webdriver.Firefox()cls._driver.maximize_window()cls._driver.implicitly_wait(10)cls._driver.get("http://localhost")return cls._driver@classmethoddef quit_driver(cls):"""关闭浏览器驱动"""if cls._driver:cls._driver.quit()cls._driver = None

2.2 封装“获取弹出框的提示消息”

对登录流程的代码进行优化,封装‘获取弹出框的提示消息’的方法

# utils.py
def get_tips_msg():"""获取弹出框的提示消息:return: 消息文本内容"""msg = DriverUtil.get_driver().find_element_by_class_name("layui-layer-content").tex
treturn msg

这篇关于Web自动化-PO模式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/966142

相关文章

如何使用Maven创建web目录结构

《如何使用Maven创建web目录结构》:本文主要介绍如何使用Maven创建web目录结构的问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录创建web工程第一步第二步第三步第四步第五步第六步第七步总结创建web工程第一步js通过Maven骨架创pytho

Java Web实现类似Excel表格锁定功能实战教程

《JavaWeb实现类似Excel表格锁定功能实战教程》本文将详细介绍通过创建特定div元素并利用CSS布局和JavaScript事件监听来实现类似Excel的锁定行和列效果的方法,感兴趣的朋友跟随... 目录1. 模拟Excel表格锁定功能2. 创建3个div元素实现表格锁定2.1 div元素布局设计2.

如何使用Haporxy搭建Web群集

《如何使用Haporxy搭建Web群集》Haproxy是目前比较流行的一种群集调度工具,同类群集调度工具有很多如LVS和Nginx,本案例介绍使用Haproxy及Nginx搭建一套Web群集,感兴趣的... 目录一、案例分析1.案例概述2.案例前置知识点2.1 HTTP请求2.2 负载均衡常用调度算法 2.

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Python实现自动化Word文档样式复制与内容生成

《Python实现自动化Word文档样式复制与内容生成》在办公自动化领域,高效处理Word文档的样式和内容复制是一个常见需求,本文将展示如何利用Python的python-docx库实现... 目录一、为什么需要自动化 Word 文档处理二、核心功能实现:样式与表格的深度复制1. 表格复制(含样式与内容)2

pytest+allure环境搭建+自动化实践过程

《pytest+allure环境搭建+自动化实践过程》:本文主要介绍pytest+allure环境搭建+自动化实践过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐... 目录一、pytest下载安装1.1、安装pytest1.2、检测是否安装成功二、allure下载安装2.

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

python web 开发之Flask中间件与请求处理钩子的最佳实践

《pythonweb开发之Flask中间件与请求处理钩子的最佳实践》Flask作为轻量级Web框架,提供了灵活的请求处理机制,中间件和请求钩子允许开发者在请求处理的不同阶段插入自定义逻辑,实现诸如... 目录Flask中间件与请求处理钩子完全指南1. 引言2. 请求处理生命周期概述3. 请求钩子详解3.1

如何基于Python开发一个微信自动化工具

《如何基于Python开发一个微信自动化工具》在当今数字化办公场景中,自动化工具已成为提升工作效率的利器,本文将深入剖析一个基于Python的微信自动化工具开发全过程,有需要的小伙伴可以了解下... 目录概述功能全景1. 核心功能模块2. 特色功能效果展示1. 主界面概览2. 定时任务配置3. 操作日志演示