web自动化系列-使用普通模式编写测试用例以及存在问题(十六)

前面已经把selenium的主要操作介绍完毕 ,接下来我们通过编写几条测试用例感受下selenium的用法 。
1.用例需求
还是以登录为例 ,需要实现的测试用例为 :
- case1:输入正确的用户名和密码进行登录
- case2 : 输入正确的用户名和错误的密码登录
- case3 : 输入正确的用户名和空的密码进行登录
以上登录的操作步骤为 :
- 点击首页的’登录’按钮,进入登录页面
- 输入正确的用户名
- 输入错误的密码
- 输入验证码
- 点击登录按钮
- 获取提示信息,并验证其信息 。
2.具体代码
在这里我们使用uninttest编写以上的3条用例 。
import unittest
from selenium import webdriver
import timeclass TestLogin(unittest.TestCase):def setUp(self) -> None:self.driver = webdriver.Chrome()self.driver.get("http://localhost")def tearDown(self) -> None:self.driver.quit()# case1 : 正确的用户名和正确的密码登录def test_login_success(self):# 1) 定位登录self.driver.find_element_by_link_text("登录").click()time.sleep(3)# 2) 输入用户名self.driver.find_element_by_id("username").send_keys("13988888888")# 3) 输入密码self.driver.find_element_by_name("password").send_keys("123456")# 4) 输入验证码self.driver.find_element_by_name("verify_code").send_keys("8888")time.sleep(1)# 5) 点击登录self.driver.find_element_by_class_name("J-login-submit").click()time.sleep(5)account_text = self.driver.find_element_by_link_text("13988888888").textself.assertEqual('13988888888',account_text)# case2 : 正确的用户名和错误的密码登录def test_password_is_wrong(self):# 1) 定位登录self.driver.find_element_by_link_text("登录").click()time.sleep(3)# 2) 输入用户名self.driver.find_element_by_id("username").send_keys("13988888888")# 3) 输入密码self.driver.find_element_by_name("password").send_keys("1234567")# 4) 输入验证码self.driver.find_element_by_name("verify_code").send_keys("8888")time.sleep(1)# 5) 点击登录self.driver.find_element_by_class_name("J-login-submit").click()time.sleep(3)password_error_msg = self.driver.find_element_by_class_name("layui-layer-content").textself.assertEqual("密码错误!",password_error_msg)# case3 : 正确的用户名和空的密码登录def test_password_is_null(self):# 1) 定位登录self.driver.find_element_by_link_text("登录").click()time.sleep(3)# 2) 输入用户名self.driver.find_element_by_id("username").send_keys("13988888888")# 3) 输入密码self.driver.find_element_by_name("password").send_keys("")# 4) 输入验证码self.driver.find_element_by_name("verify_code").send_keys("8888")time.sleep(1)# 5) 点击登录self.driver.find_element_by_class_name("J-login-submit").click()time.sleep(3)password_error_msg = self.driver.find_element_by_class_name("layui-layer-content").textself.assertEqual("密码不能为空!", password_error_msg)
3.具体问题
仔细观察的你 ,会发现以上编写方式是存在一些问题的 ,具体包括 :
- 第一、代码步骤相同 ,只是数据不同 ,导致大量的冗余代码 ,一旦某一个步骤发生变化 ,就会导致全部的用例都跟着改变 。
- 第二、同一元素对象也是多次被引用 ,比如定位输入用户名有3条用例都用到了 ,但若这个元素的属性或者值变了 ,同样需要改3处。
- 第三、如果我将以上的操作封装为页面呢 ? 比如我把点击、输入框输入 、获取文本事件等都要开放给用户去编写 ,像编写Excel或者配置一样那样编写,又改如何解决呢 ?
那么 ,以上的三个问题又该如何解决呢 ?其实它们就是3个典型的问题 ,分别对应三个非常流行的技术 ,分别是 :
- 代码步骤相同,步骤不同的问题 ,可以通过数据驱动(数据参数化)来解决 。python自动化测试框架中如何实现数据参数化?使用parameterized包帮你搞定它。 - 知乎 (zhihu.com)
- 同一元素对象多次被引用 :可以通过po模型来解决
- 把selenium操作事件进行封装后开放给用户 ,可以通过关键字驱动来解决 。
其中数据参数化已经介绍 ,这里不在赘述 ,剩下的po模型和关键字驱动放在后面章节介绍 。
相关文章:
web自动化系列-使用普通模式编写测试用例以及存在问题(十六)
前面已经把selenium的主要操作介绍完毕 ,接下来我们通过编写几条测试用例感受下selenium的用法 。 1.用例需求 还是以登录为例 ,需要实现的测试用例为 : case1:输入正确的用户名和密码进行登录case2 : 输入正确的用户名和错误的…...
VSCode 配置 Qt 开发环境
文章目录 1. 环境说明2. 配置系统环境变量 1. 环境说明 操作系统:Windows 11VSCode版本:1.88.1CMake版本:3.27.7Qt6版本:6.7.0(MinGW 11.2.0 64-bit) 2. 配置系统环境变量 自行根据自己的Qt安装路径配置 配置 MinGW 和 CMake C…...
【Jenkins】持续集成与交付 (七):Gitlab添加组、创建用户、创建项目和源码上传到Gitlab仓库
🟣【Jenkins】持续集成与交付 (七):Gitlab添加组、创建用户、创建项目和源码上传到Gitlab仓库 1、创建组2、创建用户3、将用户添加到组中4、在用户组中创建项目5、源码上传到Gitlab仓库5.1 初始化版本控制5.2 将文件添加到暂存区5.3 提交代码到本地仓库5.4 推送代码到 Git…...
L1-017 到底有多二
一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336是个11位数,其中有3个2,并且是负数,也是偶数&…...
常用语音识别开源四大工具:Kaldi,PaddleSpeech,WeNet,EspNet
无论是基于成本效益还是社区支持,我都坚决认为开源才是推动一切应用的动力源泉。下面推荐语音识别开源工具:Kaldi,Paddle,WeNet,EspNet。 1、最成熟的Kaldi 一个广受欢迎的开源语音识别工具,由Daniel Pove…...
python笔记 | 哥德巴赫猜想
哥德巴赫猜想:每个不小于6的偶数都可以表示成两个素数之和。 素数:只能被1和自身整除的正整数。就是大于1且除了1和它本身之外没有其他因数的数。例如,2、3、5、7、11等都是素数,而4、6、8、9等则不是素数。 下面这段Python代码…...
IO基础-IO多路复用基础
Java的Selector封装了底层epoll和poll的API,可以通过指定如下参数来调用执行的内核调用, 在Linux平台,如果指定 -Djava.nio.channels.spi.SelectorProvidersun.nio.ch.PollSelectorProvider 则底层调用poll, -Djava.nio.channels.spi.Selec…...
Python机器学习项目开发实战:如何进行人脸识别
注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程: Python机器学习项目开发实战_人脸识别_编程案例解析实例详解课程教程.pdf 人脸识别是一个复杂但…...
管理能力学习笔记五:识别团队角色,因才施用
识别团队角色,因才施用,需要做到以下三点 扬长避短 管理者要学会问自己员工能把什么做好,而不是想方设法改造他们的短处 。 – 彼得德鲁克 人岗匹配 将合适的人放在合适的位置 人才多样化 团队需要各式各样的人才,才能高效配合…...
Real3DPortrait照片对口型,数字人,音频/视频驱动数字人
先看效果 上传一张图片和一段音频,照片如下: 合成后效果如下: 照片对口型-音频驱动 支持音频驱动和视频驱动,视频可以使照片有参照视频中的口型和和动作。 项目地址 https://github.com/yerfor/Real3DPortrait 我的环境 win…...
Stable Diffusion之Ubuntu下部署
1、安装conda环境 conda create -n webui python3.10.6 2、激活环境 每次使用都要激活 conda activate webui 注意开始位置的变换 关闭环境 conda deactivate webui 3、离线下载SD 代码 https://github.com/AUTOMATIC1111/stable-diffusion-webui https://github.com/Stabilit…...
LeetCode-15-三数之和问题
题目说明 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a b c 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 给定数组 nums [-1, 0,…...
springboot2集成东方通tongweb嵌入式版
由于最近项目需要国产化信创改造,引入东方通tongweb 联系东方通厂家 ,将依赖导入到maven仓库,并获取嵌入式版license文件修改pom.xml,引入依赖,注意springboot版本,这里以springboot2举例 首先移除springb…...
【二分查找】Leetcode 33. 搜索旋转排序数组【中等】
搜索旋转排序数组 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], num…...
Zephyr Windows开发环境搭建
Zephyr 如果有错误或未及时更新,请以官网文档为主 官网:https://docs.zephyrproject.org/latest/develop/getting_started/index.htm 下载安装 Chocolatey 这是一个类似于在Linux系统下 yum 和 apt 那样的包管理器 官网:https://chocolat…...
如何安全地设置MySQL数据库的IP白名单
设置MySQL数据库的IP白名单是一种关键的安全措施,可以确保只有来自特定IP地址的请求被允许访问数据库服务器。这里是如何安全地配置这些设置的分步指南。 步骤1: 登录到MySQL服务器 首先,使用管理员权限登录到你的MySQL服务器。如果你使用的是命令行&a…...
Chatgpt掘金之旅—有爱AI商业实战篇|品牌故事业务|(十六)
演示站点: https://ai.uaai.cn 对话模块 官方论坛: www.jingyuai.com 京娱AI 一、AI技术创业在品牌故事业务有哪些机会? 人工智能(AI)技术作为当今科技创新的前沿领域,为创业者提供了广阔的机会和挑战。随…...
为什么要部署IP SSL证书?怎么申请?
我们需要知道什么是IP SSL证书。SSL,全称为Secure Sockets Layer,即安全套接层,是为网络通信提供安全及数据完整性的一种安全协议。而IP SSL证书就是基于SSL协议的一种证书,它能够为网站和用户的数据传输提供加密处理,…...
最新免费 ChatGPT、GPTs、AI换脸(Suno-AI音乐生成大模型)
🔥博客主页:只恨天高 ❤️感谢大家点赞👍收藏⭐评论✍️ ChatGPT3.5、GPT4.0、GPTs、AI绘画相信对大家应该不感到陌生吧?简单来说,GPT-4技术比之前的GPT-3.5相对来说更加智能,会根据用户的要求生成多种内容…...
前端的未来已然到来
随着整个软件行业正逐渐转向以打包、托管与抽象解决方案为主体的新形态,后端与基础设施带来的麻烦正越来越少,而立足堆栈顶部的前端工程师开始成为施展空间最大的时代宠儿。甚至不只是他们,如今无论是前端、后端还是运维开发者,他…...
浅谈 React Hooks
React Hooks 是 React 16.8 引入的一组 API,用于在函数组件中使用 state 和其他 React 特性(例如生命周期方法、context 等)。Hooks 通过简洁的函数接口,解决了状态与 UI 的高度解耦,通过函数式编程范式实现更灵活 Rea…...
Python爬虫实战:研究MechanicalSoup库相关技术
一、MechanicalSoup 库概述 1.1 库简介 MechanicalSoup 是一个 Python 库,专为自动化交互网站而设计。它结合了 requests 的 HTTP 请求能力和 BeautifulSoup 的 HTML 解析能力,提供了直观的 API,让我们可以像人类用户一样浏览网页、填写表单和提交请求。 1.2 主要功能特点…...
前端导出带有合并单元格的列表
// 导出async function exportExcel(fileName "共识调整.xlsx") {// 所有数据const exportData await getAllMainData();// 表头内容let fitstTitleList [];const secondTitleList [];allColumns.value.forEach(column > {if (!column.children) {fitstTitleL…...
使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台
🎯 使用 Streamlit 构建支持主流大模型与 Ollama 的轻量级统一平台 📌 项目背景 随着大语言模型(LLM)的广泛应用,开发者常面临多个挑战: 各大模型(OpenAI、Claude、Gemini、Ollama)接口风格不统一;缺乏一个统一平台进行模型调用与测试;本地模型 Ollama 的集成与前…...
OPENCV形态学基础之二腐蚀
一.腐蚀的原理 (图1) 数学表达式:dst(x,y) erode(src(x,y)) min(x,y)src(xx,yy) 腐蚀也是图像形态学的基本功能之一,腐蚀跟膨胀属于反向操作,膨胀是把图像图像变大,而腐蚀就是把图像变小。腐蚀后的图像变小变暗淡。 腐蚀…...
【Nginx】使用 Nginx+Lua 实现基于 IP 的访问频率限制
使用 NginxLua 实现基于 IP 的访问频率限制 在高并发场景下,限制某个 IP 的访问频率是非常重要的,可以有效防止恶意攻击或错误配置导致的服务宕机。以下是一个详细的实现方案,使用 Nginx 和 Lua 脚本结合 Redis 来实现基于 IP 的访问频率限制…...
PostgreSQL——环境搭建
一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在࿰…...
spring Security对RBAC及其ABAC的支持使用
RBAC (基于角色的访问控制) RBAC (Role-Based Access Control) 是 Spring Security 中最常用的权限模型,它将权限分配给角色,再将角色分配给用户。 RBAC 核心实现 1. 数据库设计 users roles permissions ------- ------…...
Pydantic + Function Calling的结合
1、Pydantic Pydantic 是一个 Python 库,用于数据验证和设置管理,通过 Python 类型注解强制执行数据类型。它广泛用于 API 开发(如 FastAPI)、配置管理和数据解析,核心功能包括: 数据验证:通过…...
鸿蒙HarmonyOS 5军旗小游戏实现指南
1. 项目概述 本军旗小游戏基于鸿蒙HarmonyOS 5开发,采用DevEco Studio实现,包含完整的游戏逻辑和UI界面。 2. 项目结构 /src/main/java/com/example/militarychess/├── MainAbilitySlice.java // 主界面├── GameView.java // 游戏核…...
