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相对来说更加智能,会根据用户的要求生成多种内容…...
前端的未来已然到来
随着整个软件行业正逐渐转向以打包、托管与抽象解决方案为主体的新形态,后端与基础设施带来的麻烦正越来越少,而立足堆栈顶部的前端工程师开始成为施展空间最大的时代宠儿。甚至不只是他们,如今无论是前端、后端还是运维开发者,他…...

蓝牙 BLE 扫描面试题大全(2):进阶面试题与实战演练
前文覆盖了 BLE 扫描的基础概念与经典问题蓝牙 BLE 扫描面试题大全(1):从基础到实战的深度解析-CSDN博客,但实际面试中,企业更关注候选人对复杂场景的应对能力(如多设备并发扫描、低功耗与高发现率的平衡)和前沿技术的…...

Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别
OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

自然语言处理——循环神经网络
自然语言处理——循环神经网络 循环神经网络应用到基于机器学习的自然语言处理任务序列到类别同步的序列到序列模式异步的序列到序列模式 参数学习和长程依赖问题基于门控的循环神经网络门控循环单元(GRU)长短期记忆神经网络(LSTM)…...
聊一聊接口测试的意义有哪些?
目录 一、隔离性 & 早期测试 二、保障系统集成质量 三、验证业务逻辑的核心层 四、提升测试效率与覆盖度 五、系统稳定性的守护者 六、驱动团队协作与契约管理 七、性能与扩展性的前置评估 八、持续交付的核心支撑 接口测试的意义可以从四个维度展开,首…...

Vue ③-生命周期 || 脚手架
生命周期 思考:什么时候可以发送初始化渲染请求?(越早越好) 什么时候可以开始操作dom?(至少dom得渲染出来) Vue生命周期: 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...

DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
小木的算法日记-多叉树的递归/层序遍历
🌲 从二叉树到森林:一文彻底搞懂多叉树遍历的艺术 🚀 引言 你好,未来的算法大神! 在数据结构的世界里,“树”无疑是最核心、最迷人的概念之一。我们中的大多数人都是从 二叉树 开始入门的,它…...

2025年- H71-Lc179--39.组合总和(回溯,组合)--Java版
1.题目描述 2.思路 当前的元素可以重复使用。 (1)确定回溯算法函数的参数和返回值(一般是void类型) (2)因为是用递归实现的,所以我们要确定终止条件 (3)单层搜索逻辑 二…...
ffmpeg(三):处理原始数据命令
FFmpeg 可以直接处理原始音频和视频数据(Raw PCM、YUV 等),常见场景包括: 将原始 YUV 图像编码为 H.264 视频将 PCM 音频编码为 AAC 或 MP3对原始音视频数据进行封装(如封装为 MP4、TS) 处理原始 YUV 视频…...