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

news2024/11/15 11:34:16

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 每个用例前执行 有多少用例就执行多少次")
    #每个类之前执行 只执行一次
    @classmethod
    def 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=10
    print(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 DBy

login_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 每个用例前执行 有多少用例就执行多少次")
    #每个类之前执行 只执行一次
    @classmethod
    def 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):
        #key
        if '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]/button
        el = (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):
        #key
        if '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 结束

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

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

相关文章

什么是企业服务总线?它包含哪些技术组件?

我们每个人都会去医院,您描述下我们去医院的场景,然后引出这个挂号流程,通过挂号流程中的一个问题或者什么东西来吸引他的好奇心,这样呢?会比现在的预设场景好一些。我举个例子,人工智能怎么帮人看病。如果…

前端面试题23(css3)

关于CSS3的面试题,我们可以从多个维度来探讨,包括但不限于选择器、盒模型、布局技术、动画与过渡、响应式设计等。下面我会列举一些典型的CSS3面试问题,并尽可能提供详细的解答或示例代码。 1. CSS3中新增了哪些选择器? 答案: C…

【Java安装】windows10+JDK21+IDEA

文章目录 一、JDK安装1. 下载完成后按照自己需要的位置安装2. 配置环境变量2.1 JAVA_HOME变量2.2 PATH配置 3. 验证4. helloworld 二、IDEA安装三、IDEA-HelloWorld 一、JDK安装 JDK安装链接 1. 下载完成后按照自己需要的位置安装 2. 配置环境变量 2.1 JAVA_HOME变量 安装…

手机飞行模式是什么意思?3个方法教你如何开启

在现代生活中,手机已经成为我们日常生活中不可或缺的一部分。然而,有时我们需要暂时切断手机的通信功能,比如在飞机上、开会时或需要安静休息的时候。这时候,苹果手机上的“飞行模式”功能就派上了用场。 那么,手机飞…

【从零到一,如何搭建本地AI大模型】

摘要: 本文主要记录这一段时间对本地大模型搭建的心得。 作为一个资深程序员,在AI席卷全球的时候,深深感觉到了一丝危机感,不禁有一个想法不断在脑海闪现:我会不会真的哪一天被AI给取代了? 从哪入手 程序员出生的我,掌握了很多语言,从前端到数据库,再到运维,基本都…

uniapp-小程序获取用户位置

1. 需要在微信公众平台进行接口的申请。选择自己需要用的接口。 2. 在app.json文件中配置permission和requiredPrivateInfos。requiredPrivateInfos里面是你需要使用的接口。 3. 配置完成后,就可以使用了。 相关获取位置API的链接 4. 如果要获取当前位置到某一个指…

VS 附加进程调试

背景: 此方式适合VS、代码和待调试的exe在同一台机器上。 一、还原代码到和正在跑的exe同版本 此操作可以保证能够调试生产环境的exe 二、设置符号路径 1.调试->选项 三、附加进程 方式1: 打开VS,调试->附加到进程,出…

【MySQL】MySQL连接池原理与简易网站数据流动是如何进行

MySQL连接池原理与简易网站数据流动是如何进行 1.MySQL连接池原理2.简易网站数据流动是如何进行 点赞👍👍收藏🌟🌟关注💖💖 你的支持是对我最大的鼓励,我们一起努力吧!😃&#x1f60…

【Go】常见的变量与常量

变量 常见的变量声明方式 一、声明单个变量的多种方式 1.声明一个变量初始化一个值 //声明变量 默认值是0,var a int//初始化一个值a 1fmt.Println(a) 2. 在初始化的时候省去数据类型,通过值自动匹配当前的变量的数据类型 var b 2fmt.Println(&quo…

7月6日 VueConf 技术大会即将在深圳举办

7月6日,VueConf 2024 即将在深圳召开,本次大会正值 Vue.js 十周年,旨在聚焦 Vue.js 社区的成员,分享最新的技术动态、经验以及创新实践。 本次参与 VueConf 大会的是来自全球 Vue.js 核心团队成员、行业专家及前端开发者。其中&a…

Java语言程序设计——篇二(1)

Java语言基础 数据类型关键字与标识符关键字标识符 常量与变量1、常量2、变量 类型转换自动类型转换强制类型转换 数据类型 数据的基本要素数据的性质(数据结构)数据的取值范围(字节大小)数据的存储方式参与的运算 Java是一门强类…

NodeJS蔬菜自产零售混合销售平台-计算机毕业设计源码10149

摘 要 随着移动互联网的快速发展,购物方式也发生了巨大的变化。蔬菜作为消费者生活中必不可少的商品之一,在移动互联网时代也迎来了新的购物方式——购物小程序。购物小程序是一种基于手机应用平台的轻量级应用程序,用户可以通过它方便地浏览…

C++第二弹 -- C++基础语法下(引用 内联函数 auto关键字 范围for 指针空值)

本篇大纲 前言一. 引用续讲1. 传值,传引用效率对比2. 类型转换和表达式传引用的注意事项3. 引用与指针 二. 内联函数1. 概念2. 特性3. 面试题 三. auto关键字(C11)1. 类型别名思考2. auto简介3. auto的使用细则4. auto不能推导的场景 四. 基于范围的for循环(C11)1. 范围for的语…

3DMAX软件如何导出和导入模型

在3DMAX软件中导出和导入模型的过程相对直观,以下是具体的步骤:导出模型:1、选择模型:首先,在3DMAX的视图中选择你想要导出的模型。2、导出设置:点击菜单栏中的“文件”(File)&#…

现货黄金技术出现这一信号赶紧止损!

很多现货黄金投资者都并不知道,移动平均线除了可以用于寻找进场的机会,还可以用来设置止损,让自己在交易中更好地进行防守。其实移动平均线止损,是常用的技术止损方法之一,本文将和大家分享怎样利用均线设置止损点&…

鸿蒙开发:Universal Keystore Kit(密钥管理服务)【加密导入密钥(C/C++)】

加密导入密钥(C/C) 以加密导入ECDH密钥对为例,涉及业务侧加密密钥的[密钥生成]、[协商]等操作不在本示例中体现。 具体的场景介绍及支持的算法规格。 在CMake脚本中链接相关动态库 target_link_libraries(entry PUBLIC libhuks_ndk.z.so)开发步骤 设备A&#xf…

【日记】我就是世界上最幸福的人!(1124 字)

正文 今天想写的内容有点多,就不写在纸上了。 首先,最高兴的,还是我们的《艾尔登法环》有了进展。我和兄长终于通过了 “火山官邸:地底拷问所”。我真是不知道,我和他在这个地方被那两个掳人少女人拷问了多少次了。不仅…

笔记本电脑投屏怎么操作?一看就会!

日常工作或办公都会用到笔记本电脑,但很多新手用户不知道笔记本电脑的投屏要怎么操作?接下来系统之家给大家介绍三种简单的操作方法,帮助大家轻松完成笔记本电脑投屏投屏操作,从而满足自己的办公或学习使用需求。 方法一 1. 直接W…

QDockWidget类详解

一.QDockWidget类概述 1.QDockWidget类 QDockWidget类提供了一个特殊的窗口部件,它可以是被锁在QMainWindow窗口内部或者是作为顶级窗口悬浮在桌面上。 QDockWidget类提供了dock widget的概念,dock widget也就是我们熟悉的工具面板或者是工具窗口。Do…

anaconda powershell prompt中的指令

1.查看安装目录 pip list 或者 conda list 2.查看虚拟环境 conda env list 3.进入虚拟环境 conda activate 环境名称 例如:conda activate pytorch_learn 4.安装虚拟环境 conda create -n “” python 5.在虚拟环境中安装某模块/包 先进入虚拟环境 再 conda install…