当前位置: 首页 > news >正文

商城自动化测试实战 —— 登录+滑块验证

hello大家好,我是你们的小编!

本商城测试项目采取PO模型和数据分离式架构,采用pytest+selenium+jenkins结合的方式进行脚本编写与运行,项目架构如下:

图片

1、创建项目名称:code_shopping,创建所需项目文件

图片

2、在tools层中建立 get_log.py文件,复制以下代码

     此为项目日志工具,使用时直接调用即可

import logging.handlers
from conftest import BASE_PATH
import os# 新建类
class GetLog:# 新建一个日志变量__logger = None# 新建获取日志的方法@classmethoddef get_logger(cls):# 判断日志器为空if cls.__logger is None:# 获取日志器cls.__logger = logging.getLogger()# 修改默认的级别cls.__logger.setLevel(logging.INFO)log_path = BASE_PATH + os.sep + "result" + os.sep+"log" + os.sep + "AT.log"# 获取处理器th = logging.handlers.TimedRotatingFileHandler(filename=log_path,when="midnight",interval=1,backupCount=3,encoding="utf-8")# 获取格式器fmt = "%(asctime)s%(levelname)s[%(filename)s(%(funcName)s:%(lineno)d)]-%(message)s"fm = logging.Formatter(fmt)# 将格式器添加到处理器中th.setFormatter(fm)# 将处理器添加到日志器中cls.__logger.addHandler(th)# 返回日志器return cls.__loggerif __name__ == '__main__':log = GetLog.get_logger()log.info("1111")log.error("22222")

3、在scripts中建立 sh_login文件夹和 test_login.py文件

     开始编写商城登录页面代码

图片

4、在test_login.py中编写脚本

     商城登录页面包含:帐号+密码+滑动验证码的混合验证模式

     4.1首先将验证码的2张图片下载到本地(注意填写等待图片加载时间),通过商城HTML页面发现图片经过base64加密,需解码保存本地

图片

# 获取图片的地址
# sleep(3)
img = driver.find_element(By.XPATH, ('//*[@id="app"]/div/div[2]/div[3]/div[1]/img[1]'))
img2 = driver.find_element(By.XPATH, ('//*[@id="app"]/div/div[2]/div[3]/div[1]/img[2]'))s = img.get_attribute("src")
s2 = img2.get_attribute("src")
# print(type(s))
# print(s)
# 使用split()函数将字符串拆分成多个数字
numbers = s.split(",")
numbers2 = s2.split(",")
# print(numbers)
# print(type(numbers))
# 获取图片的base64加密数据
djd = numbers[1]
djd2 = numbers2[1]
# 输出提取出的数字
# print(djd)
# base64解码
lk = base64.b64decode(djd)
lk2 = base64.b64decode(djd2)
# 获取图片到本地
pic = open("re.png", "wb")
pic2 = open("can.png", "wb")
pic.write(lk)
pic2.write(lk2)
pic.close()
pic2.close()

4.2 对图像进行处理,计算出滑块的拖动距离(此方法单独写在test001.py文件,方便调用)

import cv2# 对图像处理
def handel_img(img):imgGray = cv2.cvtColor(img, cv2.COLOR_RGBA2GRAY)  # 转灰度图imgBlur = cv2.GaussianBlur(imgGray, (5, 5), 1)  # 高斯模糊imgCanny = cv2.Canny(imgBlur, 60, 60)  # Canny算子边缘检测return imgCanny# 读取图像
def match(img_jpg_path, img_png_path):# 读取图像img_jpg = cv2.imread(img_jpg_path, cv2.IMREAD_UNCHANGED)img_png = cv2.imread(img_png_path, cv2.IMREAD_UNCHANGED)img = handel_img(img_jpg)small_img = handel_img(img_png)res_TM_CCOEFF_NORMED = cv2.matchTemplate(img, small_img, 3)value = cv2.minMaxLoc(res_TM_CCOEFF_NORMED)value = value[3][0]  # 获取到移动距离return valueif __name__ == '__main__':dd = match('./re.png', './can.png')print(dd)

4.3 最后模拟鼠标点击拖动滑块动作,完成验证

# 计算要滑动的距离
dd = match('./re.png', './can.png')
print(dd)
sleep(2)
# 拖动滑块
# 找到拖动元素
slider = driver.find_element(By.XPATH, ('//*[@id="app"]/div/div[2]/div[3]/div[2]/span[2]'))
# 按住按钮
ActionChains(driver).click_and_hold(slider).perform()
sleep(1)
# 滑动距离对应距离
ActionChains(driver).move_by_offset(xoffset=dd, yoffset=0).perform()
sleep(3)
# 放开鼠标
ActionChains(driver).release().perform()

4.4 完成输入,验证,登录进入系统,判断是否登录成功

# 判断是否登录成功
getshu = driver.find_element(By.XPATH, ('//*[@id="app"]/div/div[3]/div/ul[1]/ul/li[1]')).text
# print(getshu)
if getshu == "Hi,欢迎来到lilishop":print("登录成功")
else:print("登录失败")

5、完整代码如下

from selenium import webdriver
from time import sleep
from selenium.webdriver.common.by import By
import base64
from scripts.sh_login.test001 import match
from selenium.webdriver import ActionChains# 启动浏览器驱动
driver = webdriver.Chrome()
# 最大化
driver.maximize_window()
# 输入商城地址
driver.get("https://pc-b2b2c.pickmall.cn/login")
sleep(1)
# 输入用户名和密码
driver.find_element(By.CSS_SELECTOR, ("[placeholder='用户名']")).send_keys("ceshi")
sleep(1)
driver.find_element(By.CSS_SELECTOR, ("[placeholder='密码']")).send_keys("123456")
sleep(1)
# 点击登录按钮
driver.find_element(By.XPATH, ('//*[@id="app"]/div/div[2]/div[2]/div[3]/div[1]/form[1]/div[3]/div/button')).click()sleep(2)
# 滑动滑块
# 获取图片的地址
# sleep(3)
img = driver.find_element(By.XPATH, ('//*[@id="app"]/div/div[2]/div[3]/div[1]/img[1]'))
img2 = driver.find_element(By.XPATH, ('//*[@id="app"]/div/div[2]/div[3]/div[1]/img[2]'))s = img.get_attribute("src")
s2 = img2.get_attribute("src")
# print(type(s))
# print(s)
# 使用split()函数将字符串拆分成多个数字
numbers = s.split(",")
numbers2 = s2.split(",")
# print(numbers)
# print(type(numbers))
# 获取图片的base64加密数据
djd = numbers[1]
djd2 = numbers2[1]
# 输出提取出的数字
# print(djd)
# base64解码
lk = base64.b64decode(djd)
lk2 = base64.b64decode(djd2)
# 获取图片到本地
pic = open("re.png", "wb")
pic2 = open("can.png", "wb")
pic.write(lk)
pic2.write(lk2)
pic.close()
pic2.close()# 计算要滑动的距离
dd = match('./re.png', './can.png')
print(dd)
sleep(2)
# 拖动滑块
# 找到拖动元素
slider = driver.find_element(By.XPATH, ('//*[@id="app"]/div/div[2]/div[3]/div[2]/span[2]'))
# 按住按钮
ActionChains(driver).click_and_hold(slider).perform()
sleep(1)
# 滑动距离对应距离
ActionChains(driver).move_by_offset(xoffset=dd, yoffset=0).perform()
sleep(3)
# 放开鼠标
ActionChains(driver).release().perform()
sleep(5)
# 判断是否登录成功
getshu = driver.find_element(By.XPATH, ('//*[@id="app"]/div/div[3]/div/ul[1]/ul/li[1]')).text
# print(getshu)
if getshu == "Hi,欢迎来到lilishop":print("登录成功")
else:print("登录失败")
# 关闭浏览器
driver.quit()

6、完成整个登录过程,成功视频如下

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走! 

软件测试面试文档

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

在这里插入图片描述

相关文章:

商城自动化测试实战 —— 登录+滑块验证

hello大家好,我是你们的小编! 本商城测试项目采取PO模型和数据分离式架构,采用pytestseleniumjenkins结合的方式进行脚本编写与运行,项目架构如下: 1、创建项目名称:code_shopping,创建所需项目…...

8.计算机视觉—增广和迁移

目录 1.数据增广数据增强数据增强的操作代码实现2.微调 迁移学习 Transfer learning(重要的技术)网络结构微调:当目标数据集比源数据集小得多时,微调有助于提高模型的泛化能力。训练固定一些层总结代码实现1.数据增广 CES上的真实故事 有一家做智能售货机的公司,发现他们…...

【Matlab】-- BP反向传播算法

文章目录 文章目录 00 写在前面01 BP算法介绍02 基于Matlab的BP算法03 代码解释 00 写在前面 BP算法可以结合鲸鱼算法、飞蛾扑火算法、粒子群算法、灰狼算法、蝙蝠算法等等各种优化算法一起,进行回归预测或者分类预测。 01 BP算法介绍 BP(Backpropag…...

【Python】 数据分析中的常见统计量:众数

那年夏天我和你躲在 这一大片宁静的海 直到后来我们都还在 对这个世界充满期待 今年冬天你已经不在 我的心空出了一块 很高兴遇见你 让我终究明白 回忆比真实精彩 🎵 王心凌《那年夏天宁静的海》 众数(Mode)是统计学中另…...

Karabiner-Elements 设置mac键盘

软件下载地址: Karabiner-Elements 修改键盘位置,但是重启后,就消失了。 {"description": "New Rule (change left_shiftcaps_lock to page_down, right_shiftcaps_lock to left_commandmission_control)","manip…...

Mybatis实现流程

一&#xff0c;UserDAO 接口定义 首先&#xff0c;定义 UserDAO接口&#xff0c;包含 getList()方法,定义类型为List<User>&#xff1a; package dao;import model.User; import java.util.List;public interface UserDAO {List<User> getList(); }二&#xff0c…...

简单的springboot整合activiti5-serviceImpl部分(1)

简单的springboot整合activiti5.22.0-serviceImpl部分(1) 原来的流程serviceImpl部分代码过多&#xff0c;所以此处单独记录一下&#xff0c;此处记录的是serviceImpl第一部分代码 package cn.git.workflow.service.impl;import cn.git.cache.api.BaseCacheApi; import cn.gi…...

snat、dnat和firewalld

目录 概述 SNAT源地址转换 DANT目的地址转换 抓包 firewalld 端口管理 概述 snat &#xff1a;源地址转换 内网——外网 内网ip转换成可以访问外网的ip 也就是内网的多个主机可以只有一个有效的公网ip地址访问外部网络 DNAT&#xff1a;目的地址转发 外部用户&#…...

[数据集][目标检测]鸡蛋缺陷检测数据集VOC+YOLO格式2918张2类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;2918 标注数量(xml文件个数)&#xff1a;2918 标注数量(txt文件个数)&#xff1a;2918 标注…...

前后端防重复提交

数据重复提交是一个大忌&#xff0c;会带来无效数据&#xff0c;应该在前端和后端都建议检测防范。 前端一般是按钮按下触发数据提交&#xff0c;如果用户鼠标操作习惯不好&#xff0c;或者鼠标或系统设置问题会导致鼠标连击&#xff0c;如果前端不做相关处理&#xff0c;可能会…...

JVM专题八:JVM如何判断可回收对象

在JVM专题七&#xff1a;JVM垃圾回收机制中提到JVM的垃圾回收机制是一个自动化的后台进程&#xff0c;它通过周期性地检查和回收不可达的对象&#xff08;垃圾&#xff09;&#xff0c;帮助管理内存资源&#xff0c;确保应用程序的高效运行。今天就让我们来看看JVM到底是怎么定…...

binary_cross_entropy_with_logits函数的参数设定

binary_cross_entropy_with_logits 该函数参数&#xff1a; logits (Tensor) - 输入预测值。其数据类型为float16或float32。 label (Tensor) - 输入目标值&#xff0c;shape与 logits 相同。数据类型为float16或float32。 weight (Tensor&#xff0c;可选) - 指定每个批次二…...

Python 面试【★★★★★】

欢迎莅临我的博客 &#x1f49d;&#x1f49d;&#x1f49d;&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…...

C# StringBuilder

以下是一些基本的 StringBuilder 使用方法&#xff1a;创建 StringBuilder 实例&#xff1a;追加字符串&#xff1a;插入字符串&#xff1a;删除字符串&#xff1a;替换字符串&#xff1a;清空 StringBuilder&#xff1a;转换 StringBuilder 为字符串&#xff1a;使用容量&…...

4个文章生成器免费版分享,让文章创作更轻松便捷

在当今这个信息飞速传播的时代&#xff0c;文章创作的重要性愈发凸显。无论是从事内容创作的专业人士&#xff0c;还是偶尔需要撰写文章的普通大众&#xff0c;都希望能更高效地完成文章创作任务。而在实际操作中&#xff0c;我们常常会遇到思路卡顿、没有创作灵感的问题。今天…...

redis-cluster(集群模式搭建)

redis中间件版本: redis-5.0.5环境介绍 这里使用服务器数量3&#xff0c;分别为172.0.0.1&#xff0c;172.0.0.2&#xff0c;172.0.0.3&#xff0c;每台机器redis节点数量2个&#xff0c;共6个redis节点构成redis-cluster模式。编译安装包 在172.0.0.1的机器上进入安装目录 cd …...

使用vite官网和vue3官网分别都可以创建vue3项目

问: npm init vitelatest 和 npm create vuelatest创建的vue3项目有什么区别? 回答: npm init vitelatest 和 npm create vuelatest 分别是使用 Vite 和 Vue CLI 工具创建 Vue 项目的两种方式&#xff0c;它们之间有几个主要区别&#xff1a; 1. **构建工具&#xff1a;** …...

PDF处理篇:如何调整 PDF 图像的大小

将视觉效果无缝集成到 PDF 中的能力使它们成为强大的通信工具。然而&#xff0c;笨拙的图像大小会迅速扰乱文档的流程&#xff0c;阻碍清晰度和专业性。幸运的是&#xff0c;GeekerPDF 和Adobe Acrobat等流行的应用程序提供了用户友好的解决方案来应对这一挑战。这个全面的指南…...

STM32 HAL库里 串口中断回调函数是在怎么被调用的?

跟着正点原子学习的HAL库写串口接收程序的时候一直有困惑&#xff0c;使用HAL_UART_Receive_IT开启接收中断后&#xff0c;为啥处理函数要写在HAL_UART_RxCpltCallback里&#xff0c;中断发生的时候是怎么到这个回调函数里去的&#xff1f; void MX_USART1_UART_Init(void) {h…...

音视频入门基础:H.264专题(5)——FFmpeg源码中 解析NALU Header的函数分析

音视频入门基础&#xff1a;H.264专题系列文章&#xff1a; 音视频入门基础&#xff1a;H.264专题&#xff08;1&#xff09;——H.264官方文档下载 音视频入门基础&#xff1a;H.264专题&#xff08;2&#xff09;——使用FFmpeg命令生成H.264裸流文件 音视频入门基础&…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具&#xff0c;相比原生 Python 生态&#xff08;如 pip 虚拟环境&#xff09;有许多独特优势&#xff0c;尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处&#xff1a; 一、一站式环境管理&#xff1a…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql

智慧工地管理云平台系统&#xff0c;智慧工地全套源码&#xff0c;java版智慧工地源码&#xff0c;支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求&#xff0c;提供“平台网络终端”的整体解决方案&#xff0c;提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

相机从app启动流程

一、流程框架图 二、具体流程分析 1、得到cameralist和对应的静态信息 目录如下: 重点代码分析: 启动相机前,先要通过getCameraIdList获取camera的个数以及id,然后可以通过getCameraCharacteristics获取对应id camera的capabilities(静态信息)进行一些openCamera前的…...

数据库分批入库

今天在工作中&#xff0c;遇到一个问题&#xff0c;就是分批查询的时候&#xff0c;由于批次过大导致出现了一些问题&#xff0c;一下是问题描述和解决方案&#xff1a; 示例&#xff1a; // 假设已有数据列表 dataList 和 PreparedStatement pstmt int batchSize 1000; // …...

精益数据分析(97/126):邮件营销与用户参与度的关键指标优化指南

精益数据分析&#xff08;97/126&#xff09;&#xff1a;邮件营销与用户参与度的关键指标优化指南 在数字化营销时代&#xff0c;邮件列表效度、用户参与度和网站性能等指标往往决定着创业公司的增长成败。今天&#xff0c;我们将深入解析邮件打开率、网站可用性、页面参与时…...

Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?

在大数据处理领域&#xff0c;Hive 作为 Hadoop 生态中重要的数据仓库工具&#xff0c;其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式&#xff0c;很多开发者常常陷入选择困境。本文将从底…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

MySQL 知识小结(一)

一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库&#xff0c;分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷&#xff0c;但是文件存放起来数据比较冗余&#xff0c;用二进制能够更好管理咱们M…...