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

web自动化(六)unittest 四大组件实战(京东登录搜索加入购物车)

Unittest框架

Unittest框架:框架=测试模块+测试管理模块+测试统计模块,python的内置模块
import unittest
Unittest框架四大组件:
1、TestCase 测试用例
2.TestFixture 测试用例夹具 测试用例需要执行的前置和后置
3.TestSuite 测试套件 把需要执行的测试用例汇总在一起
4、TestRunner 测试运行 执行测试用例

Test Case 测试用例


规则:

1、用例类必须继承Unittest.TestCase,并且以test开头
2、测试方法,都必须以test_开头
3、用例执行的顺序按照ASCII
0.9 a-z A-Z 顺序来执行用例
unittest也可以通过会令运行
命令执行TestShopnc类下的所有用例:python -m unittest 用例文件名.用例类名

执行某一条用例:python -m unittest 用例文件名.用例类.用例名称

import time
import  unittest
from selenium import  webdriver
from selenium.webdriver.support.wait import  WebDriverWait
from selenium.webdriver.common.by import  By
from selenium.webdriver.support import  expected_conditions as EC
class TestShopnc(unittest.TestCase):#每个用例前执行 有多少用例就执行多少次def setUp(self) -> None:print("01 每个用例前执行 有多少用例就执行多少次")#每个类之前执行 只执行一次@classmethoddef setUpClass(cls) :print("02 每个类之前执行 只执行一次")#每个用例执行之后执行 有多少用例就执行多少次def tearDown(self) -> None:print("03 每个用例执行之后执行 有多少用例就执行多少次")@classmethod#每个类之后执行 只执行一次def tearDownClass(cls) -> None:print("04 每个类之后执行 只执行一次")def test_01_login(self):print("用例1")def test_02_shopping(self):print("用例2")def test_03_add_cart(self):print("用例3")def test_04_payment(self):print("用例4")if __name__ == '__main__':i=10print(i)suite=unittest.TestSuite()#添加一个测试用例suite.addTest(TestShopnc(methodName='test_01_login'))#添加多个suite.addTests([TestShopnc("test_02_shopping"),TestShopnc("test_04_payment")])unittest.main(defaultTest="suite")#用例加载器suite2 = unittest.TestSuite()case2=unittest.TestLoader().loadTestsFromTestCase(TestShopnc)suite2.addTests(case2)unittest.TextTestRunner().run(suite2)suite3 = unittest.TestSuite()#查找test开始的py文件case3= unittest.defaultTestLoader.discover("test*.py")suite3.addTests(case3)unittest.main(defaultTest="suite3")

问题:如果使用了TestSuite 运行py 文件时还是执行了所有测试用例
解决方案:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
注意:不用在文件中点击,运行,这种方式执行还是会执行所有测试用例 原因:没有执行if name == ‘main’: 中的代码

用例状态:
. 成功
E 用例异常
F 用例执行失败

登录京东&搜索商品&加入购物车
登录 需要滑块验证 采取手动方式

import time
import  unittest
from selenium import  webdriver
from selenium.webdriver.support.wait import  WebDriverWait
from selenium.webdriver.common.by import  By
from selenium.webdriver.support import  expected_conditions as EC
from DrissionPage import  WebPage
from  DrissionPage.common import By as DBylogin_name = "账户"
pwd = "密码"
js_txt='''var list=$('.p-o-btn.addcart').filter(function(index, element) {return $(this).attr('class').indexOf('disabled')==-1});if(list.length>0){list[0].click();}'''
class TestShopnc(unittest.TestCase):#每个用例前执行 有多少用例就执行多少次def setUp(self) -> None:print("01 每个用例前执行 有多少用例就执行多少次")#每个类之前执行 只执行一次@classmethoddef setUpClass(cls) :cls.web_driver=webdriver.Firefox()cls.web_page=WebPage("d")print("02 每个类之前执行 只执行一次")#每个用例执行之后执行 有多少用例就执行多少次def tearDown(self) -> None:print("03 每个用例执行之后执行 有多少用例就执行多少次")@classmethod#每个类之后执行 只执行一次def tearDownClass(cls):cls.web_driver.quit()cls.web_page.quit()print("04 每个类之后执行 只执行一次")# selenuim demo 开始def test_01_login(self):url="https://passport.jd.com/new/login.aspx"self.web_driver.get("https://passport.jd.com/new/login.aspx")el=(By.ID,"loginname")WebDriverWait(self.web_driver,10).until(EC.presence_of_element_located(el))self.web_driver.find_element(*el).send_keys(login_name)el = (By.ID, "nloginpwd")WebDriverWait(self.web_driver, 10).until(EC.presence_of_element_located(el))self.web_driver.find_element(*el).send_keys(pwd)el = (By.ID, "loginsubmit")WebDriverWait(self.web_driver, 10).until(EC.presence_of_element_located(el))self.web_driver.find_element(*el).click()# 需要滑块验证,采取手动time.sleep(15)print(self.web_driver.current_url)if 'https://aq.jd.com/certified/index' in self.web_driver.current_url:time.sleep(3)#验证按钮self.web_driver.execute_script('$(".btn-def.btn-xl.mb20").click()')time.sleep(3)#发送短信按钮self.web_driver.execute_script('$(".btn-def.btn-msg.btn-l").click()')time.sleep(10)#提交验证self.web_driver.execute_script('$(".btn-primary.btn-m").click()')time.sleep(30)def test_02_shopping(self):#keyif 'https://www.jd.com'  not in self.web_driver.current_url:self.web_driver.get("https://www.jd.com")el=(By.ID,"key")WebDriverWait(self.web_driver, 10).until(EC.presence_of_element_located(el))self.web_driver.find_element(*el).send_keys("三只松鼠大礼包")time.sleep(5)#//*[@id="search"]/div/div[2]/buttonel = (By.XPATH, '//*[@id="search"]/div/div[2]/button')WebDriverWait(self.web_driver, 10).until(EC.presence_of_element_located(el))self.web_driver.find_element(*el).click()time.sleep(5)def test_03_add_cart(self):time.sleep(5)self.web_driver.execute_script(js_txt)# el=(By.XPATH,'/html/body/div[5]/div[2]/div[2]/div[1]/div/div[2]/ul/li[5]/div/div[7]/a[3]')# WebDriverWait(self.web_driver, 10).until(EC.presence_of_element_located(el))# self.web_driver.find_element(*el).click()time.sleep(20)#selenuim demo 结束#drissionpage demo 开始def test_04_login(self):self.web_page.get("https://passport.jd.com/new/login.aspx")el=(DBy.ID,"loginname")self.web_page.wait.eles_loaded(el)self.web_page.ele(el).clear()print("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1")self.web_page.ele(el).input(login_name)print("2222222222222222222222222222222222")el = (DBy.ID, "nloginpwd")self.web_page.wait.eles_loaded(el)self.web_page.ele(el).input(pwd)el = (DBy.ID, "loginsubmit")self.web_page.wait.eles_loaded(el)self.web_page.ele(el).click()# 需要滑块验证,采取手动time.sleep(15)print(self.web_page.url)if 'https://aq.jd.com/certified/index' in self.web_page.url:time.sleep(3)#验证按钮self.web_page.run_js('$(".btn-def.btn-xl.mb20").click()')time.sleep(3)#发送短信按钮self.web_page.run_js('$(".btn-def.btn-msg.btn-l").click()')time.sleep(10)#提交验证self.web_page.run_js('$(".btn-primary.btn-m").click()')time.sleep(30)def test_05_shopping(self):#keyif 'https://www.jd.com'  not in self.web_page.url:self.web_page.get("https://www.jd.com")el=(DBy.ID,"key")self.web_page.wait.eles_loaded(el)self.web_page.ele(el).input("麻辣王子")time.sleep(5)el = (DBy.XPATH, '//*[@id="search"]/div/div[2]/button')self.web_page.wait.eles_loaded(el)self.web_page.ele(el).click()time.sleep(5)def test_06_add_cart(self):time.sleep(5)self.web_page.run_js(js_txt)time.sleep(10)#drissionpage demo 结束

相关文章:

web自动化(六)unittest 四大组件实战(京东登录搜索加入购物车)

Unittest框架 Unittest框架:框架测试模块测试管理模块测试统计模块,python的内置模块 import unittest Unittest框架四大组件: 1、TestCase 测试用例 2.TestFixture 测试用例夹具 测试用例需要执行的前置和后置 3.TestSuite 测试套件 把需要执行的测试用例汇总在一…...

鸿蒙语言基础类库:【@ohos.process (获取进程相关的信息)】

获取进程相关的信息 说明: 本模块首批接口从API version 7开始支持。后续版本的新增接口,采用上角标单独标记接口的起始版本。开发前请熟悉鸿蒙开发指导文档:gitee.com/li-shizhen-skin/harmony-os/blob/master/README.md点击或者复制转到。…...

华为笔试题

文章目录 1、数的分解2、字符串判断子串 1、数的分解 给定一个正整数n,如果能够分解为m(m > 1)个连续正整数之和, 请输出所有分解中,m最小的分解。 如果给定整数无法分解为连续正整数,则输出字符串"N"。 输入描述&a…...

【MySQL基础篇】函数及约束

1、函数 函数是指一段可以直接被另一段程序程序调用的程序或代码。 函数 - 字符串函数 MySQL中内置了很多字符串函数,常用的几个如下: 函数功能CONCAT(S1,S2,...,Sn)字符串拼接,将S1,S2,...,Sn拼接成一个字符串LOWER(str)将字符串str全部…...

YOLOv9报错:AttributeError: ‘list‘ object has no attribute ‘view‘

报错信息如下: red_distri, pred_scores torch.cat([xi.view(feats[0].shape[0], self.no, -1) for xi in feats], 2).split( AttributeError: ‘list’ object has no attribute ‘view’ 解决方法: 去yolov9/utils/loss_tal.py把167行代码更改&#…...

Bert入门-使用BERT(transformers库)对推特灾难文本二分类

Kaggle入门竞赛-对推特灾难文本二分类 这个是二月份学习的,最近整理资料所以上传到博客备份一下 数据在这里:https://www.kaggle.com/competitions/nlp-getting-started/data github(jupyter notebook):https://gith…...

【DFS(深度优先搜索)详解】看这一篇就够啦

【DFS详解】看这一篇就够啦 🍃1. 算法思想🍃2. 三种枚举方式🍃2.1 指数型枚举🍃2.2 排列型枚举🍃2.3 组合型枚举 🍃3. 剪枝优化🍃4. 图的搜索🍃5. 来几道题试试手🍃5.1 选…...

java-spring boot光速入门教程(超详细!!)

目录 一、引言 1.1 初始化配置 1.2 整合第三方框架 1.3 后期维护 1.4 部署工程 1.5 敏捷式开发 二、SpringBoot介绍 spring boot 2.1 搭建一个spring boot工程 2.2 使用idea创建项目 2.3 在线创建姿势 2.4 项目的目录结构 2.5 项目的运行方式 2.6 yml文件格式 2…...

一、Prometheus和Grafana搭建

一、服务端Prometheus二进制安装 https://prometheus.io/下载过慢可使用迅雷下载 tar -zxvf prometheus-2.53.0.linux-amd64.tar.gz启动 ./prometheus --config.fileprometheus.yml将其配置为系统服务: vim /usr/lib/systemd/system/prometheus.service[Unit] D…...

从零开始的python学习生活

pycharm部分好用快捷键 变量名的定义 与之前学习过的语言有所不同的是,python中变量名的定义更加的简洁 such as 整形。浮点型和字符串的定义 money50 haha13.14 gaga"hello"字符串的定义依然是需要加上引号,也不需要写;了 字符…...

MSP学习

一、迁移资源调研 完成导入,类似完成选型分析 离线工具调研 账单 二、迁移计划 1、 ecs 确认开始构建迁移环境后,平台将锁定当前标记的迁移资源范围及源端、目标端资源配置信息,并以此为迁移环境构建及迁移实施的数据依据 目标账号…...

生产力工具|Endnote X9如何自动更新文件信息

一、以EndNote X9.2版本为例,打开EndNote文献管理软件。 二、在菜单栏找到“Edit→Preferences...”,点击打开,弹出一个“EndNote Preferences”窗口。 三、进行设置 在打开的窗口左侧选择“PDF Handing”,右边会出现自动导入文献…...

【python】字典、列表、集合综合练习

1、练习1(字典) 字典dic,dic {‘k1’:‘v1’, ‘k2’: ‘v2’, ‘k3’: [11,22,33]} (1). 请循环输出所有的key dic {"k1": "v1", "k2": "v2", "k3": [11, 22, 33]} for k in dic.keys():print(k)k1 k2 k3(2). 请循环输…...

超融合服务器挂载硬盘--linux系统

项目中需要增加服务器的硬盘容量,通过超融合挂载了硬盘后,还需要添加到指定的路径下,这里记录一下操作步骤。 一:通过管理界面挂载硬盘 这一步都是界面操作,登录超融合控制云台后,找到对应的服务器&#…...

Kafka如何防止消息重复发送

Kafka 提供了几种方式来防止消息重复发送和处理。这些方式通常取决于生产者和消费者的设置和实现方式: 生产者端幂等性(什么是幂等性): 幂等性生产者:从 Kafka 0.11 版本开始引入了生产者端的幂等性支持。生产者可以通…...

数据库设计原则介绍

数据库设计是一个重要的过程,它涉及到创建一个逻辑结构来存储和管理数据。良好的数据库设计可以确保数据的完整性、一致性、性能和安全性。以下是一些关键的数据库设计原则: 1. 数据规范化 (Normalization) 目的:减少数据冗余、提高数据一致…...

反馈神经网络与不同类型的神经网络:BP神经网络,深度感知机,CNN,LSTM

反馈神经网络与不同类型的神经网络:BP神经网络,深度感知机,CNN,LSTM 在神经网络的研究和应用中,我们经常听到BP神经网络、深度感知机(MLP)、卷积神经网络(CNN)、长短期记…...

轮播图案例

丐版轮播图 <!DOCTYPE html> <html lang"zh-cn"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title> 基础轮播图 banner 移入移出</t…...

Spring 泛型依赖注入

Spring 泛型依赖注入&#xff0c;是利用泛型的优点对代码时行精简&#xff0c;将可重复使用的代码全部放到一个类之中&#xff0c;方便以后的维护和修改&#xff0c;同时在不增加代码的情况下增加代码的复用性。 示例代码&#xff1a; 创建实体类 Product package test.spri…...

C++ Linux调试(无IDE)

跨平台IDE编译调试C很方便&#xff0c;如QTCreate 、VSCode、Eclipse等&#xff0c;但是如果只能使用Shell控制台呢&#xff0c;gdb调试的优势就很明显了&#xff0c;在没有IDE的情况下&#xff0c;这个方式最有效。因为上手不是很难&#xff0c;特此整理 参考链接 目录 1、G…...

k8s从入门到放弃之Ingress七层负载

k8s从入门到放弃之Ingress七层负载 在Kubernetes&#xff08;简称K8s&#xff09;中&#xff0c;Ingress是一个API对象&#xff0c;它允许你定义如何从集群外部访问集群内部的服务。Ingress可以提供负载均衡、SSL终结和基于名称的虚拟主机等功能。通过Ingress&#xff0c;你可…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

pam_env.so模块配置解析

在PAM&#xff08;Pluggable Authentication Modules&#xff09;配置中&#xff0c; /etc/pam.d/su 文件相关配置含义如下&#xff1a; 配置解析 auth required pam_env.so1. 字段分解 字段值说明模块类型auth认证类模块&#xff0c;负责验证用户身份&am…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

Nuxt.js 中的路由配置详解

Nuxt.js 通过其内置的路由系统简化了应用的路由配置&#xff0c;使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...

如何为服务器生成TLS证书

TLS&#xff08;Transport Layer Security&#xff09;证书是确保网络通信安全的重要手段&#xff0c;它通过加密技术保护传输的数据不被窃听和篡改。在服务器上配置TLS证书&#xff0c;可以使用户通过HTTPS协议安全地访问您的网站。本文将详细介绍如何在服务器上生成一个TLS证…...

UR 协作机器人「三剑客」:精密轻量担当(UR7e)、全能协作主力(UR12e)、重型任务专家(UR15)

UR协作机器人正以其卓越性能在现代制造业自动化中扮演重要角色。UR7e、UR12e和UR15通过创新技术和精准设计满足了不同行业的多样化需求。其中&#xff0c;UR15以其速度、精度及人工智能准备能力成为自动化领域的重要突破。UR7e和UR12e则在负载规格和市场定位上不断优化&#xf…...

rnn判断string中第一次出现a的下标

# coding:utf8 import torch import torch.nn as nn import numpy as np import random import json""" 基于pytorch的网络编写 实现一个RNN网络完成多分类任务 判断字符 a 第一次出现在字符串中的位置 """class TorchModel(nn.Module):def __in…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...