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

相关文章

在JS中的设计模式的单例模式、策略模式、代理模式、原型模式浅讲

1. 单例模式(Singleton Pattern) 确保一个类只有一个实例,并提供一个全局访问点。 示例代码: class Singleton {constructor() {if (Singleton.instance) {return Singleton.instance;}Singleton.instance = this;this.data = [];}addData(value)

Java Web指的是什么

Java Web指的是使用Java技术进行Web开发的一种方式。Java在Web开发领域有着广泛的应用,主要通过Java EE(Enterprise Edition)平台来实现。  主要特点和技术包括: 1. Servlets和JSP:     Servlets 是Java编写的服务器端程序,用于处理客户端请求和生成动态网页内容。     JSP(JavaServer Pages)

BUUCTF靶场[web][极客大挑战 2019]Http、[HCTF 2018]admin

目录   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 [web][HCTF 2018]admin 考点:弱密码字典爆破 四种方法:   [web][极客大挑战 2019]Http 考点:Referer协议、UA协议、X-Forwarded-For协议 访问环境 老规矩,我们先查看源代码

【Linux 从基础到进阶】Ansible自动化运维工具使用

Ansible自动化运维工具使用 Ansible 是一款开源的自动化运维工具,采用无代理架构(agentless),基于 SSH 连接进行管理,具有简单易用、灵活强大、可扩展性高等特点。它广泛用于服务器管理、应用部署、配置管理等任务。本文将介绍 Ansible 的安装、基本使用方法及一些实际运维场景中的应用,旨在帮助运维人员快速上手并熟练运用 Ansible。 1. Ansible的核心概念

EasyPlayer.js网页H5 Web js播放器能力合集

最近遇到一个需求,要求做一款播放器,发现能力上跟EasyPlayer.js基本一致,满足要求: 需求 功性能 分类 需求描述 功能 预览 分屏模式 单分屏(单屏/全屏) 多分屏(2*2) 多分屏(3*3) 多分屏(4*4) 播放控制 播放(单个或全部) 暂停(暂停时展示最后一帧画面) 停止(单个或全部) 声音控制(开关/音量调节) 主辅码流切换 辅助功能 屏

如何使用Ansible实现CI/CD流水线的自动化

如何使用Ansible实现CI/CD流水线的自动化 持续集成(CI)和持续交付(CD)是现代软件开发过程中的核心实践,它们帮助团队更快地交付高质量的软件。Ansible,作为一个强大的自动化工具,可以在CI/CD流水线中发挥关键作用。本文将详细介绍如何使用Ansible实现CI/CD流水线的自动化,包括设计流水线的结构、配置管理、自动化测试、部署、以及集成Ansible与CI/CD工具(如Jen

模版方法模式template method

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/template-method 超类中定义了一个算法的框架, 允许子类在不修改结构的情况下重写算法的特定步骤。 上层接口有默认实现的方法和子类需要自己实现的方法

【iOS】MVC模式

MVC模式 MVC模式MVC模式demo MVC模式 MVC模式全称为model(模型)view(视图)controller(控制器),他分为三个不同的层分别负责不同的职责。 View:该层用于存放视图,该层中我们可以对页面及控件进行布局。Model:模型一般都拥有很好的可复用性,在该层中,我们可以统一管理一些数据。Controlller:该层充当一个CPU的功能,即该应用程序

迭代器模式iterator

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/iterator 不暴露集合底层表现形式 (列表、 栈和树等) 的情况下遍历集合中所有的元素

9.8javaweb项目总结

1.主界面用户信息显示 登录成功后,将用户信息存储在记录在 localStorage中,然后进入界面之前通过js来渲染主界面 存储用户信息 将用户信息渲染在主界面上,并且头像设置跳转,到个人资料界面 这里数据库中还没有设置相关信息 2.模糊查找 检测输入框是否有变更,有的话调用方法,进行查找 发送检测请求,然后接收的时候设置最多显示四个类似的搜索结果