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

12. 自动化项目实战

目录

1. 登录测试

2. 测试首页的帖子列表数不为0

3. 帖子详情页校验

4. 发布帖子

5. 退出登录


自动化项目实施的基本流程如下图所示:

手工测试用例、自动化测试用例。

1. 登录测试

校验登录后主页显示的用户名称和登录时输入的用户名是否相等。

public class ForumCases extends InitAndEnd{/*** 登录测试*/@Testvoid login(){// 打开要进行登录的页面webDriver.get("http://150.158.82.121:58080/sign-in.html");// 输入用户名webDriver.findElement(By.cssSelector("#username")).sendKeys("明玉");// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys("123");// 点击登录webDriver.findElement(By.cssSelector("#submit")).click();// 校验用户是否登录成功,即当前用户是否为登录的用户,如果是则测试通过,否则测试不通过String user_name = webDriver.findElement(By.cssSelector("#username")).getAttribute("value");// 断言相等Assertions.assertEquals("明玉",user_name);}
}

测试成功: 

我们还可以通过参数化对于以上代码进行优化:

public class ForumCases extends InitAndEnd{/*** 登录测试*/@ParameterizedTest@CsvSource(value = "明玉,123")void login(String username,String password){// 打开要进行登录的页面webDriver.get("http://150.158.82.121:58080/sign-in.html");// 输入用户名webDriver.findElement(By.cssSelector("#username")).sendKeys(username);// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys(password);// 点击登录webDriver.findElement(By.cssSelector("#submit")).click();// 校验用户是否登录成功,即当前用户是否为登录的用户,如果是则测试通过,否则测试不通过String user_name = webDriver.findElement(By.cssSelector("#username")).getAttribute("value");// 断言相等Assertions.assertEquals(username,user_name);}
}

 测试成功:

2. 测试首页的帖子列表数不为0

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ForumCases extends InitAndEnd{/*** 登录测试* 账号正确,密码正确,登录成功*/@Order(1)@ParameterizedTest@CsvSource(value = "明玉,123")void login(String username,String password){// 打开要进行登录的页面webDriver.get("http://150.158.82.121:58080/sign-in.html");// 输入用户名webDriver.findElement(By.cssSelector("#username")).sendKeys(username);// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys(password);// 点击登录webDriver.findElement(By.cssSelector("#submit")).click();// 校验用户是否登录成功,即当前用户是否为登录的用户,如果是则测试通过,否则测试不通过String user_name = webDriver.findElement(By.cssSelector("#username")).getAttribute("value");// 断言相等Assertions.assertEquals(username,user_name);}/*** 帖子列表*/@Order(2)@Testvoid articleList(){webDriver.get("http://150.158.82.121:58080/index.html");// 智能等待3秒webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 统计首页的帖子数目int article_num = webDriver.findElements(By.cssSelector("#nav_board_index > a")).size();// 断言帖子数目不为0Assertions.assertNotEquals(0,article_num);}
}

测试成功:

3. 帖子详情页校验

首先,我们点击帖子标题查看详情时,帖子的详情页中帖子标题不能为空

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ForumCases extends InitAndEnd{/*** 登录测试* 账号正确,密码正确,登录成功*/@Order(1)@ParameterizedTest@CsvSource(value = "明玉,123")void login(String username,String password){// 打开要进行登录的页面webDriver.get("http://150.158.82.121:58080/sign-in.html");// 输入用户名webDriver.findElement(By.cssSelector("#username")).sendKeys(username);// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys(password);// 点击登录webDriver.findElement(By.cssSelector("#submit")).click();// 校验用户是否登录成功,即当前用户是否为登录的用户,如果是则测试通过,否则测试不通过String user_name = webDriver.findElement(By.cssSelector("#username")).getAttribute("value");// 断言相等Assertions.assertEquals(username,user_name);}/*** 帖子列表*/@Order(2)@Testvoid articleList(){webDriver.get("http://150.158.82.121:58080/index.html");// 智能等待3秒webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 统计首页的帖子数目int article_num = webDriver.findElements(By.cssSelector("#nav_board_index > a")).size();// 断言帖子数目不为0Assertions.assertNotEquals(0,article_num);}/*** 帖子详情页检验* 校验帖子的标题不为空*/@Order(3)@Testvoid articleDetail(){// 打开列表页webDriver.get("http://150.158.82.121:58080/index.html");// 找到需要查看的帖子标题并点击webDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).click();// 获取博客的标题String article_title = webDriver.findElement(By.cssSelector("#details_article_content_title")).getText();// 断言标题不为空Assertions.assertNotNull(article_title);}
}

测试成功:

其次,我们点击帖子标题查看详情时,帖子的详情页中帖子内容不能为空

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ForumCases extends InitAndEnd{/*** 登录测试* 账号正确,密码正确,登录成功*/@Order(1)@ParameterizedTest@CsvSource(value = "明玉,123")void login(String username,String password){// 打开要进行登录的页面webDriver.get("http://150.158.82.121:58080/sign-in.html");// 输入用户名webDriver.findElement(By.cssSelector("#username")).sendKeys(username);// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys(password);// 点击登录webDriver.findElement(By.cssSelector("#submit")).click();// 校验用户是否登录成功,即当前用户是否为登录的用户,如果是则测试通过,否则测试不通过String user_name = webDriver.findElement(By.cssSelector("#username")).getAttribute("value");// 断言相等Assertions.assertEquals(username,user_name);}/*** 帖子列表*/@Order(2)@Testvoid articleList(){webDriver.get("http://150.158.82.121:58080/index.html");// 智能等待3秒webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 统计首页的帖子数目int article_num = webDriver.findElements(By.cssSelector("#nav_board_index > a")).size();// 断言帖子数目不为0Assertions.assertNotEquals(0,article_num);}/*** 帖子详情页检验* 校验帖子的标题不为空* 校验帖子的内容不为空*/@Order(3)@Testvoid articleDetail(){// 打开列表页webDriver.get("http://150.158.82.121:58080/index.html");// 找到需要查看的帖子标题并点击webDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).click();// 获取帖子的标题String article_title = webDriver.findElement(By.cssSelector("#details_article_content_title")).getText();// 断言帖子的标题不为空Assertions.assertNotNull(article_title);// 获取帖子的内容String article_content = webDriver.findElement(By.cssSelector("#details_article_content > p")).getText();// 断言帖子的内容不为空Assertions.assertNotNull(article_content);}
}

测试成功:

4. 发布帖子

我们可以直接在控制台上进行输入:

我们可以直接复制以上的 JS 脚本:document.querySelector("#article_post_title").value="测试"

5. 退出登录

package forumTest;import net.bytebuddy.build.ToStringPlugin;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;import java.util.concurrent.TimeUnit;import static java.lang.Thread.sleep;@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ForumCases extends InitAndEnd{/*** 登录测试* 账号正确,密码正确,登录成功*/@Order(1)@ParameterizedTest@CsvSource(value = "明玉,123")void login(String username,String password){// 打开要进行登录的页面webDriver.get("http://150.158.82.121:58080/sign-in.html");// 输入用户名webDriver.findElement(By.cssSelector("#username")).sendKeys(username);// 输入密码webDriver.findElement(By.cssSelector("#password")).sendKeys(password);// 智能等待5秒webDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);// 点击登录webDriver.findElement(By.cssSelector("#submit")).click();// 校验用户是否登录成功,即当前用户是否为登录的用户,如果是则测试通过,否则测试不通过String user_name = webDriver.findElement(By.cssSelector("#username")).getAttribute("value");// 断言相等Assertions.assertEquals(username,user_name);}/*** 帖子列表*/@Order(2)@Testvoid articleList(){webDriver.get("http://150.158.82.121:58080/index.html");// 智能等待3秒webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);// 统计首页的帖子数目int article_num = webDriver.findElements(By.cssSelector("#nav_board_index > a")).size();// 断言帖子数目不为0Assertions.assertNotEquals(0,article_num);}/*** 帖子详情页检验* 校验帖子的标题不为空* 校验帖子的内容不为空*/
//    @Order(3)
//    @Test
//    void articleDetail(){
//        // 打开列表页
//        webDriver.get("http://150.158.82.121:58080/index.html");
//        // 找到需要查看的帖子标题并点击
//        webDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).click();
//        // 获取帖子的标题
//        String article_title = webDriver.findElement(By.cssSelector("#details_article_content_title")).getText();
//        // 断言帖子的标题不为空
//        Assertions.assertNotNull(article_title);
//        // 获取帖子的内容
//        String article_content = webDriver.findElement(By.cssSelector("#details_article_content > p")).getText();
//        // 断言帖子的内容不为空
//        Assertions.assertNotNull(article_content);
//    }/*** 发布帖子*/
//    @Order(4)
//    @Test
//    void publish_article() throws InterruptedException {
//        // 找到发布帖子的按钮
//        webDriver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")).click();
//        sleep(2000);
//        // 执行 js(选中标题输入框,输入标题)
//        ((JavascriptExecutor)webDriver).executeScript("document.querySelector(\"#article_post_title\").value=\"测试\"");
//        // 智能等待5秒
//        webDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
//        // 执行 js(选中内容输入框,输入内容)
//        ((JavascriptExecutor)webDriver).executeScript("document.querySelector(\"#edit-article > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre > span > span\").innerText=\"自动化测试\"");
//        sleep(5000);
//        // 点击发布按钮webDriver.findElement(By.cssSelector("#article_post_submit")).click();
//
//        WebElement element = webDriver.findElement(By.cssSelector("#article_post_submit"));
//        ((JavascriptExecutor) webDriver).executeScript("arguments[0].click();", element);
//        // 校验页面跳转到首页
//        String currentUrl = webDriver.getCurrentUrl();
//        Assertions.assertEquals("http://150.158.82.121:58080/index.html",currentUrl);
//        // 校验第一条帖子的标题是不是我们刚才发布的标题
//        String firstTitle = webDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).getText();
//        Assertions.assertEquals("测试",firstTitle);
//    }/*** 退出登录校验*/@Order(5)@Testvoid logOut() throws InterruptedException {webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);// 找到退出按钮并点击webDriver.findElement(By.cssSelector("#index_nav_avatar")).click();sleep(3000);webDriver.findElement(By.cssSelector("#index_user_logout")).click();sleep(3000);webDriver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);// 校验是否退回登录页String currentUrl = webDriver.getCurrentUrl();webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);Assertions.assertEquals("http://150.158.82.121:58080/sign-in.html",currentUrl);}
}

测试成功:

先进行基础功能的自动化测试~

其他详细的测试将不断在本篇文章中进行迭代。 

相关文章:

12. 自动化项目实战

目录 1. 登录测试 2. 测试首页的帖子列表数不为0 3. 帖子详情页校验 4. 发布帖子 5. 退出登录 自动化项目实施的基本流程如下图所示: 手工测试用例、自动化测试用例。 1. 登录测试 校验登录后主页显示的用户名称和登录时输入的用户名是否相等。 public class…...

Window11下载安装jdk8-jdk11与环境变量的配置

目录 一、下载jdk 二、安装jdk 三、配置环境变量 四、检查JDK是否配置成功 一、下载jdk jdk8下载链接:请点击网址 jdk11下载链接:请点击网址 二、安装jdk 按照提示一步一步安装即可。 默认安装位置:C:\Program Files\Java 三、配置…...

Vector Search with OpenAI Embeddings: Lucene Is All You Need

本文是LLM系列文章,针对《Vector Search with OpenAI Embeddings: Lucene Is All You Need》的翻译。 使用OpenAI嵌入的向量搜索:Lucence是你所需的一切 摘要1 引言2 从架构到实现3 实验4 讨论5 结论 摘要 我们在流行的MS MARCO文章排名测试集上使用Lu…...

JS算法与树(二)

前言 二叉搜索树(BST)存在一个问题:当你添加的节点数够多的时候,树的一边可能会非常的深。而其他的分支却只有几层。 AVL树 为了解决上面的问题,我们提出一种自平衡二叉搜索树。意思是任何一个节点左右两侧子树的高度之…...

composer 扩展库。助手库文档

composer helpers packagist 简介 death_satan/composer 作用于在有composer管理工具的项目中。封装了上层由 composer V2 提供的 ClassLoader 和 InstallVersion 轻量级的封装,无任何第三方包集成。便捷式的使用composer V2 API 安装要求 php > 7.4composer &g…...

Web弹性布局

/*弹性盒子 弹性布局 */ /* 默认从左到右 */ display: flex; /* 从右到左 */ /* flex-direction: row-reverse; */ /* 从上到下 */ /* flex-direction: column; */ …...

基于深度学习的AI生成式人脸图像鉴别

AIGC(AI内容生成)技术的快速发展确实为创作者提供了高效生产力工具,但同时也引发了一些问题和挑战。这些技术可以生成以假乱真的图像、视频换脸等,给不法分子提供了滥用的机会。其中,一些不法分子可能利用AIGC技术制造…...

iOS开发Swift-1-Xcode创建项目

1.创建项目 双击Xcode App,选择Create a new Xcode project。 选择创建一个iOS普通的App项目。选择Single View App,点击Next。 填写项目名,组织名称等,点击next。 选择好文件的存储路径,点击create。 2.为前端添加组件…...

AI 领域中 SLAM、Planning 和 Perception 的区别和联系

在人工智能(AI)领域,SLAM、Planning 和 Perception 是三个关键的概念,它们在机器人、自主驾驶车辆等领域中扮演着重要的角色。以下是它们之间的区别和联系: SLAM SLAM(Simultaneous Localization and Map…...

【数据库】MySQL基础知识全解

系列综述: 💞目的:本系列是个人整理为了秋招面试的,整理期间苛求每个知识点,平衡理解简易度与深入程度。 🥰来源:材料主要源于拓跋阿秀、小林coding等大佬博客进行的,每个知识点的修…...

【golang】调度系列之goroutine

前面的两篇,从相对比较简单的锁的内容入手(也是干货满满),开始了go的系列。这篇开始,进入更核心的内容。我们知道,go应该是第一门在语言层面支持协程的编程语言(可能是我孤陋寡闻),goroutine也完全算的上是go的门面。g…...

A 股个股资金流 API 数据接口

A 股个股资金流 API 数据接口 全量股票资金流数据,全量A股数据,最长30日历史数据 1. 产品功能 支持所有A股资金流数据查询;每日定时更新数据;支持多达 30 日历史数据查询;超高的查询效率,数据秒级返回&am…...

【前端】Layui动态数据表格拖动排序

目录 一、下载layui-soul-table 二、使用 三、Layui实际使用 1、html代码 2、JS代码 3、PHP后台代码 目的:使用Layui的数据表格,拖动行进行排序。 使用插件:layui-soul-table 和 Layui 1.layui-soul-table文档:https://…...

Linux 忘记密码解决方法

很多朋友经常会忘记Linux系统的root密码,linux系统忘记root密码的情况该怎么办呢?重新安装系统吗?答案是不需要进入单用户模式更改一下root密码即可。 步骤如下: 重启linux系统 3 秒之内要按一下回车,出现如下界面 …...

【计算机组成 课程笔记】2.1 设计自己的计算机

课程链接: 计算机组成_北京大学_中国大学MOOC(慕课) 2 - 1 - 201-设计自己的计算机(14‘24’‘)_哔哩哔哩_bilibili 什么是指令系统体系结构?这个问题其实非常简单,但要想解释清楚也没有那么容易。我们还是从一个小故事…...

vb房屋销售管理系统设计与实现

摘 要 当今社会经济高速发展,人们的生活节奏日益加快。随着人们生活水平的提高,相应地人们对住房的需求也随之增大,对于购房者来说,如何在琳琅满目的商品房中方便快捷的选择到自己称心如意的家居便成了一个难题;对于房屋开发商和销售商来说,如何对众多的房屋产品进行科…...

SpringCloud学习笔记(十三)_Zipkin使用SpringCloud Stream以及Elasticsearch

在前面的文章中,我们已经成功的使用Zipkin收集了项目的调用链日志。但是呢,由于我们收集链路信息时采用的是http请求方式收集的,而且链路信息没有进行保存,ZipkinServer一旦重启后就会所有信息都会消失了。基于性能的考虑&#xf…...

重仓“AI”的百度迎来收获季?

今年以来,由AIGC引发的“行业旋风”持续席卷各行各业,给沉闷已久的互联网赛道带来了一股暖流。这场AI旋风对于重仓押注AI的玩家而言,更是如同“久旱逢甘霖”,终于迎来了“柳暗花明”的一天。 作为重仓押注AI赛道的头部玩家&#x…...

Linux 通过 Docker 部署 Nacos 2.2.3 服务发现与配置中心

目录 环境准备Nacos 数据库创建Docker 部署 Nacos1. 创建挂载目录2. 下载镜像3. 创建和启动容器4. 访问控制台 导入 Nacos 配置SpringBoot 整合 Nacospom 依赖application.yml 配置 参考官方链接微服务商城源码 环境准备 名称版本IP端口Nacos2.2.3192.168.10.218848、9848MySQ…...

macOS上制作arm64的jdk17镜像

公司之前一直用的openjdk17的镜像,docker官网可以直接下载,但是最近对接的一个项目,对方用的是jdk17,在对接的时候有加解密异常的问题,为了排查是不是jdk版本的问题,需要制作jdk17的镜像。docker官网上的第…...

python打卡day49

知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

大型活动交通拥堵治理的视觉算法应用

大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...

STM32+rt-thread判断是否联网

一、根据NETDEV_FLAG_INTERNET_UP位判断 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…...

【磁盘】每天掌握一个Linux命令 - iostat

目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...

C++.OpenGL (10/64)基础光照(Basic Lighting)

基础光照(Basic Lighting) 冯氏光照模型(Phong Lighting Model) #mermaid-svg-GLdskXwWINxNGHso {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-GLdskXwWINxNGHso .error-icon{fill:#552222;}#mermaid-svg-GLd…...

蓝桥杯 冶炼金属

原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...

#Uniapp篇:chrome调试unapp适配

chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...

R语言速释制剂QBD解决方案之三

本文是《Quality by Design for ANDAs: An Example for Immediate-Release Dosage Forms》第一个处方的R语言解决方案。 第一个处方研究评估原料药粒径分布、MCC/Lactose比例、崩解剂用量对制剂CQAs的影响。 第二处方研究用于理解颗粒外加硬脂酸镁和滑石粉对片剂质量和可生产…...

无人机侦测与反制技术的进展与应用

国家电网无人机侦测与反制技术的进展与应用 引言 随着无人机(无人驾驶飞行器,UAV)技术的快速发展,其在商业、娱乐和军事领域的广泛应用带来了新的安全挑战。特别是对于关键基础设施如电力系统,无人机的“黑飞”&…...