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
# 新建获取日志的方法
@classmethod
def 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.__logger
if __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 value
if __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、完成整个登录过程,成功视频如下
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。