提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 一、web自动化
    • 1.xpath定位
      • 1.属性定位
      • 2.属性与逻辑结合
      • 3.属性和层级结合
    • 2.常见元素定位方法(面试题)
    • 3.常见元素定位失败原因
    • 4.cookie
      • 1.验证码处理方案
      • 2.认识cookie
      • 3.cookie跳过登录案例
    • 5.pytest
      • 1.pytest介绍及安装
      • 2.定义用例
      • 3.执行测试用例
        • 1.命令行运行
        • 2.PyTest配置文件运行
        • 3.项目配置文件config.py
      • 4.参数化
      • 5.断言
      • 6.allure报告


一、web自动化

1.xpath定位

1.属性定位

  • 说明:利用元素的属性来进行定位
  • 示例://*[@xalue=‘提交’]
  • 在这里插入图片描述

#导包
from selenium.webdriver.common.by import By
from tools.chromeDriver import get_driver, quit_driver
#需求:打开注册页面。完成以下操作:
#1). 利用元素的属性信息精准定位用户名输入框,并输入:admin
#项目地址:http://121.43.169.97:8848/pageA.html
driver = get_driver(“http://121.43.169.97:8848/pageA.html”)
driver.find_element(By.XPATH, “//*[@id=‘userA’]”).send_keys(“admin”)
#退出浏览器
quit_driver(driver)

2.属性与逻辑结合

  • 说明:利用元素的多个属性来进行定位
  • 示例://input[@value='提交’and@class=‘banana’]\
  • 在这里插入图片描述

#导包
from selenium.webdriver.common.by import By
from tools.chromeDriver import get_driver, quit_driver
#需求:打开注册页面。完成以下操作:
#1). 利用属性与逻辑结合在test1输入框输入:admin
#项目地址:http://121.43.169.97:8848/pageA.html
driver = get_driver(“http://121.43.169.97:8848/pageA.html”)
driver.find_element(By.XPATH, “//*[@name=‘user’ and
@class=‘login’]”).send_keys(“admin”)
#退出浏览器
quit_driver(driver)

3.属性和层级结合

  • 说明:先定位到其父级元素,然后在找到该元素
  • 示例://div[@id=‘test1’]/input[@value=‘提交’]
  • 在这里插入图片描述

#导包
from selenium.webdriver.common.by import By
from tools.chromeDriver import get_driver, quit_driver
#需求:打开注册页面。完成以下操作:
#1). 利用属性与逻辑结合在test1输入框输入:admin
#项目地址:http://121.43.169.97:8848/pageA.html
driver = get_driver(“http://121.43.169.97:8848/pageA.html”)
#driver.find_element(By.XPATH, “//[@name=‘user’ and
@class=‘login’]").send_keys(“admin”)
driver.find_element(By.XPATH, "//
[@id=‘p1’]/input”).send_keys(“admin”)
#退出浏览器
quit_driver(driver)

2.常见元素定位方法(面试题)

在这里插入图片描述

3.常见元素定位失败原因

在这里插入图片描述

4.cookie

1.验证码处理方案

  • 去掉验证码、万能验证码
  • 验证码识别技术
  • 记录cookie
  • 在这里插入图片描述

2.认识cookie

在这里插入图片描述

3.cookie跳过登录案例

在这里插入图片描述

  • 需求:使用cookie实现跳过登录
    1). 手动登录商城,获取cookie
    2). 使用获取到的cookie,达到登录目的,然后就可以执行登录之后的操作
    在这里插入图片描述

#导包
import time
from selenium import webdriver
#打开浏览器
driver = webdriver.Chrome()
#打开页面
driver.get(“https://hmshop-test.itheima.net/Home/User/index.html”)
time.sleep(2)
#绕过登录
cookie_data = {
“name”: “PHPSESSID”,
“value”: “h0lrprhei3p3v16pr8sb2ehrm3”
}
driver.add_cookie(cookie_data)
time.sleep(2)
driver.refresh() # 刷新
#退出浏览器
time.sleep(3)
driver.quit()

5.pytest

1.pytest介绍及安装

  • pytest:python中的一种单元测试框架。
  • 为什么学习pytest?
    能阻止多个用例去执行
    方便实现参数化
    能够生成测试报告
  • 安装
    安装: pip install pytest
    在这里插入图片描述
    验证: pip show pytest
    在这里插入图片描述

2.定义用例

  • 在这里插入图片描述

#导包
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestLogin:
def setup_class(self):
#打开浏览器
self.driver = webdriver.Chrome()
self.driver.maximize_window()
def setup(self):
#打开页面
self.driver.get(“https://hmshop-test.itheima.net/Home/user/login.html”)
def test_login(self):
#case02:登录失败(用户名为空)
self.driver.find_element(By.ID, “username”).send_keys(“”)
self.driver.find_element(By.ID, “password”).send_keys(“123456”)
self.driver.find_element(By.ID, “verify_code”).send_keys(“8888”)
self.driver.find_element(By.LINK_TEXT, “登 录”).click()
def test_login2(self):
#case03:登录失败(密码为空)
self.driver.find_element(By.ID, “username”).send_keys(“13488888888”)
self.driver.find_element(By.ID, “password”).send_keys(“”)
self.driver.find_element(By.ID, “verify_code”).send_keys(“8888”)
self.driver.find_element(By.LINK_TEXT, “登 录”).click()
def test_login3(self):
#case01:登录成功
self.driver.find_element(By.ID, “username”).send_keys(“13488888888”)
self.driver.find_element(By.ID, “password”).send_keys(“123456”)
self.driver.find_element(By.ID, “verify_code”).send_keys(“8888”)
self.driver.find_element(By.LINK_TEXT, “登 录”).click()
def teardown(self):
time.sleep(2)
def teardown_class(self):
#退出浏览器
time.sleep(3)
self.driver.quit()

3.执行测试用例

1.命令行运行

在这里插入图片描述
在这里插入图片描述

#导包
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestLogin:
def setup_class(self):
#打开浏览器
self.driver = webdriver.Chrome()
self.driver.maximize_window()
def setup_method(self):
#打开页面
self.driver.get(“https://hmshop-test.itheima.net/Home/user/login.html”)
def test_login(self):
#case02:登录失败(用户名为空)
self.driver.find_element(By.ID, “username”).send_keys(“”)
self.driver.find_element(By.ID, “password”).send_keys(“123456”)
self.driver.find_element(By.ID, “verify_code”).send_keys(“8888”)
self.driver.find_element(By.LINK_TEXT, “登 录”).click()
def test_login2(self):
#case03:登录失败(密码为空)
self.driver.find_element(By.ID, “username”).send_keys(“13488888888”)
self.driver.find_element(By.ID, “password”).send_keys(“”)
self.driver.find_element(By.ID, “verify_code”).send_keys(“8888”)
self.driver.find_element(By.LINK_TEXT, “登 录”).click()
def test_login3(self):
#case01:登录成功
self.driver.find_element(By.ID, “username”).send_keys(“13488888888”)
self.driver.find_element(By.ID, “password”).send_keys(“123456”)
self.driver.find_element(By.ID, “verify_code”).send_keys(“8888”)
self.driver.find_element(By.LINK_TEXT, “登 录”).click()
def teardown_method(self):
time.sleep(2)
def teardown_class(self):
#退出浏览器
time.sleep(3)
self.driver.quit()
在这里插入图片描述

2.PyTest配置文件运行

在这里插入图片描述

[pytest]
addopts = -s
testpaths = ./scripts
python_files = test*.py
python_classes = Test*
python_functions = test*

3.项目配置文件config.py
  • 技术点: 参数化(数据驱动)
  • 作用:将测试数据和测试脚本分离,后期代码维护焦点放在数据
  • 使用:装饰器@(不改变方法内部的代码逻辑 新增功能)
    @pytest.mark.parametrize==》循环遍历测试数据 调用测试脚本
  • 步骤:
    ① 准备测试数据,格式:[(),(),()]
    ② 在被测试方法前面引入装饰器
    @pytest.mark.parametrize(“保存数据的变量,注意变量个数=(中数据的个数)”, 测试数据)
    def test_login(self, 直接复制装饰器中保存数据的一组变量名即可):
    pass
    ③ 修改测试方法代码 引用变量中的数据完成测试

#导包
import time
import config
import pytest
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By
test_data = [
(“”, “123456”, “8888”),
(“13488888888”, “”, “8888”),
(“13488887799”, “123456”, “8888”),
(“13488888888”, “123457”, “8888”),
(“13488888888”, “123456”, “8888”)
]
class TestLogin:
#类前置处理
def setup_class(self):
#打开浏览器
service = Service(executable_path=config.BASE_PATH +
‘/chromedriver.exe’)
self.driver = webdriver.Chrome(service=service)
#driver = webdriver.Chrome()
#窗口最大化
self.driver.maximize_window()
#类后置处理
def teardown_class(self):
#退出浏览器
self.driver.quit()
#方法前置处理
def setup_method(self):
#打开页面
self.driver.get(“https://hmshop-
test.itheima.net/index.php/Home/user/login.html”)
#方法后置处理
def teardown_method(self):
#等待3秒
time.sleep(3)
@pytest.mark.parametrize(“username, password, code”, test_data)
def test_login(self, username, password, code):
#页面定位+操作
self.driver.find_element(By.ID, “username”).send_keys(username)
self.driver.find_element(By.ID, “password”).send_keys(password)
self.driver.find_element(By.ID, “verify_code”).send_keys(code)
self.driver.find_element(By.NAME, “sbtbutton”).click()

4.参数化

  • 说明:通过参数的方式来传递数据,从而实现数据和脚本分离。并且可以实现用例的重复执行
  • 在这里插入图片描述

#导包
import time
import pytest
from selenium import webdriver
from selenium.webdriver.common.by import By
test_data = [(“”, “123456”, “8888”),
(“13488888888”, “”, “8888”),
(“13488888888”, “123456”, “8888”)]
class TestLogin:
def setup_class(self):
#打开浏览器
self.driver = webdriver.Chrome()
self.driver.maximize_window()
def setup_method(self):
#打开页面
self.driver.get(“https://hmshop-test.itheima.net/Home/user/login.html”)
@pytest.mark.parametrize(“username, password, code”, test_data)
def test_login(self, username, password, code):
self.driver.find_element(By.ID, “username”).send_keys(username)
self.driver.find_element(By.ID, “password”).send_keys(password)
self.driver.find_element(By.ID, “verify_code”).send_keys(code)
self.driver.find_element(By.LINK_TEXT, “登 录”).click()
def teardown_method(self):
time.sleep(2)
def teardown_class(self):
#退出浏览器
time.sleep(3)
self.driver.quit()

5.断言

  • 说明:让程序代替人为判断测试程序执行结果是否符合预期结果的过程
  • 在这里插入图片描述
    在这里插入图片描述
  • 案例:断言登录成功后的用户信息
    在这里插入图片描述

#导包
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
class TestLogin:
def setup_class(self):
#打开浏览器
self.driver = webdriver.Chrome()
self.driver.maximize_window()
def setup_method(self):
#打开页面
self.driver.get(“https://hmshop-test.itheima.net/Home/user/login.html”)
def test_login(self):
#case01:登录成功
self.driver.find_element(By.ID, “username”).send_keys(“13488888888”)
self.driver.find_element(By.ID, “password”).send_keys(“123456”)
self.driver.find_element(By.ID, “verify_code”).send_keys(“8888”)
self.driver.find_element(By.LINK_TEXT, “登 录”).click(
time.sleep(3)
assert “13488888888” == self.driver.find_element(By.CLASS_NAME,
“userinfo”).text
def teardown_method(self):
time.sleep(2)
def teardown_class(self):
#退出浏览器
time.sleep(3)
self.driver.quit()

6.allure报告

  • 安装: pip install allure-pytest
    在这里插入图片描述
  • 验证: pip show allure-pytest
    在这里插入图片描述
  • 下载: https://github.com/allure-framework/allure2/releases
    在这里插入图片描述
  • 解压
    在这里插入图片描述
  • allure配置
    在这里插入图片描述
  • pytest.ini配置文件

[pytest]
addopts = -s --alluredir report
testpaths = ./scripts
python_files = test*.py
python_classes = Test*
python_functions = test*

  • 生成报告:
    ① 运行测试脚本:pytest
    ② 生成测试报告:allure serve report
    在这里插入图片描述
    在这里插入图片描述

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

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

相关文章

(笔记)List

一、List的介绍和使用 1.List的介绍 1.1 list是可以在任意常数范围内插入和删除的序列式容器,并且该容器可以前后双向迭代。 1.2 list底层是双向链表结构,双向链表中每个元素都储存在互不相关的独立节点中,在节点中通过指针指向前其前一个…

重载和覆写有什么区别?

重载(Overload)和覆写(Override,也叫重写 )是面向对象编程中的重要概念,它们有以下区别: 定义 - 重载:在同一类中,允许存在多个方法名相同,但参数列表&#x…

flask 获取各种请求数据:GET form-data x-www-form-urlencoded JSON headers 上传文件

在 Flask 里,能使用多种方法获取不同类型的请求数据,下面详细介绍常见请求数据的获取方式。 获取查询字符串参数(GET 请求) 查询字符串参数一般在 URL 里,以 ?key1value1&key2value2 这种形式存在。可通过 requ…

人工智能助力工业制造:迈向智能制造的未来

在当今数字化转型的浪潮中,人工智能(AI)技术正逐渐成为推动工业制造领域变革的核心力量。智能制造作为工业 4.0 的重要组成部分,通过将 AI 技术与传统制造工艺深度融合,正在重塑整个生产流程,提高生产效率、…

【java八股文】深入浅出synchronized优化原理

🔍 开发者资源导航 🔍🏷️ 博客主页: 个人主页📚 专栏订阅: JavaEE全栈专栏 synchronized优化原理 synchronized即使悲观锁也是乐观锁,拥有自适应性。 jvm内部会统计每个锁的竞争激烈程度&…

生成式 AI 的重要性

在科技飞速发展的今天,我们正站在一个前所未有的变革节点上。生成式 AI,宛如一颗突然划破夜空的耀眼流星,以其强大的创造力和无限的可能性,迅速成为全球瞩目的焦点。它究竟有何等魔力,能在如此短的时间内引发如此巨大的轰动?这背后又隐藏着怎样的时代密码,等待着我们去解…

生成式 AI 的阐释

在科技浪潮的汹涌推动下,一个全新的时代正以前所未有的速度向我们奔来,生成式 AI 无疑是这股浪潮中最耀眼的浪尖。它究竟是什么?又将如何重塑我们的世界?这不仅是科技爱好者们热衷探讨的话题,更是关乎每一个人未来发展的重要命题。 生成式 AI,从本质上来说,是一种能够自…

C++ 中 virtual 的作用

文章目录 1. 用于虚继承2. 用于抽象基类3. 用于多态 C 的 virtual 关键字,常见有 3 种用途:虚继承、抽象基类和多态。 1. 用于虚继承 virtual 用于虚继承时,主要是为了解决菱形继承中的重复继承同名成员问题。使用形式如下 class Derived:…

软件测试52讲学习分享:深入理解单元测试

课程背景 最近我在学习极客时间的《软件测试52讲》课程,这是由腾讯TEG基础架构部T4级专家茹炳晟老师主讲的认证课程。作为数字化转型与人工智能(DTAI)产业人才基地建设中心的认证课程,内容非常专业实用。今天想和大家分享第3讲"什么是单元测试&…

Java SE(7)——类和对象(二)

1.包(package) 1.1 包的定义 在Java中,包是一种用于组织和管理类,接口和其他包的机制。主要作用是防止命名冲突,并提供一种访问控制机制 1.2 package关键字 package关键字的主要作用是声明当前类在哪个包里面。 当然,用户也可以…

Manus联合创始人:公司产品基于Claude和阿里千问大模型开发

3月11日消息,日前,Manus官方在社交平台转发了公司联合创始人、首席科学家季逸超对Manus的技术解读,季逸超在评论区回复网友关于“Manus使用了哪一个基础大模型”这一问题时回复称,“我们用过Claude,也用过不同版本的Qw…

欺骗单页应用(SPA)渲染隐藏路由 -- trouble at the spa b01lersCTF

题目信息:I had this million-dollar app idea the other day, but I can’t get my routing to work! I’m only using state-of-the-art tools and frameworks, so that can’t be the problem… right? Can you navigate me to the endpoint of my dreams? 题目…

大数据引领行业革命:深度解析与未来趋势

📝个人主页🌹:慌ZHANG-CSDN博客 🌹🌹期待您的关注 🌹🌹 在信息化、数字化、智能化日益发展的今天,大数据技术已经成为推动产业变革的重要引擎。它不仅仅是一个技术工具,更是各行各业创新和优化的核心动力。无论是大企业还是初创公司,大数据的应用已经成为提升效…

[machine learning] Transformer - Attention (二)

本文介绍带训练参数的self-attention,即在transformer中使用的self-attention。 首先引入三个可训练的参数矩阵Wq, Wk, Wv,这三个矩阵用来将词向量投射(project)到query, key, value三个向量上。下面我们再定义几个变量: import torch inpu…

施磊老师rpc(三)

文章目录 mprpc框架项目动态库编译框架生成动态库框架初始化函数-文件读取1. 为什么要传入 argc, argv2. 读取参数逻辑3. 配置文件设计 init部分实现 mprpc配置文件加载(一)配置文件加载类成员变量主要方法**src/include/mprpcconfig.h** 配置文件**bin/test.conf** 实现配置文…

文献分享:通过简单的生物偶联策略将肽双特异性抗体(pBsAbs)应用于免疫治疗

背景 双特异性抗体是将单克隆抗体的两个不同抗原结合位点融合成一个单一实体的人工分子。它们已经成为一种很有前景的下一代抗癌治疗方法。尽管双特异性抗体的应用令人着迷,但双特异性抗体的设计和生产仍然繁琐而富有挑战性,导致研发过程漫长&#xff0…

二、shell脚本--变量与数据类型

1. 变量的定义与使用 定义变量:简单直接 在 Shell 里定义变量相当容易: 基本格式: variable_namevalue关键点 ❗:赋值号 的两边绝对不能有空格!这绝对是初学者最容易踩的坑之一 😨,务必留意&#xff01…

java_Lambda表达式

1、背景 lambda表达式是Java SE 8中一个重要的新特性。lambda表达式允许你通过表达式来代替功能接口。lambda表达式就和方法一样样,它提供了一个正常的参数列表和一个使用这些参数的主体(body,可以是一个表达式和一个代码块)。La…

给QCustomPlot添加一个QScrollBar滚动条、限制缩放范围、自动设置大小和右边栏垂直缩放

实现效果 实现思路 从QCustomPlot类派生一个类,进行个性化设置,在轴矩形的上边设置Margin,放一个滚动条,设置滚动条的样式 常量定义 #define NQSCRB 1000构造函数初始化 // 设置QScrollBar的样式// 顶部空--5,左侧空--6

实验-组合电路设计1-全加器和加法器(数字逻辑)

目录 一、实验内容 二、实验步骤 2.1 全加器的设计 2.2 加法器的设计 三、调试过程 3.1 全加器调试过程 2.加法器的调试过程 四、实验使用环境 五、实验小结和思考 一、实验内容 a) 介绍 在这次实验中,你将熟悉 Logisim 的操作流程,并且学习…