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

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、完成整个登录过程,成功视频如下

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

软件测试面试文档

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

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/37899.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

openEuler安装docker

在openEuler上安装Docker,可以通过以下步骤进行: 1、更新软件包索引: sudo yum makecache 2、安装Docker: sudo yum install docker -y 3、启动Docker服务: sudo systemctl start docker 4、设置Docker开机自启&am…

010、GPT-5:AI新纪元的曙光与挑战

目录 GPT-5:AI新纪元的曙光与挑战 1.革命性的个人助理 2.教育领域的变革 3.医疗健康的新篇章 4.科研创新的加速器 5.创意产业的新灵感 6.商业与经济的智能化 7.社会治理的新工具 8.环境保护与可持续发展 9.伦理与社会影响 学术视角:AI发展的前…

惠海H6392 2.6v升5V 3.7V升9V 4.2V升12V 升压恒压芯片 小家电IC

惠海H6392升压恒压芯片是一款小家电、移动设备以及其他需要升压恒压电源的电子设备设计的DC-DC转换器。这款芯片以其独特的产品特性和广泛的应用场景,为电子产品设计者提供了高效、稳定的电源解决方案。 产品描述: H6392采用了简单的电流模式升压技术&a…

使用Collections.shuffle打乱集合顺序

使用Collections.shuffle打乱集合顺序 大家好,我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编,也是冬天不穿秋裤,天冷也要风度的程序猿!今天我们将探讨如何使用Java中的Collections.shuffle方法来打乱集合的顺序…

单例模式实现方式

单例模式 单例模式(Singleton Pattern)的主要目的是确保一个类只有一个实例,并提供一个全局访问点来访问该实例。 在 Java 中,实现单例模式的方式有几种常见的方式 懒汉式 public class Singleton{private static final Singlet…

华为od-C卷200分题目4 -电脑病毒感染

华为od-C卷200分题目4 -电脑病毒感染 一个局域网内有很多台电脑,分别标注为0 - N-1的数字。相连接的电脑距离不一样,所以感染时间不一样,感染时间用t表示。其中网络内一个电脑被病毒感染,其感染网络内所有的电脑需要最少需要多长…

二叉树的题目

目录 1、将遍历的结果放在list中 2、判断两棵树是否相同 3、翻转二叉树 4、判断平衡二叉树 5、判断二叉树是否对称 6、判断是否为完全二叉树 先创建一个二叉树 public class BinaryTree {static class TreeNode {public char val;public TreeNode left;public TreeNode …

NextJs 系列文章

NextJs 系列文章 NextJs 初级篇 - 安装 | 路由 | 中间件NextJs 渲染篇 - 什么是CSR、SSR、SSG、ISR 和服务端/客户端组件NextJs 数据篇 - 数据获取 | 缓存 | Server Actions

使用Java实现通用树形结构转换工具类:深入解析TreeUtil和TreeNode接口

文章目录 一、TreeNode接口设计二、TreeUtil工具类设计三、示例:实现TreeNode接口的节点类四、示例:使用TreeUtil构建树形结构五、总结 🎉欢迎来到Java学习路线专栏~探索Java中的静态变量与实例变量 ☆* o(≧▽≦)o *☆嗨~我是IT陈寒&#x1…

基于vue脚手架创建的图书商城

功能简介 此项目包括首页, 搜索列表, 商品详情, 购物车, 订单, 支付, 用户登陆/注册等多个子模块,使用 Vue 全家 桶ES6WebpackAxios 等技术,采用模块化、组件化、工程化的模式开发。 功能模块图 2.1首页 2.2.搜索列表 2.3.商品详情 2.4.购物车 2.5.支…

条件测试,if语句,case语句

测试命令 格式1:test 条件表达式 格式2:[条件表达式] test命令和 [ ] 相同,建议使用[ ] #方框中要空格 #用test可能会不小心定义变量文件测试 常见的测试操作符含义-d检查文件是否存在且为目录-f检查文件是否存在且为常规文件-L测试…

解决json日期格式问题

解决json日期格式问题 1.json默认输出时间格式 RequestMapping("/json3") public String json3() throws JsonProcessingException {ObjectMapper mapper new ObjectMapper();//创建时间一个对象,java.util.DateDate date new Date();//将我们的对象解…

Knife4j:快速入门

1. 概述 Knife4j是一个用于生成和展示API文档的工具,同时它还提供了在线调试的功能,下图是其工作界面。 * Knife4j有多个版本,最新版的Knife4j基于开源项目springdoc-openapi,这个开源项目的核心功能就是根据SpringBoot项目中的代…

uniapp uniCloud云开发

uniCloud概述 uniCloud 是 DCloud 联合阿里云、腾讯云、支付宝云,为开发者提供的基于 serverless 模式和 js 编程的云开发平台。 uniCloud 的 web控制台地址:https://unicloud.dcloud.net.cn 文档:https://doc.dcloud.net.cn/uniCloud/ un…

大模型应用-多模态和大模型是如何相互成就的

前言 如果单纯的将大模型用来聊天,那就是low了。 而多模态赋予了大模型更多的现实价值,大模型则助力多模态变得更强大。 多模态 我们所处的是一个物理世界,不同事物之间模态多种多样,即便是简单的文本,按照语言&am…

【Docker0】网络更改

目录 1. 停止docker服务 2. 关闭docker默认桥接网络接口 3. 从系统删除docker0接口 4. 创建一个名为bridge0的新接口 5. 添加ip地址和子网掩码 6. 启用bridge0接口 7. (如果没起来就执行该句) 8. 查看ip 1. 停止docker服务 sudo service docker…

c++用什么软件编程?都有哪些?

c用什么软件编程?都有哪些? C 作为一种高效、面向对象的编程语言,广泛应用于软件开发、游戏开发、嵌入式系统等领域。那么在进行 C 编程时,我们通常会使用哪些软件呢?下面就来具体分析。 1. Visual Studio Visual Stu…

深入 SSH:解锁本地转发、远程转发和动态转发的潜力

文章目录 前言一、解锁内部服务:SSH 本地转发1.1 什么是 SSH 本地转发1.2 本地转发应用场景 二、打开外部访问大门:SSH 远程转发2.1 什么是 SSH 远程转发2.2 远程转发应用场景 三、动态转发:SSH 让你拥有自己的 VPN3.1 什么是 SSH 动态转发3.…

mysqldump全备份之后,如何只恢复一个库或者一个表

在实际工作中,一个MySQL实例中可能有多个database。而我们备份时,通常采用完全备份,将所有database都备份到一个文件中。 但是,偶尔会遇到只恢复一个database或者一个表的情况。怎么解决呢? 一、利用全备恢复一个库(database)的数据 案例:朋友在群里问, MySQL全库备份…

memory动态内存管理学习之weak_ptr

此头文件是动态内存管理库的一部分。std::weak_ptr 是一种智能指针,它持有对被 std::shared_ptr 管理的对象的非拥有性(“弱”)引用。在访问所引用的对象前必须先转换为 std::shared_ptr。std::weak_ptr 用来表达临时所有权的概念&#xff1a…