个人博客项目测试报告

目录

一. 项目背景

二. 概述

三. 功能测试用例

四. 自动化测试用例


一. 项目背景

项目链接: http://81.70.189.104:8080/login.html

个人博客系统提供了 登录、注册、写博客&发布博客、删除博客、修改博客功能。前端的页面有 登录页、注册页、个人博客列表页、博客详情页、博客列表页(覆盖所有用户文章)。

二. 概述

该测试报告主要对项目的主流程进行测试,分别是注册功能、登录功能、查看全文功能、修改功能、删除功能、发布文章功能、对列表页中的按钮进行测试。

三. 功能测试用例

四. 自动化测试用例

设计到的技术 Junit3,selenium。

测试环境:使用 windows11系统、Chrom浏览器。

测试数据:

// 该类用来做一些初始化操作
public class InitAndEnd {static WebDriver webDriver;public int a;@BeforeAllstatic void Setup() {webDriver = new ChromeDriver();}@AfterAllstatic void TearDown() {webDriver.quit();}
}@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class BlogCases extends InitAndEnd{public static Stream<Arguments> registerTestSuccess1() {return Stream.of(Arguments.arguments("m1","m1"));}public static Stream<Arguments> registerTestFailArg() {return Stream.of(Arguments.arguments("admin","admin"));}/*** 输入正确的账号与密码 => 登录成功*/@Order(1)@ParameterizedTest@CsvFileSource(resources = "LoginSuccess.csv")void loginSuccessTest(String username, String password, String blogListUrl) throws InterruptedException {// 先打开博客登录页面webDriver.get("http://81.70.189.104:8080/login.html");// 输入账号webDriver.findElement(By.cssSelector("#username")).sendKeys(username);// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys(password);// 点击提交登录按钮webDriver.findElement(By.cssSelector("#submit")).click();// 隐式等待
//        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 显示等待WebDriverWait wait = new WebDriverWait(webDriver,3);wait.until(ExpectedConditions.urlContains(blogListUrl));// 跳转到列表页// 判断 URL地址String curURL = webDriver.getCurrentUrl();Assertions.assertEquals(blogListUrl,curURL);}/*** 输入错误的账号与密码 ==>登录失败*/@Order(2)@ParameterizedTest@CsvFileSource(resources = "loginFail.csv")void loginFailTest(String username, String password, String loginUrl) throws InterruptedException {webDriver.get("http://81.70.189.104:8080/login.html");// 输入账号webDriver.findElement(By.cssSelector("#username")).sendKeys(username);// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys(password);// 点击提交登录按钮webDriver.findElement(By.cssSelector("#submit")).click();// 隐式等待
//        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 显示等待WebDriverWait wait = new WebDriverWait(webDriver,3);wait.until(ExpectedConditions.alertIsPresent());// alert 弹窗处理webDriver.switchTo().alert().accept();// 判断 URL地址String curURL = webDriver.getCurrentUrl();Assertions.assertEquals(loginUrl,curURL);}/***  该方法来校验个人博客的列表页*/@Order(3)@Testvoid myBlogListTest() throws InterruptedException {// 打开博客列表页webDriver.get("http://81.70.189.104:8080/myblog_list.html");// 隐式等待webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 获取页面上所有的博客标题对应的元素List<WebElement> elements = webDriver.findElements(By.cssSelector(".title"));// 校验个数是否为 0Assertions.assertNotEquals(0,elements.size());// 获取第一篇文章的简介内容WebElement element = webDriver.findElement(By.cssSelector(".desc"));Assertions.assertNotEquals("",element.getText());}/*** 判断文章详情*/@Order(4)@Testvoid myBlogList_contentTest() {// 打开博客列表页webDriver.get("http://81.70.189.104:8080/myblog_list.html");// 隐式等待webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 获取到第一篇博客的时间String expectTime = webDriver.findElement(By.cssSelector(".date")).getText();// 获取到第一排呢博客的标题String expectTitle = webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.title")).getText();// 点击第一篇博客的查看全文webDriver.findElement(By.cssSelector(".detail")).click();// 显示等待WebDriverWait wait = new WebDriverWait(webDriver,3);wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/blog_content.html?aid=6"));// 校验当前的页面的 URLAssertions.assertEquals("http://81.70.189.104:8080/blog_content.html?aid=6",webDriver.getCurrentUrl());// 校验时间String actualTime = webDriver.findElement(By.cssSelector("#createtime")).getText();Assertions.assertEquals(expectTime,actualTime);// 校验文章标题String actualTitle = webDriver.findElement(By.cssSelector("#title")).getText();Assertions.assertEquals(expectTitle,actualTitle);}/*** 测试列表页功能 (查看文章,首页,上一页,下一页,尾页)*/@Order(5)@Testvoid ListTest() {// 打开博客列表页webDriver.get("http://81.70.189.104:8080/myblog_list.html");// 隐式等待webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 点击主页跳转到 列表页webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).click();// 显示等待WebDriverWait wait = new WebDriverWait(webDriver,3);wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/blog_list.html"));// 校验当前页面的 URLAssertions.assertEquals("http://81.70.189.104:8080/blog_list.html",webDriver.getCurrentUrl());// 校验列表页上的文章标题和时间 与 详情页中的标题和时间String expectTitle = webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.title")).getText();String expectTime = webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.date")).getText();// 跳转到博客详情页webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a")).click();// 显示等待wait = new WebDriverWait(webDriver,3);wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/blog_content.html?aid=7"));String actualTitle = webDriver.findElement(By.cssSelector("#title")).getText();String actualTime = webDriver.findElement(By.cssSelector("#createtime")).getText();Assertions.assertEquals(expectTime,actualTime);Assertions.assertEquals(expectTitle,actualTitle);// 浏览器返回webDriver.navigate().back();// 显示等待wait = new WebDriverWait(webDriver,3);wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/blog_list.html"));// 测试按钮// 点击首页webDriver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(1)")).click();// 处理 alert 弹窗webDriver.switchTo().alert().accept();// 点击下一页webDriver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(3)")).click();// 校验当前页面 URLAssertions.assertEquals("http://81.70.189.104:8080/blog_list.html?pindex=2",webDriver.getCurrentUrl());// 点击上一页webDriver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(2)")).click();// 校验当前页面 URLAssertions.assertEquals("http://81.70.189.104:8080/blog_list.html?pindex=1",webDriver.getCurrentUrl());// 点击尾页webDriver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(4)")).click();// 校验当前页面 URLAssertions.assertEquals("http://81.70.189.104:8080/blog_list.html?pindex=3",webDriver.getCurrentUrl());}/*** 发布博客*/@Order(6)@Testvoid addBlogTest() throws InterruptedException {webDriver.get("http://81.70.189.104:8080/myblog_list.html");// 显示等待 myblog_list.htmlWebDriverWait wait = new WebDriverWait(webDriver,3);wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/myblog_list.html"));// 点击写博客按钮webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();// 隐式等待 blog_add.htmlwebDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 编写博客// 写标题
//        ((JavascriptExecutor)webDriver).executeScript("document.getElementById(\"title\").value=\"自动化测试\"");webDriver.findElement(By.cssSelector("#title")).sendKeys("自动化测试");// 点击发布按钮webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();wait = new WebDriverWait(webDriver,5);wait.until(ExpectedConditions.alertIsPresent());// 处理 alert 弹窗webDriver.switchTo().alert().dismiss();// 显示等待wait = new WebDriverWait(webDriver,5);wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/myblog_list.html"));// 校验当前 URLAssertions.assertEquals("http://81.70.189.104:8080/myblog_list.html",webDriver.getCurrentUrl());// 校验第一篇博客// 校验文章标题String actualTitle = webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.title")).getText();Assertions.assertEquals("自动化测试",actualTitle);}/*** 修改博客*/@Order(7)@Testvoid editBlogTest() throws InterruptedException {webDriver.get("http://81.70.189.104:8080/myblog_list.html");// 隐式等待webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 点击修改按钮webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a:nth-child(5)")).click();// 隐式等待webDriver.manage().timeouts().implicitlyWait(5,TimeUnit.SECONDS);// 修改文章标题// 清空标题webDriver.findElement(By.cssSelector("#title")).clear();// 编写标题webDriver.findElement(By.cssSelector("#title")).sendKeys("修改");// 点击修改文章按钮webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).sendKeys(Keys.CONTROL,"X");webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();WebDriverWait wait = new WebDriverWait(webDriver,3);wait.until(ExpectedConditions.alertIsPresent());// 处理 alert 弹窗webDriver.switchTo().alert().accept();// 显示等待wait = new WebDriverWait(webDriver,5);wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/myblog_list.html"));// 校验第一篇文章的标题String actualTitle = webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.title")).getText();Assertions.assertEquals("修改",actualTitle);}/*** 删除博客*/@Order(8)@Testvoid deleteBlogTest() {webDriver.get("http://81.70.189.104:8080/myblog_list.html");// 点击删除按钮webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a:nth-child(6)")).click();// 显示等待WebDriverWait wait = new WebDriverWait(webDriver,5);wait.until(ExpectedConditions.alertIsPresent());// 处理 alert 弹窗// 取消删除webDriver.switchTo().alert().dismiss();// 点击删除按钮webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > a:nth-child(6)")).click();// 显示等待wait = new WebDriverWait(webDriver,5);wait.until(ExpectedConditions.alertIsPresent());// 确定删除webDriver.switchTo().alert().accept();// 显示等待wait = new WebDriverWait(webDriver,5);wait.until(ExpectedConditions.alertIsPresent());// 处理删除成功的 alertwebDriver.switchTo().alert().accept();// 校验第一个文章标题Assertions.assertNotEquals("修改",webDriver.findElement(By.cssSelector("#artListDiv > div:nth-child(1) > div.title")).getText());}/*** 注销博客*/@Order(9)@Testvoid loginOutTest() {webDriver.get("http://81.70.189.104:8080/myblog_list.html");// 隐式等待webDriver.manage().timeouts().implicitlyWait(5,TimeUnit.SECONDS);// 点击注销按钮webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();// 显示等待WebDriverWait wait = new WebDriverWait(webDriver,6);wait.until(ExpectedConditions.alertIsPresent());// 处理 alert 弹窗// 点击取消webDriver.switchTo().alert().dismiss();// 点击注销按钮webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();// 显示等待wait = new WebDriverWait(webDriver,6);wait.until(ExpectedConditions.alertIsPresent());// 处理 alert 弹窗webDriver.switchTo().alert().accept();// 隐式等待webDriver.manage().timeouts().implicitlyWait(6,TimeUnit.SECONDS);// 校验当前页面的 URLAssertions.assertEquals("http://81.70.189.104:8080/login.html",webDriver.getCurrentUrl());// 校验 用户与密码输入框是否为空Assertions.assertEquals("",webDriver.findElement(By.cssSelector("#username")).getText());Assertions.assertEquals("",webDriver.findElement(By.cssSelector("#password")).getText());}/*** 注册测试*/@Disabled@Order(10)@ParameterizedTest@MethodSource("registerTestSuccess1")void registerTestSuccess(String username, String password) {webDriver.get("http://81.70.189.104:8080/login.html");// 隐式等待webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);// 点击注册按钮webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();// 显示等待WebDriverWait wait = new WebDriverWait(webDriver,5);wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/reg.html"));// 校验当前页面 URLAssertions.assertEquals("http://81.70.189.104:8080/reg.html",webDriver.getCurrentUrl());// 输入用户名webDriver.findElement(By.cssSelector("#username")).sendKeys(username);// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys(password);// 输入确认密码webDriver.findElement(By.cssSelector("#password2")).sendKeys(password);// 点击提交webDriver.findElement(By.cssSelector("#submit")).click();// 显示等待wait.until(ExpectedConditions.alertIsPresent());// 处理 alert 弹窗webDriver.switchTo().alert().accept();// 显示等待wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/login.html"));// 校验当前页面的 URL 地址Assertions.assertEquals("http://81.70.189.104:8080/login.html",webDriver.getCurrentUrl());}@Order(11)@ParameterizedTest@MethodSource("registerTestFailArg")void registerTestFailTest(String username, String password) {webDriver.get("http://81.70.189.104:8080/login.html");// 隐式等待webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);// 点击注册按钮webDriver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).click();// 显示等待WebDriverWait wait = new WebDriverWait(webDriver,5);wait.until(ExpectedConditions.urlContains("http://81.70.189.104:8080/reg.html"));// 校验当前页面 URLAssertions.assertEquals("http://81.70.189.104:8080/reg.html",webDriver.getCurrentUrl());// 输入用户名webDriver.findElement(By.cssSelector("#username")).sendKeys(username);// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys(password);// 输入确认密码webDriver.findElement(By.cssSelector("#password2")).sendKeys(password);// 点击提交按钮webDriver.findElement(By.cssSelector("#submit")).click();// 显示等待wait.until(ExpectedConditions.alertIsPresent());// 处理注册失败的弹窗 alertwebDriver.switchTo().alert().accept();// 校验页面 URLAssertions.assertEquals("http://81.70.189.104:8080/reg.html",webDriver.getCurrentUrl());// 刷新当前页面webDriver.navigate().refresh();// 隐式等待webDriver.manage().timeouts().implicitlyWait(5,TimeUnit.SECONDS);// 密码 与 确认密码不同// 输入用户名webDriver.findElement(By.cssSelector("#username")).sendKeys("ppp");// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys(password+"123");// 输入确认密码webDriver.findElement(By.cssSelector("#password2")).sendKeys(password);// 点击提交按钮webDriver.findElement(By.cssSelector("#submit")).click();// 显示等待wait.until(ExpectedConditions.alertIsPresent());// 处理弹窗webDriver.switchTo().alert().accept();Assertions.assertEquals("http://81.70.189.104:8080/reg.html",webDriver.getCurrentUrl());}}

部分展示图:

登录页面:

个人列表页:

博客详情页: 

博客列表页:

博客编辑页:

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

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

相关文章

CloudCompare 二次开发(9)——半径滤波

目录 一、概述二、代码集成三、结果展示本文由CSDN点云侠原创,原文链接。如果你不是在点云侠的博客中看到该文章,那么此处便是不要脸的爬虫。 一、概述 使用CloudCompare与PCL的混合编程实现点云半径滤波。半径滤波的算法原理见:PCL 半径滤波器。基于PCL将半径滤波集成到Cl…

c#事件(event)

概述&#xff1a; C#中的事件是一种特殊的委托&#xff0c;它用于实现观察者模式&#xff0c;允许对象在特定事件发生时通知其他对象。 以下是使用C#事件的示例&#xff1a; 首先&#xff0c;定义一个包含事件的类&#xff1a; public class EventPublisher {// 声明一个事…

通俗易懂讲解大模型:Tokenizer

Tokenizer Tokenizer 是 NLP pipeline 的核心组件之一。Tokenizer 的目标是&#xff1a;将文本转换为模型可以处理的数据。模型只能处理数字&#xff0c;因此 Tokenizer 需要将文本输入转换为数字输入。 通常而言有三种类型的 Tokenizer &#xff1a;Word-based Tokenizer、Cha…

PostgreSQL安装异常,服务无法启动导致创建服务器超时

win上安装pg后无法创建服务器&#xff0c;提示创建超时&#xff0c;发现服务列表里面pg15服务 并没有启动&#xff0c;启动服务器发现服务不了&#xff0c;截图忘记截了&#xff0c;复现不了&#xff0c;解决方法是 换个身份&#xff0c;然后继续启动&#xff0c;然后就可以在…

【每日运维】U盘启动盘安装 ESXi 6.7.0 安装卡在 loading /bnxtroce.v00

问题描述 ● ESXi 6.7.0 安装进度卡在loading /bnxtroce.v00 进度处 处理方法 ● 重新制作启动盘&#xff0c;写入方式改为&#xff1a;【USB-ZIPv2】 ● 设置服务器的 bios设置&#xff0c;启动方式改为【UEFI】 ● 重启开机安装即可

Playwright for Python:断言

一、支持的断言 Playwright支持以下几种断言&#xff1a; 断言描述expect(locator).to_be_checked()复选框被选中expect(locator).to_be_disabled()元素是禁用状态expect(locator).to_be_editable()元素是可编辑状态expect(locator).to_be_empty()容器是空的expect(locator).…

QT 发布软件基本操作

一、配置环境变量 找到Qt安装时的bin目录的路径&#xff1a;D:\Qt\Qt5.14.2\5.14.2\mingw73_64\bin&#xff0c;将目录拷贝至下述环境变量中。 打开计算机的高级系统设置 选中环境变量-->系统变量-->Path 点击编辑-->新建-->粘贴 二、生成发布软件的可执行程序 …

圆点和元素连线

效果图&#xff1a; 点上的线段跟踪元素移动&#xff0c;并且线会根据鼠标位置来连接元素的那个角 实现代码 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><style>* {padding: 0;margin: 0;}.piont {width…

DP读书:鲲鹏处理器 架构与编程(十四)ACPI与软件架构具体调优

一分钟速通ACPI和鲲鹏软件移植 操作系统内核鲲鹏软件移植鲲鹏软件移植流程 编译工具选择编译参数移植案例源码修改案例鲲鹏分析扫描工具 Dependency Advisor鲲鹏代码迁移工具 Porting Advisor 鲲鹏软件性能调优鲲鹏软件性能调优流程CPU与内存子系统性能调优网络子系统性能调优磁…

库中是如何实现string类的?

&#x1f388;个人主页:&#x1f388; :✨✨✨初阶牛✨✨✨ &#x1f43b;推荐专栏1: &#x1f354;&#x1f35f;&#x1f32f;C语言初阶 &#x1f43b;推荐专栏2: &#x1f354;&#x1f35f;&#x1f32f;C语言进阶 &#x1f511;个人信条: &#x1f335;知行合一 &#x1f…

计及电池储能寿命损耗的微电网经济调度(matlab代码)

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 该程序参考文献《考虑寿命损耗的微网电池储能容量优化配置》模型&#xff0c;以购售电成本、燃料成本和储能寿命损耗成本三者之和为目标函数&#xff0c;创新考虑储能寿命损耗约束、放电深度约束和储能循环次…

PyQt5报错Process finished with exit code -1073740791 (0xC0000409)

点击按钮之后&#xff0c;就直接退出程序&#xff0c;控制台出现一个提示&#xff1a;解决办法&#xff1a; 在PyCharm中打开Run菜单&#xff0c;找到Edit Configurations进入&#xff0c;勾选Emulate terminal in output console即可。 然后再运行一下程序&#xff0c;就可以…

【管理运筹学】第 7 章 | 图与网络分析(1,图论背景以及基本概念、术语、矩阵表示)

文章目录 引言一、图与网络的基本知识1.1 图与网络的基本概念1.1.1 图的定义1.1.2 图中相关术语1.1.3 一些特殊图类1.1.4 图的运算 1.2 图的矩阵表示1.2.1 邻接矩阵1.2.2 可达矩阵1.2.3 关联矩阵1.2.4 权矩阵 写在最后 引言 按照正常进度应该学习动态规划了&#xff0c;但我想…

爬虫到底难在哪里?

目录 爬虫到底难在哪里 怎么学习爬虫 注意事项 爬虫工具 总结 学习Python爬虫的难易程度因人而异&#xff0c;对于具备编程基础的人来说&#xff0c;学习Python爬虫并不困难。Python语言本身比较简单易学&#xff0c;适合初学者使用。 爬虫到底难在哪里 爬虫的难点主要包…

阿里云2核4G服务器5M带宽五年租用价格表

阿里云2核4G服务器5M带宽可以选择轻量应用服务器或云服务器ECS&#xff0c;轻量2核4G4M带宽服务器297元一年&#xff0c;2核4G云服务器ECS可以选择计算型c7、c6或通用算力型u1实例等&#xff0c;买5年可以享受3折优惠&#xff0c;阿腾云分享阿里云服务器2核4G5M带宽五年费用表&…

[git] 如何克隆仓库,进行项目撰写,并绑定自己的远程仓库

摘要&#xff1a;删除.git文件&#xff0c;才可重新绑定远程仓库。 具体步骤&#xff1a; 文件夹右键&#xff0c;进入”Git Bash Here“执行命令 1. 执行 ”git clone 仓库地址“&#xff0c;克隆仓库 2. 在生成的仓库中&#xff0c;删除 .git 文件 3. git init 初始化仓库…

时序预测 | MATLAB实现LSSVM最小二乘支持向量机时间序列预测未来

时序预测 | MATLAB实现LSSVM最小二乘支持向量机时间序列预测未来 目录 时序预测 | MATLAB实现LSSVM最小二乘支持向量机时间序列预测未来预测效果基本介绍程序设计参考资料 预测效果 基本介绍 1.Matlab实现LSSVM时间序列预测未来(最小二乘支持向量机)&#xff1b; 2.运行环境Mat…

SQLI-labs-第五关

知识点&#xff1a;布尔盲注 思路&#xff1a; 1、判断注入点 首先&#xff0c;我们看看正常的回显内容 ?id1 接着输入?id1 &#xff0c;结果出现语句错误 这里说明存在单引号的闭合错误 ?id1 and 11-- ?id1 and 12-- 这里没有任何回显信息&#xff0c;可以准确的确…

Ansible之playbook剧本

一、playbook概述1.1 playbook 介绍1.2 playbook 组成部分 二、playbook 示例2.1 playbook 启动及检测2.2 实例一2.3 vars 定义、引用变量2.4 指定远程主机sudo切换用户2.5 when条件判断2.6 迭代2.7 Templates 模块1.先准备一个以 .j2 为后缀的 template 模板文件&#xff0c;设…

RDMA 相关bug记录

对于 Client 来讲&#xff0c;setupConnection 中的 cm_id 应该是本地的&#xff0c;意味着后续 create pd \ cq \ qp 等等传入的 cm_id 都是本地 id。但是对于 Server 来讲&#xff0c;收到 client 的链接请求时将 client 的 cm_id 传入 setupConnection&#xff0c;意味着后续…