一、项目背景
在数字营销蓬勃发展的当下,企业愈发重视借助在线活动来吸引并留存客户。抽奖活动作为一种高效的营销方式,能显著提升用户参与度与品牌曝光度。基于此,我们开发了一款以抽奖活动为核心场景的 Spring Boot 项目,旨在打造一个全面、可靠且易于维护的抽奖平台。该项目以java为开发语言,通过MyBatis进行数据库交互,利用Redis实现数据缓存来提升响应速度,结合RabbitMQ完成消息的异步传递,依托Spring Boot框架搭建稳定的抽奖系统。
二、功能概述
2.1 核心功能
核心功能主要包括:管理员注册、管路员登录、抽奖活动管理、人员管理、奖品管理、普通用户注册。
2.2 功能详情
1.管理员注册:未注册的用户可以点击注册进入注册页面,输入有效的用户名、密码、邮箱(唯一且格式正确),注册成功后跳转到用户登录页面。
2.管理员登录:登录包括两种方式一个是手机号密码登录一个是邮箱验证码登录。手机号密码登录已注册的管理员用户输入正确的用户名和密码登录,登陆成功后将进入活动列表页面;邮箱验证码登录,已注册的用户输入正确的邮箱和验证码进行登录,登录成功后进入活动列表页面。
3.抽奖活动管理:抽奖活动管理分为活动列表和新建抽奖活动。用户登录成功后默认跳转到活动列表页面,可以看到创建的活动名称以及活动的状态。点击新建抽奖活动页面跳转到创建抽奖活动,圈选文员以及奖品后创建活动(注意圈选人员数量大于等于圈选奖品数量)。
4.人员管理:人员管理分为人员列表和注册用户(普通用户)。人员列表可以看到已经注册的用户,还可以注册新的普通用户。
5.奖品管理:奖品管理分为奖品列表和创建奖品。奖品列表可以看到奖品的信息,创建奖品页面可以创建新的奖品
三、项目目标
1.功能目标:提供完整的抽奖管理功能,包括活动创建和管理、奖品配置、用户管理、抽奖执行、中奖记录查询与分享等
2.性能目标:支持高并发抽奖请求,确保系统在高负载的稳定性和响应速度,通过异步处理和缓存优化提升系统吞吐量
3.用户体验目标:提供流畅的用户交互体验,快速响应用户操作支持多种登录方式,提供清晰的中奖结果展示
四、测试环境
|------|---------------------------------------|
| 环境类型 | 配置详情 |
| 操作系统 | Windows11家庭中文版 |
| 浏览器 | Chrome 版本 145.0.7632.117(正式版本) (64 位) |
| jdk | jdk17 |
| 数据库 | mysql Ver 9.3.0 |
| 服务器 | 腾讯云(2核2G,Ubuntu 22.04) |
| 测试工具 | fiddler 、postman 、jmeter |
| 测试方法 | 自动化测试、手动测试 |
五、功能测试
5.1 测试用例

5.2 手动测试
5.2.1 登录页测试
5.2.1.1 正确登录(手机号密码登录)
1.输入正确的手机号+密码,点击登录
预期结果:登录成功,页面跳转至管理员页面
**实际结果:**如下
状态:通过


2.输入正确的邮箱+密码,点击登录
预期结果:登录成功,页面跳转至管理员页面
**实际结果:**如下
状态:通过


5.2.1.2 错误登录(手机号密码登录)
1..手机号和密码均未输入,直接点击登录
预期结果 :账号输入框和密码输入框下红色字体提示"请输入手机号&密码",页面未变动
实际结果:如下状态:通过

2..手机号正确,不输入密码直接点击登录
预期结果 :密码输入框下红色字体提示"请输入密码",页面未变动
实际结果:如下状态:通过

3.手机号输入格式错误,不输入密码直接点击登录
预期结果:手机号输入框下红色字体提示"手机号长度必须是11位",密码输入框下红色字体提示"请输入密码",页面未变动
实际结果:如下
状态:通过

4.手机号输入正确,密码输入错误格式
预期结果 :密码输入框下红色字体提示"密码长度至少为6个字符",页面未变动
实际结果:如下状态:通过

5.手机号输入正确,密码输入错误
预期结果 :出现弹窗"登录失败!密码错误"
实际结果:如下状态:通过

6.手机号未注册,密码输入格式正确
预期结果 :出现弹窗"登录失败!用户信息为空"
实际结果:如下状态:通过

7.手机号输入正确,密码输入正确,未点击登录
预期结果 :页面不跳转
实际结果:如下状态:通过

5.2.1.3 正确登录(邮箱验证码登录)
1.输入格式正确已注册的邮箱,输入验证码
预期结果:登录成功,页面跳转至管理员页面
**实际结果:**如下
状态:通过



5.2.1.4 错误登录(邮箱验证码登录)
1.邮箱验证码都不输入,点击登录
预期结果 :邮箱方框下出现红色字体"请输入您的邮",验证码方框下出现红色字体"请输入验证码",页面不跳转
实际结果:如下状态:通过

2.输入邮箱,点击登录
预期结果: 验证码方框下出现红色字体"请输入验证码",页面不跳转
实际结果:如下状态:通过

3..输入邮箱,输入错误的验证码,点击登录
预期结果: 出现弹窗**"** 登录失败!验证码校验失败"
实际结果:如下状态:通过

4.输入格式错误的邮箱,输入验证码,点击登录
预期结果: 出现弹窗**"** 登录失败!邮箱错误"
实际结果:如下状态:不通过(弹窗显示登录信息为空)

更正后:

5.输入正确的邮箱和验证码,未点击登录
预期结果: 页面不跳转
实际结果:如下状态:通过

5.2.2 管理员注册测试
5.2.2.1管理员正确注册
1.输入正确的信息,未点击登录
预期结果: 弹窗显示注册成功
实际结果:如下状态:通过

5.2.2.2管理员错误注册
1.未填写注册信息点击注册
预期结果: 方框下出现对应的请输入...提示,页面未跳转
实际结果:如下状态:通过

2.输入不符合要求格式的手机号,其他信息均正确
**预期结果:**出现弹窗"注册失败!手机号错误"
实际结果:如下
状态:通过

3.输入已注册的手机号,其他信息均正确
**预期结果:**出现弹窗"注册失败!手机号被使用"
实际结果:如下
状态:通过

4.输入不符合格式的邮箱,其他信息均正确
**预期结果:**出现弹窗"注册失败!邮箱错误"
实际结果:如下
状态:通过

5.输入不符合格式要求的密码,其他信息均正确
**预期结果:**密码方框下出现红色字体"密码长度至少为6个字符"
实际结果:如下
状态:通过

5.2.3 创建抽奖活动测试
5.2.3.1活动创建失败
1.什么都不圈选 点击创建
**预期结果:**出现提示请写此字段
实际结果:如下
状态:通过

2.填写活动名称和活动描述 什么都不圈选 点击创建按钮
**预期结果:**出现弹窗"请至少选择一个奖品"
实际结果:如下
状态:通过

3.填写活动名称和活动描述+圈选两个奖品,点击创建
预期结果: 出现弹窗"请至少选择一个人员, 人员数量应大于等于奖品总量"
实际结果:如下状态:通过

4.圈选奖品数大于圈选人员数 ,点击创建
预期结果: 出现弹窗"创建失败!活动关联的奖品及人员数量设置异常"
实际结果:如下状态:通过

5.2.3.2 活动创建成功
1.填写正确的活动名称和活动描述,圈选正确的人员和奖品数量点击创建
预期结果: 出现弹窗"创建成功!"
实际结果:如下状态:通过

5.2.4 活动列表
1**.点击活动列表进入活动列表展示**
预期结果 :显示全部活动,未结束活动排在已结束前,数据正常。
实际结果:如下状态:不通过

2**.点击活动列表的翻页按钮(首页点击下一页或者尾页点击上一页)**
预期结果 :数据正常展示,每页个数符合预期。
实际结果:如下状态:通过


3**.尾页点击"下一页"提示**
预期结果 :弹窗提示"已经是最后一页",不再向后翻页
实际结果:如下状态:通过

4.首页点击"上一页"提示
预期结果:弹窗提示"已经是第一页"
实际结果:如下
状态:通过

5.2.3奖品列表测试
1.点击奖品列表显示奖品信息
预期结果 :显示全部奖品,数据正常。
实际结果:状态:通过

2.点击奖品列表的翻页按钮(首页点击下一页或者尾页点击上一页)
预期结果 :数据正常展示,每页个数符合预期。
实际结果:如下状态:通过


3**.尾页点击"下一页"提示**
预期结果 :弹窗提示"已经是最后一页"
实际结果:如下状态:通过

4.首页点击"上一页"提示
预期结果:弹窗提示"已经是第一页"
实际结果:如下
状态:通过

5.2.4创建奖品测试
5.2.4.1创建奖品失败
1.什么都不填写直接创建
预期结果:方框下出现对应的红色提示
实际结果:如下
状态:通过

2.填写重复奖品名称
预期结果:奖品名称方框下出现提示"已有同名的奖品:测试"
实际结果:如下
状态:通过

3.价格输入为0,其他正确填写
预期结果:奖品价格方框下出现提示"奖品价格必须大于0"
实际结果:如下
状态:通过

4.输入过长的奖品名称或者奖品描述
预期结果:奖品价格方框下出红色的错误
实际结果:如下
状态:通过

5.输入过长的奖品描述
预期结果:奖品名称方框下出红色的错误
实际结果:如下
状态:通过

5.2.4.2 创建奖品成功
1.填写正确的奖品名称
预期结果:出现弹窗'奖品创建成功'
实际结果:如下
状态:通过

5.2.5用户注册测试
5.2.5.1注册失败
1.什么都不填写点击注册
预期结果:方框下出现对应的红色的字体
实际结果:如下
状态:通过

2.输入错误格式的邮箱,其他正确填写
预期结果:方框下出现对应的红色的字体"请输入有效的邮箱地址"
实际结果:如下
状态:通过

3.输入已经注册的手机号,其他正确填写
预期结果:出现弹窗显示"注册失败!手机号被使用"
实际结果:如下
状态:通过

4**.输入已注册的邮箱,其他正确填写**
预期结果:出现弹窗显示"注册失败!邮箱被使用"
实际结果:如下
状态:通过

5**.输入错误格式的手机号**
预期结果:出现弹窗显示"注册失败!手机号错误"
实际结果:如下
状态:通过

5.2.5.2 注册成功
1.填写正确的人员信息
预期结果:跳转到人员列表
实际结果:如下
状态:通过


5.2.6 用户列表测试
1.点击人员列表 进入人员列表页
预期结果:展示全部用户信息数据正常
实际结果:如下
状态:通过

5.2.7抽奖页面测试
1**.点击"活动进行中去抽奖",再点击"开始抽奖"、"点我确定"、"已抽完下一步",再次重复上次动作直到抽完**
预期结果:展示中奖信息
实际结果:如下
状态:通过





5.3 自动化测试
1.自动化测试准备工作关于Utils类
package com.example.lotterysystem.common;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import java.io.File;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.support.ui.WebDriverWait;
public class Utils {
public static WebDriver driver = null;
public static WebDriverWait wait = null;
public Utils(String url){
//调用driver对象
driver = createDriver();
driver.get(url);
wait = new WebDriverWait(driver,Duration.ofSeconds(12));
}
/**
* 获取驱动对象
*/
public static WebDriver createDriver()
{
if(driver == null){
//下载驱动
WebDriverManager.chromedriver().setup();
//添加配置
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
//创建驱动对象
driver = new ChromeDriver(options);
//隐士等待
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
}
return driver;
}
/**
* 屏幕截图
* 屏幕截图文件目录
* ./src/test/java/images/
*/
public void ScreenShot(String str) throws IOException {
//屏幕截图
SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");
String dirTime = sim1.format(System.currentTimeMillis());
String fileTime = sim2.format(System.currentTimeMillis());
String filename = "./src/test/java/com/example/lotterysystem/images/" + dirTime + "/" + str + "-" + fileTime + ".png";
File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
//srcFile放到指定位置
FileUtils.copyFile(srcFile,new File(filename));
}
/**
* 退出程序
*/
public static void quit(){
if(driver != null){
driver.quit();
}
}
}
2 .自动化测试RunTest类
package com.example.lotterysystem;
import com.example.lotterysystem.test.*;
import com.example.lotterysystem.test.CreateActivityPage;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
@SpringBootTest
public class RunTests {
@Autowired
private LoginPage loginPage;
@Test
public void runLoginTest() throws IOException, InterruptedException, NoSuchMethodException, UnsupportedFlavorException {
//注册
RegisterAdminPage registerAdminPage = new RegisterAdminPage();
registerAdminPage.check();
//登录
loginPage.check();
loginPage.loginSuccess();
// //登录之后页面进行检查
ActivityCenterPage activityCenterPage = new ActivityCenterPage();
activityCenterPage.activityListPage();
activityCenterPage.createActivityPage();
activityCenterPage.prizeListPage();
activityCenterPage.createPrizeListPage();
activityCenterPage.personListPage();
activityCenterPage.NormalRegisterPage();
// //创建奖品
CreatePrizePage createPrizePage = new CreatePrizePage();
createPrizePage.check();
// //奖品页面检查
PrizeListPage prizeListPage = new PrizeListPage();
prizeListPage.check();
// //注册普通用户 普通用户页面检查
RegisterNormalPage registerNormalPage = new RegisterNormalPage();
registerNormalPage.check();
// //创建活动
CreateActivityPage createActivityPage = new CreateActivityPage();
createActivityPage.check();
//活动页面检查
ActivityListPage activityListPage = new ActivityListPage();
activityListPage.check();
// //抽检(页面检查+抽奖)
LotteryPage lotteryPage = new LotteryPage();
lotteryPage.check();
activityCenterPage.exit();
}
}
5.3.1 管理员注册页面自动化测试
注册失败示例
1.未填写信息点击注册按钮 2.输入不符合要求格式的手机号 其他信息均正确 3.输入已注册的手机号 其他信息均正确 4.输入不符合格式得邮箱 其他均正确 5.输入不符合格式要求的密码 其他均正确
package com.example.lotterysystem.test;
import com.example.lotterysystem.common.Utils;
import org.junit.jupiter.api.Assertions;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;
import java.io.IOException;
/**
* 测试 管理员注册示例
*/
public class RegisterAdminPage extends Utils {
public final static String url = "http://127.0.0.1:8080/register.html?admin=true";
public RegisterAdminPage() {
super(url);
}
public void check() throws NoSuchMethodException, InterruptedException, IOException {
checkPageRight();
RegisterAdminFail();
RegisterAdminSuccess();
System.out.println("测试注册用例成功");
}
//测试 验证页面元素是否存在
public void checkPageRight() throws IOException {
//获取去页面url
String CurUrl = driver.getCurrentUrl();
//判断url是否相同
Assertions.assertEquals(url,CurUrl);
//填写注册信息文字是否存在
driver.findElement(By.cssSelector("body > div > h2"));
//查看页面中的姓名、邮箱、电话号码、密码、注册方框是否存在
driver.findElement(By.cssSelector("#name"));
driver.findElement(By.cssSelector("#mail"));
driver.findElement(By.cssSelector("#phoneNumber"));
driver.findElement(By.cssSelector("#password"));
driver.findElement(By.cssSelector("#registerForm > button"));
//截图
// ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
}
public void RegisterAdminFail() throws InterruptedException, IOException {
//清空
driver.findElement(By.cssSelector("#name")).clear();
driver.findElement(By.cssSelector("#mail")).clear();
driver.findElement(By.cssSelector("#phoneNumber")).clear();
driver.findElement(By.cssSelector("#password")).clear();
//情况一:未填写信息点击注册按钮
driver.findElement(By.cssSelector("#registerForm > button")).click();
Assertions.assertNotNull(driver.findElement(By.cssSelector("#name-error")));
Assertions.assertNotNull(driver.findElement(By.cssSelector("#mail-error")));
Assertions.assertNotNull(driver.findElement(By.cssSelector("#phoneNumber-error")));
Assertions.assertNotNull(driver.findElement(By.cssSelector("#password-error")));
//情况二:输入不符合要求格式的手机号 其他信息均正确
driver.findElement(By.cssSelector("#name")).sendKeys("贾宝玉");
driver.findElement(By.cssSelector("#mail")).sendKeys("34164582@qq.com");
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("1523678994");
driver.findElement(By.cssSelector("#password")).sendKeys("123456");
driver.findElement(By.cssSelector("#registerForm > button")).click();
wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
Assertions.assertEquals("注册失败!手机号错误",alert.getText());
alert.accept();
//清空
driver.findElement(By.cssSelector("#name")).clear();
driver.findElement(By.cssSelector("#mail")).clear();
driver.findElement(By.cssSelector("#phoneNumber")).clear();
driver.findElement(By.cssSelector("#password")).clear();
//情况三:输入已注册的手机号 其他信息均正确
driver.findElement(By.cssSelector("#name")).sendKeys("贾宝玉");
driver.findElement(By.cssSelector("#mail")).sendKeys("34164582@qq.com");
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("15111111111");
driver.findElement(By.cssSelector("#password")).sendKeys("123456");
driver.findElement(By.cssSelector("#registerForm > button")).click();
wait.until(ExpectedConditions.alertIsPresent());
alert = driver.switchTo().alert();
Assertions.assertEquals("注册失败!手机号被使用",alert.getText());
alert.accept();
//清空
driver.findElement(By.cssSelector("#name")).clear();
driver.findElement(By.cssSelector("#mail")).clear();
driver.findElement(By.cssSelector("#phoneNumber")).clear();
driver.findElement(By.cssSelector("#password")).clear();
//情况四:输入不符合格式得邮箱 其他均正确
driver.findElement(By.cssSelector("#name")).sendKeys("贾宝玉");
driver.findElement(By.cssSelector("#mail")).sendKeys("34164582@qq.c");
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("15111111119");
driver.findElement(By.cssSelector("#password")).sendKeys("123456");
driver.findElement(By.cssSelector("#registerForm > button")).click();
wait.until(ExpectedConditions.alertIsPresent());
alert = driver.switchTo().alert();
Assertions.assertEquals("注册失败!邮箱错误",alert.getText());
alert.accept();
//清空
driver.findElement(By.cssSelector("#name")).clear();
driver.findElement(By.cssSelector("#mail")).clear();
driver.findElement(By.cssSelector("#phoneNumber")).clear();
driver.findElement(By.cssSelector("#password")).clear();
//情况五:输入不符合格式要求的密码 其他均正确
driver.findElement(By.cssSelector("#name")).sendKeys("贾宝玉");
driver.findElement(By.cssSelector("#mail")).sendKeys("34164582@qq.com");
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("15111111119");
driver.findElement(By.cssSelector("#password")).sendKeys("123");
driver.findElement(By.cssSelector("#registerForm > button")).click();
//校验提示信息是否准备
Assertions.assertEquals("密码长度至少为6个字符",
driver.findElement(By.cssSelector("#password-error")).getText());
Assertions.assertEquals("http://127.0.0.1:8080/register.html?admin=true",driver.getCurrentUrl());
// ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
}
public void RegisterAdminSuccess() throws IOException {
//清空
driver.findElement(By.cssSelector("#name")).clear();
driver.findElement(By.cssSelector("#mail")).clear();
driver.findElement(By.cssSelector("#phoneNumber")).clear();
driver.findElement(By.cssSelector("#password")).clear();
//注册成功
driver.findElement(By.cssSelector("#name")).sendKeys("贾宝玉");
driver.findElement(By.cssSelector("#mail")).sendKeys("34164582@qq.com");
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("15111111119");
driver.findElement(By.cssSelector("#password")).sendKeys("123456");
driver.findElement(By.cssSelector("#registerForm > button")).click();
wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
Assertions.assertEquals("注册成功,去登录!",alert.getText());
alert.accept();
}
}
5.3.2管理员登录页面自动化测试
1.手机号密码登录失败示例
1.手机号未输入 密码未输入直接点击登录按钮 2.手机号输入非11位无密码 3.手机号输入正确 密码长度不正确 4.手机号输入正确 密码长度正确 密码错误 5.手机号未注册 密码输入格式正确 6.手机号密码正确 没有点击登录按钮 7.手机号正确,不输入密码直接点击登录
邮箱验证码登录失败示例
1.只填写写邮箱没有验证码 2.填写邮箱 点击验证码 验证码不对 3不输入直接点击登录 4.输入错误格式的邮箱,输入验证码点击登录 5.输入正确的邮箱和验证码 未点击登录
package com.example.lotterysystem.test;
import com.example.lotterysystem.common.Utils;
import com.example.lotterysystem.service.VerificationCodeService;
import org.junit.jupiter.api.Assertions;
import org.openqa.selenium.*;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.io.IOException;
/**
* 测试 登录示例
*/
@Component
public class LoginPage extends Utils {
@Autowired
private VerificationCodeService verificationCodeService;
//活动登录url
private final static String url = "http://127.0.0.1:8080/blogin.html";
//初始化页面
public LoginPage(){
super(url);
}
public void check() throws IOException, NoSuchMethodException, InterruptedException {
checkPageRight();
loginFail();
loginSuccess();
System.out.println("测试登陆成功");
}
/**
* 测试登录页面是否可以正常打开
*/
public void checkPageRight() throws InterruptedException, IOException {
//获取去页面url
String CurUrl = driver.getCurrentUrl();
//判断url是否相同
Assertions.assertEquals(url,CurUrl);
//验证图片是否存在
Assertions.assertNotNull(driver.findElement(By.cssSelector("body > div > div.img-box.col-sm-6.col-md-6.col-lg-7.col-xl-7 > img")));
//验证密码登录按钮是否存在
driver.findElement(By.cssSelector("body > div > div.login-container.col-sm-6.col-md-6.col-lg-5.col-xl-5 > div.tab-box > span.active.tab-span"));
//验证手机号输入框是否存在
driver.findElement(By.cssSelector("#phoneNumber"));
//验证密码输入框是否存在
driver.findElement(By.cssSelector("#password"));
//验证登录框是否存在
driver.findElement(By.cssSelector("#loginForm > button"));
//验证验证码登录按钮是否正常
driver.findElement(By.cssSelector("body > div > div.login-container.col-sm-6.col-md-6.col-lg-5.col-xl-5 > div.tab-box > span:nth-child(2)"));
//点击后跳转邮箱登录
driver.findElement(By.cssSelector("body > div > div.login-container.col-sm-6.col-md-6.col-lg-5.col-xl-5 > div.tab-box > span:nth-child(2)")).click();
//验证邮箱输入框是否存在
driver.findElement(By.cssSelector("#loginMobile"));
//验证验证码输入框是否存在
driver.findElement(By.cssSelector("#verificationCode"));
//验证获取验证码框是否存在
driver.findElement(By.cssSelector("#getVerificationCode"));
//验证登录按框是否存在
driver.findElement(By.cssSelector("#codeForm > button"));
//验证注册按钮
driver.findElement(By.cssSelector("body > div > div.login-container.col-sm-6.col-md-6.col-lg-5.col-xl-5 > div.register-link > a"));
//点击注册按钮是否跳转到注册页面
driver.findElement(By.cssSelector("body > div > div.login-container.col-sm-6.col-md-6.col-lg-5.col-xl-5 > div.register-link > a")).click();
CurUrl = driver.getCurrentUrl();
String newUrl = "http://127.0.0.1:8080/register.html?admin=true";
Assertions.assertEquals(newUrl,CurUrl);
//放回上一页
driver.navigate().back();
// ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
}
/**
* 测试:登录失败
*/
public void loginFail() throws IOException, InterruptedException {
/**
* 对于密码登录失败测试
*/
driver.findElement(By.xpath("/html/body/div/div[2]/div[1]/span[1]")).click();
//清空
driver.findElement(By.cssSelector("#phoneNumber")).clear();
driver.findElement(By.cssSelector("#password")).clear();
//情况一:手机号未输入 密码未输入直接点击登录按钮
driver.findElement(By.cssSelector("#loginForm > button")).click();
driver.findElement(By.cssSelector("#phoneNumber-error"));
driver.findElement(By.cssSelector("#password-error"));
//清空
driver.findElement(By.cssSelector("#phoneNumber")).clear();
driver.findElement(By.cssSelector("#password")).clear();
//情况二:手机号输入非11位无密码
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("1511111");
driver.findElement(By.cssSelector("#loginForm > button")).click();
driver.findElement(By.cssSelector("#phoneNumber-error"));
driver.findElement(By.cssSelector("#password-error"));
// 刷新当前页面
driver.navigate().refresh();
//情况三:手机号输入正确 密码长度不正确
driver.findElement(By.cssSelector("#phoneNumber")).click();
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("15111111111");
driver.findElement(By.cssSelector("#password")).sendKeys("123");
driver.findElement(By.cssSelector("#loginForm > button")).click();
driver.findElement(By.cssSelector("#password-error"));
//清空
driver.findElement(By.cssSelector("#phoneNumber")).clear();
driver.findElement(By.cssSelector("#password")).clear();
//情况四:手机号输入正确 密码长度正确 密码错误
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("15111111111");
driver.findElement(By.cssSelector("#password")).sendKeys("1234567");
driver.findElement(By.cssSelector("#loginForm > button")).click();
//等待alert出现并验证提示文本
wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
Assertions.assertEquals("登录失败!密码错误", alert.getText());
alert.accept();
//验证页面未跳转
Assertions.assertEquals("http://127.0.0.1:8080/blogin.html", driver.getCurrentUrl());
//清除
driver.findElement(By.cssSelector("#phoneNumber")).clear();
driver.findElement(By.cssSelector("#password")).clear();
//情况五:手机号未注册 密码输入格式正确
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("15111111129");
driver.findElement(By.cssSelector("#password")).sendKeys("123456789");
driver.findElement(By.cssSelector("#loginForm > button")).click();
wait.until(ExpectedConditions.alertIsPresent());
alert = driver.switchTo().alert();
Assertions.assertEquals("登录失败!用户信息为空",alert.getText());
alert.accept();
//清除
driver.findElement(By.cssSelector("#phoneNumber")).clear();
driver.findElement(By.cssSelector("#password")).clear();
//情况六:手机号密码正确 没有点击登录按钮
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("15111111111");
driver.findElement(By.cssSelector("#password")).sendKeys("123456");
Assertions.assertEquals("http://127.0.0.1:8080/blogin.html", driver.getCurrentUrl());
//清除
driver.findElement(By.cssSelector("#phoneNumber")).clear();
driver.findElement(By.cssSelector("#password")).clear();
//情况七:手机号正确,不输入密码直接点击登录
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("15111111111");
driver.findElement(By.cssSelector("#loginForm > button")).click();
driver.findElement(By.cssSelector("#password-error"));
/**
* 对于邮箱验证码登录失败测试
*/
//点击验证码登录
driver.findElement(By.cssSelector("body > div > div.login-container.col-sm-6.col-md-6.col-lg-5.col-xl-5 > div.tab-box > span:nth-child(2)")).click();
//清除内容
driver.findElement(By.cssSelector("#loginMobile")).clear();
driver.findElement(By.cssSelector("#verificationCode")).clear();
//情况一:只填写写邮箱没有验证码
driver.findElement(By.cssSelector("#loginMobile")).sendKeys("3418774864@qq.com");
driver.findElement(By.cssSelector("#codeForm > button")).click();
Assertions.assertNotNull(driver.findElement(By.cssSelector("#verificationCode-error")));
//清除输入框内容
driver.findElement(By.cssSelector("#loginMobile")).clear();
driver.findElement(By.cssSelector("#verificationCode")).clear();
//情况二:填写邮箱 点击验证码 验证码不对
driver.findElement(By.cssSelector("#loginMobile")).sendKeys("3418774864@qq.com");
driver.findElement(By.cssSelector("#getVerificationCode")).click();
driver.findElement(By.cssSelector("#verificationCode")).sendKeys("0000");
driver.findElement(By.cssSelector("#codeForm > button")).click();
wait.until(ExpectedConditions.alertIsPresent());
alert = driver.switchTo().alert();
Assertions.assertEquals("登录失败!验证码校验失败",alert.getText());
alert.accept();
//校验页面未跳转
Assertions.assertEquals("http://127.0.0.1:8080/blogin.html", driver.getCurrentUrl());
//清除输入框内容
driver.findElement(By.cssSelector("#loginMobile")).clear();
driver.findElement(By.cssSelector("#verificationCode")).clear();
//情况三:不输入直接点击登录
driver.findElement(By.cssSelector("#codeForm > button")).click();
driver.findElement(By.cssSelector("#verificationCode-error"));
driver.findElement(By.cssSelector("#loginMobile-error"));
//清除输入框内容
driver.findElement(By.cssSelector("#loginMobile")).clear();
driver.findElement(By.cssSelector("#verificationCode")).clear();
//情况四:输入错误格式的邮箱,输入验证码点击登录
driver.findElement(By.cssSelector("#loginMobile")).sendKeys("3418774864@qq.co");
driver.findElement(By.cssSelector("#verificationCode")).sendKeys("0000");
driver.findElement(By.cssSelector("#codeForm > button")).click();
wait.until(ExpectedConditions.alertIsPresent());
alert = driver.switchTo().alert();
Assertions.assertEquals("登录失败!邮箱错误",alert.getText());
alert.accept();
//清除输入框内容
driver.findElement(By.cssSelector("#loginMobile")).clear();
driver.findElement(By.cssSelector("#verificationCode")).clear();
//情况五:输入正确的邮箱和验证码 未点击登录
driver.findElement(By.cssSelector("#loginMobile")).sendKeys("3418774864@qq.com");
//点击获取验证码
driver.findElement(By.cssSelector("#getVerificationCode")).click();
//等待一小段时间 从redis中获取验证码
String mail = "3418774864@qq.com";
String verifyCode = null;
long start = System.currentTimeMillis();
long timeout = 5000; // 最大等待5秒
while (verifyCode == null && System.currentTimeMillis() - start < timeout) {
verifyCode = verificationCodeService.getVerificationCode(mail);
Thread.sleep(200); // 每次查询间隔200毫秒
}
System.out.println(verifyCode);
//校验验证码,为null则直接抛出异常,避免sendKeys(null)
if (verifyCode == null) {
throw new RuntimeException("超时未从Redis获取到验证码,邮箱:" + mail);
}
//点击验证码输入框输入验证码
driver.findElement(By.cssSelector("#verificationCode")).sendKeys(verifyCode);
Assertions.assertEquals("http://127.0.0.1:8080/blogin.html", driver.getCurrentUrl());
// ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
}
/**
* 测试:登录成功
*/
public void loginSuccess() throws InterruptedException, IOException {
//点击密码登录
driver.findElement(By.xpath("/html/body/div/div[2]/div[1]/span[1]")).click();
//清除
driver.findElement(By.cssSelector("#phoneNumber")).clear();
driver.findElement(By.cssSelector("#password")).clear();
//输入手机号和密码
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("15111111111");
driver.findElement(By.cssSelector("#password")).sendKeys("123456789");
driver.findElement(By.cssSelector("#loginForm > button")).click();
Thread.sleep(100);
driver.findElement(By.cssSelector("body > div.header-box"));
//返回上一页
driver.navigate().back();
//点击邮箱登录
driver.findElement(By.cssSelector("body > div > div.login-container.col-sm-6.col-md-6.col-lg-5.col-xl-5 > div.tab-box > span:nth-child(2)")).click();
//输入框输入邮箱
driver.findElement(By.cssSelector("#loginMobile")).clear();
driver.findElement(By.cssSelector("#verificationCode")).clear();
//输入框输入邮箱
driver.findElement(By.cssSelector("#loginMobile")).sendKeys("3418774864@qq.com");
//点击获取验证码
driver.findElement(By.cssSelector("#getVerificationCode")).click();
//等待一小段时间 从redis中获取验证码
String mail = "3418774864@qq.com";
String verifyCode = null;
long start = System.currentTimeMillis();
long timeout = 5000; // 最大等待5秒
while (verifyCode == null && System.currentTimeMillis() - start < timeout) {
verifyCode = verificationCodeService.getVerificationCode(mail);
Thread.sleep(200); // 每次查询间隔200毫秒
}
System.out.println(verifyCode);
//校验验证码,为null则直接抛出异常,避免sendKeys(null)
if (verifyCode == null) {
throw new RuntimeException("超时未从Redis获取到验证码,邮箱:" + mail);
}
//点击验证码输入框输入验证码
driver.findElement(By.cssSelector("#verificationCode")).sendKeys(verifyCode);
//点击登录
driver.findElement(By.cssSelector("#codeForm > button")).click();
//验证是否跳转到主页
Assertions.assertNotNull(driver.findElement(By.cssSelector("body > div.header-box")));
// ScreenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
}
}
2.登录之后页面的测试
登录之后活动中心页面的测试
package com.example.lotterysystem.test;
import com.example.lotterysystem.common.Utils;
import org.junit.jupiter.api.Assertions;
import org.openqa.selenium.By;
import java.io.IOException;
public class ActivityCenterPage extends Utils {
public static String url = "http://127.0.0.1:8080/admin.html";
public ActivityCenterPage() {
super(url);
}
/**
* 测试活动列表页面
*/
public void activityListPage(){
//测试图标能否正常显示
driver.findElement(By.cssSelector("body > div.header-box > div.logo-box > img"));
Assertions.assertEquals(driver.findElement(By.cssSelector("body > div.cont-box > div.sidebar > ul > li:nth-child(1) > div")).getText(),"活动管理");
//点击活动列表页面是否正常显示
driver.findElement(By.cssSelector("#activitiesList")).click();
driver.switchTo().frame(0);
//活动列表页面元素是否都存在
Assertions.assertEquals(driver.findElement(By.cssSelector("body > div > h2")).getText(),"活动列表");
//活动列表
driver.findElement(By.cssSelector("#activities"));
//首页 尾页 上一页 下一页
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(1)"));
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(2)"));
driver.findElement(By.cssSelector("#pageInput"));
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(4)"));
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(5)"));
System.out.println("测试活动列表页面");
}
/**
* 测试 新建活动列表页 能否正常打开
*/
public void createActivityPage(){
//切换回主页面
driver.switchTo().defaultContent();
driver.findElement(By.cssSelector("#createActivity")).click();
//切换到frame
driver.switchTo().frame(0);
//检查标题名称是否相同
Assertions.assertEquals(driver.findElement(By.cssSelector("body > div.container > h2")).getText(),"创建抽奖活动");
//检查活动名称
Assertions.assertEquals(driver.findElement(By.cssSelector("#activityForm > div:nth-child(1) > label")).getText(),"活动名称");
driver.findElement(By.cssSelector("#activityName"));
//检查活动描述
Assertions.assertEquals(driver.findElement(By.cssSelector("#activityForm > div.form-group.desc-row > label")).getText(),"活动描述");
driver.findElement(By.cssSelector("#description"));
//检查圈选奖品按钮 #prizesContainer > div:nth-child(2)
driver.findElement(By.cssSelector("#buttonPrizes"));
driver.findElement(By.cssSelector("#buttonPrizes")).click();
//奖品列表
driver.findElement(By.cssSelector("#prizesModal > div > h2"));
driver.findElement(By.cssSelector("#prizesModal > div > div.prize-item"));
driver.findElement(By.cssSelector("#prizesContainer"));
//取消确定按钮
driver.findElement(By.cssSelector("#prizesModal > div > div.form-btn-box > button.btn.btn-primary"));
driver.findElement(By.cssSelector("#prizesModal > div > div.form-btn-box > button.btn.btn-secondary.pre-btn"));
//x
driver.findElement(By.cssSelector("#prizesModal > div > h2 > span")).click();
//检查圈选人员按钮
driver.findElement(By.cssSelector("#buttonUsers"));
driver.findElement(By.cssSelector("#buttonUsers")).click();
//人员列表
driver.findElement(By.cssSelector("#usersModal > div > h2"));
driver.findElement(By.cssSelector("#usersContainer"));
//取消确定按钮
driver.findElement(By.cssSelector("#usersModal > div > div.form-btn-box > button.btn.btn-secondary.pre-btn"));
driver.findElement(By.cssSelector("#usersModal > div > div.form-btn-box > button.btn.btn-primary"));
//x
driver.findElement(By.cssSelector("#usersModal > div > h2 > span")).click();
//检查创建活动
driver.findElement(By.cssSelector("#createActivity"));
System.out.println("测试新建活动列表页成功");
}
/**
* 测试奖品列表页 能否正常打开
*/
public void prizeListPage(){
//切换回主页
driver.switchTo().defaultContent();
driver.findElement(By.cssSelector("body > div.cont-box > div.sidebar > ul > li:nth-child(2) > ul > li:nth-child(1) > a")).click();
//切换到 frame
driver.switchTo().frame(0);
//奖品列表
driver.findElement(By.cssSelector("body > div > h2"));
driver.findElement(By.cssSelector("body > div > div.table-box"));
//首页 尾页 上一页 下一页
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(1)"));
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(2)"));
driver.findElement(By.cssSelector("#pageInput"));
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(4)"));
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(5)"));
System.out.println("测试奖品列表页成功");
}
/**
* 测试创建奖品列表
*/
public void createPrizeListPage(){
//切换回首页
driver.switchTo().defaultContent();
driver.findElement(By.cssSelector("body > div.cont-box > div.sidebar > ul > li:nth-child(2) > ul > li:nth-child(2) > a")).click();
driver.switchTo().frame(0);
//标题
driver.findElement(By.cssSelector("body > div > h2"));
//奖品名称栏
driver.findElement(By.cssSelector("#prizeRows > div > div:nth-child(1) > label"));
driver.findElement(By.cssSelector("#prizeName"));
//奖品图片
driver.findElement(By.cssSelector("#prizeRows > div > div:nth-child(2) > label"));
driver.findElement(By.cssSelector("#prizeImageUrl"));
//奖品价格
driver.findElement(By.cssSelector("#prizeRows > div > div:nth-child(3) > label"));
driver.findElement(By.cssSelector("#price"));
//奖品描述
driver.findElement(By.cssSelector("#prizeRows > div > div:nth-child(4) > label"));
driver.findElement(By.cssSelector("#description"));
//创建奖品
driver.findElement(By.cssSelector("body > div > button"));
System.out.println("测试创建奖品列表成功");
}
/**
* 测试人员列表
*/
public void personListPage() throws InterruptedException {
//切换回首页
driver.switchTo().defaultContent();
//点击人员列表
driver.findElement(By.cssSelector("#userList")).click();
driver.switchTo().frame(0);
//人员id
driver.findElement(By.cssSelector("body > div > div > table > thead > tr > th:nth-child(1)"));
//姓名
driver.findElement(By.cssSelector("body > div > div > table > thead > tr > th:nth-child(2)"));
//身份
driver.findElement(By.cssSelector("body > div > div > table > thead > tr > th:nth-child(3)"));
driver.findElement(By.cssSelector("body > div > div"));
System.out.println("测试人员列表成功");
}
/**
* 测试注册普通用户
*/
public void NormalRegisterPage(){
//切换回首页
driver.switchTo().defaultContent();
driver.findElement(By.cssSelector("#register")).click();
driver.switchTo().frame(0);
//验证标题
Assertions.assertEquals(driver.findElement(By.cssSelector("body > div > h2")).getText(),"填写注册信息");
//验证信息栏
Assertions.assertEquals(driver.findElement(By.cssSelector("#registerForm > div:nth-child(1) > label")).getText(),"姓名");
driver.findElement(By.cssSelector("#name"));
//验证邮箱栏
Assertions.assertEquals(driver.findElement(By.cssSelector("#registerForm > div:nth-child(2) > label")).getText(),"邮箱");
driver.findElement(By.cssSelector("#mail"));
//验证手机号栏
Assertions.assertEquals(driver.findElement(By.cssSelector("#registerForm > div:nth-child(3) > label")).getText(),"手机号");
driver.findElement(By.cssSelector("#phoneNumber"));
//验证注册按钮
driver.findElement(By.cssSelector("#registerForm > button"));
System.out.println("测试注册普通用户页面成功");
}
/**
* 测试 退出 按钮
*/
public void exit() throws IOException, InterruptedException {
// 切换回主页面
driver.switchTo().defaultContent();
//点击退出按钮
driver.findElement(By.cssSelector("body > div.header-box > div.user-box > div > span")).click();
String actualUrl = driver.getCurrentUrl();
String expectUrl = "http://127.0.0.1:8080/blogin.html";
Assertions.assertEquals(expectUrl, actualUrl);
driver.quit();
}
}
5.3.3 注册普通用户自动化测试
注册普通用户 失败案例
1.什么都不填写 点击注册
2.输入错误格式的邮箱
3.输入错误格式的手机号
4.输入已注册的手机号
5.输入已注册的邮箱
package com.example.lotterysystem.test;
import com.example.lotterysystem.common.Utils;
import org.junit.jupiter.api.Assertions;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;
public class RegisterNormalPage extends Utils {
public static String url = "http://127.0.0.1:8080/admin.html";
public RegisterNormalPage() {
super(url);
}
public void check(){
checkPageRight();
registerFail();
registerSuc();
System.out.println("普通用户注册页面测试成功");
}
/**
* 页面元素
*/
public void checkPageRight(){
//切换回首页
driver.switchTo().defaultContent();
driver.findElement(By.cssSelector("#register")).click();
driver.switchTo().frame(0);
//验证标题
Assertions.assertEquals(driver.findElement(By.cssSelector("body > div > h2")).getText(),"填写注册信息");
//验证信息栏
Assertions.assertEquals(driver.findElement(By.cssSelector("#registerForm > div:nth-child(1) > label")).getText(),"姓名");
driver.findElement(By.cssSelector("#name"));
//验证邮箱栏
Assertions.assertEquals(driver.findElement(By.cssSelector("#registerForm > div:nth-child(2) > label")).getText(),"邮箱");
driver.findElement(By.cssSelector("#mail"));
//验证手机号栏
Assertions.assertEquals(driver.findElement(By.cssSelector("#registerForm > div:nth-child(3) > label")).getText(),"手机号");
driver.findElement(By.cssSelector("#phoneNumber"));
//验证注册按钮
driver.findElement(By.cssSelector("#registerForm > button"));
}
/**
* 注册失败
*/
public void registerFail(){
//点击注册用户按钮跳转到注册用户
driver.switchTo().defaultContent();
driver.findElement(By.cssSelector("#register")).click();
driver.switchTo().frame(0);
//情况一:什么都不填写 点击注册
driver.findElement(By.cssSelector("#registerForm > button")).click();
driver.findElement(By.cssSelector("#name-error"));
driver.findElement(By.cssSelector("#mail-error"));
driver.findElement(By.cssSelector("#phoneNumber-error"));
//情况二:输入错误格式的邮箱
driver.findElement(By.cssSelector("#name")).sendKeys("测试");
driver.findElement(By.cssSelector("#mail")).sendKeys("123");
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("14111111111");
driver.findElement(By.cssSelector("#registerForm > button")).click();
driver.findElement(By.cssSelector("#mail-error"));
//清空
driver.findElement(By.cssSelector("#name")).clear();
driver.findElement(By.cssSelector("#mail")).clear();
driver.findElement(By.cssSelector("#phoneNumber")).clear();
//情况三:输入错误格式的手机号
driver.findElement(By.cssSelector("#name")).sendKeys("测试");
driver.findElement(By.cssSelector("#mail")).sendKeys("123@qq.com");
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("1411111111");
driver.findElement(By.cssSelector("#registerForm > button")).click();
wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
Assertions.assertEquals("注册失败!手机号错误",alert.getText());
alert.accept();
//清空
driver.findElement(By.cssSelector("#name")).clear();
driver.findElement(By.cssSelector("#mail")).clear();
driver.findElement(By.cssSelector("#phoneNumber")).clear();
//情况四:输入已注册的手机号
driver.findElement(By.cssSelector("#name")).sendKeys("测试");
driver.findElement(By.cssSelector("#mail")).sendKeys("123@qq.com");
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("15111111111");
driver.findElement(By.cssSelector("#registerForm > button")).click();
wait.until(ExpectedConditions.alertIsPresent());
alert = driver.switchTo().alert();
Assertions.assertEquals("注册失败!手机号被使用",alert.getText());
alert.accept();
//清空
driver.findElement(By.cssSelector("#name")).clear();
driver.findElement(By.cssSelector("#mail")).clear();
driver.findElement(By.cssSelector("#phoneNumber")).clear();
//情况五:输入已注册的邮箱
driver.findElement(By.cssSelector("#name")).sendKeys("测试");
driver.findElement(By.cssSelector("#mail")).sendKeys("3418774864@qq.com");
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("14111111111");
driver.findElement(By.cssSelector("#registerForm > button")).click();
wait.until(ExpectedConditions.alertIsPresent());
alert = driver.switchTo().alert();
Assertions.assertEquals("注册失败!邮箱被使用",alert.getText());
alert.accept();
}
public void registerSuc(){
//清空
driver.findElement(By.cssSelector("#name")).clear();
driver.findElement(By.cssSelector("#mail")).clear();
driver.findElement(By.cssSelector("#phoneNumber")).clear();
//注册
driver.findElement(By.cssSelector("#name")).sendKeys("测试");
driver.findElement(By.cssSelector("#mail")).sendKeys("123@qq.com");
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("14111111278");
driver.findElement(By.cssSelector("#registerForm > button")).click();
driver.findElement(By.cssSelector("body > div > h2"));
}
}
5.3.4 人员列表自动化测试
测试页面显示
package com.example.lotterysystem.test;
import com.example.lotterysystem.common.Utils;
import org.openqa.selenium.By;
public class PersonListPage extends Utils {
public static String url = "http://127.0.0.1:8080/admin.html";
public PersonListPage() {
super(url);
}
public void checkPageRight(){
// 切换回主页面
driver.switchTo().defaultContent();
driver.findElement(By.cssSelector("#userList")).click();
driver.switchTo().frame(0);
// "人员列表"
driver.findElement(By.cssSelector("body > div > h2"));
// "人员id"
driver.findElement(By.cssSelector("body > div > div > table > thead > tr > th:nth-child(1)"));
// "姓名"
driver.findElement(By.cssSelector("body > div > div > table > thead > tr > th:nth-child(2)"));
// "身份"
driver.findElement(By.cssSelector("body > div > div > table > thead > tr > th:nth-child(3)"));
//总方框
driver.findElement(By.cssSelector("body > div > div"));
}
}
5.3.5 创建奖品自动化测试
1.什么都不填写直接创建
2.填写重复奖品名称
3.价格输入0,其他正确填写
4.输入过长的奖品名称
5.输入过长的奖品描述
package com.example.lotterysystem.test;
import com.example.lotterysystem.common.Utils;
import org.junit.jupiter.api.Assertions;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;
public class CreatePrizePage extends Utils {
public static String url = "http://127.0.0.1:8080/admin.html";
public CreatePrizePage() {
super(url);
}
public void check() throws InterruptedException {
checkPageRight();
createPrizeFail();
createPrizeSuc();
System.out.println("创建奖品测试成功");
}
public void checkPageRight(){
driver.switchTo().defaultContent();
driver.findElement(By.cssSelector("body > div.cont-box > div.sidebar > ul > li:nth-child(2) > ul > li:nth-child(2) > a")).click();
driver.switchTo().frame(0);
// "开始创建奖品"
driver.findElement(By.cssSelector("body > div > h2"));
// "奖品名称"
driver.findElement(By.cssSelector("#prizeRows > div > div:nth-child(1) > label"));
// "奖品名称" 输入框
driver.findElement(By.cssSelector("#prizeName"));
// "奖品图片"
driver.findElement(By.cssSelector("#prizeRows > div > div:nth-child(2) > label"));
// "上传图片框"
driver.findElement(By.cssSelector("#prizeImageUrl"));
// "奖品价格"
driver.findElement(By.cssSelector("#prizeRows > div > div:nth-child(3) > label"));
// "奖品价格" 输入框
driver.findElement(By.cssSelector("#price"));
// "奖品描述"
driver.findElement(By.cssSelector("#prizeRows > div > div:nth-child(4) > label"));
// "奖品描述" 输入框
driver.findElement(By.cssSelector("#description"));
// "创建奖品" 按钮
driver.findElement(By.cssSelector("body > div > button"));
}
/**
* 创建奖品
*/
public void createPrizeFail() throws InterruptedException {
//1.创建奖品失败 (什么都不填写直接创建)
driver.switchTo().defaultContent();
driver.findElement(By.cssSelector("body > div.cont-box > div.sidebar > ul > li:nth-child(2) > ul > li:nth-child(2) > a")).click();
driver.switchTo().frame(0);
driver.findElement(By.cssSelector("body > div > button")).click();
//处理弹窗
driver.findElement(By.cssSelector("#prizeNameError"));
driver.findElement(By.cssSelector("#priceError"));
driver.findElement(By.cssSelector("#descriptionError"));
//2.填写重复奖品名称
driver.findElement(By.cssSelector("#prizeName")).sendKeys("测试");
Thread.sleep(1000);
driver.findElement(By.cssSelector("#prizeImageUrl")).sendKeys("C:\\Users\\刘媛媛\\OneDrive\\图片\\cs.png");
Thread.sleep(1000);
driver.findElement(By.cssSelector("#price")).sendKeys("200");
driver.findElement(By.cssSelector("#description")).sendKeys("测试描述");
driver.findElement(By.cssSelector("body > div > button")).click();
driver.findElement(By.cssSelector("#prizeNameError"));
//清空
driver.findElement(By.cssSelector("#prizeName")).clear();
driver.findElement(By.cssSelector("#price")).clear();
driver.findElement(By.cssSelector("#description")).clear();
//3.价格输入0,其他正确填写
driver.findElement(By.cssSelector("#prizeName")).sendKeys("测试2016");
driver.findElement(By.cssSelector("#price")).sendKeys("0");
driver.findElement(By.cssSelector("#description")).sendKeys("测试描述");
driver.findElement(By.cssSelector("body > div > button")).click();
Assertions.assertEquals(driver.findElement(By.cssSelector("#priceError")).getText(),
"奖品价格必须大于 0");
//清空
driver.findElement(By.cssSelector("#prizeName")).clear();
driver.findElement(By.cssSelector("#price")).clear();
driver.findElement(By.cssSelector("#description")).clear();
//4.输入过长的奖品名称
driver.findElement(By.cssSelector("#prizeName")).sendKeys("测试测试测试测试测试测试测试测试测试测" +
"试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试测试");
driver.findElement(By.cssSelector("#price")).sendKeys("200");
driver.findElement(By.cssSelector("#description")).sendKeys("测试描述");
driver.findElement(By.cssSelector("body > div > button")).click();
Assertions.assertEquals(driver.findElement(By.cssSelector("#prizeNameError")).getText(),
"奖品名称长度不能超过 50 个字符");
//清空
driver.findElement(By.cssSelector("#prizeName")).clear();
driver.findElement(By.cssSelector("#price")).clear();
driver.findElement(By.cssSelector("#description")).clear();
//5.输入过长的奖品描述
driver.findElement(By.cssSelector("#prizeName")).sendKeys("年会抽奖2016");
driver.findElement(By.cssSelector("#price")).sendKeys("200");
driver.findElement(By.cssSelector("#description")).sendKeys("测试描述测试描述测试" +
"测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试" +
"描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试" +
"描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测" +
"试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述" +
"测试描述测试描述测试描述测试描述测试描述测试描述测试描述" +
"测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述测试描述");
driver.findElement(By.cssSelector("body > div > button")).click();
Assertions.assertEquals(driver.findElement(By.cssSelector("#descriptionError")).getText(),
"奖品描述长度不能超过 200 个字符");
}
public void createPrizeSuc() throws InterruptedException {
//创建奖品成功
driver.navigate().refresh();
driver.switchTo().defaultContent();
driver.findElement(By.cssSelector("body > div.cont-box > div.sidebar > ul > li:nth-child(2) > ul > li:nth-child(2) > a")).click();
driver.switchTo().frame(0);
driver.findElement(By.cssSelector("#prizeName")).sendKeys("测试创建奖品");
Thread.sleep(1000);
driver.findElement(By.cssSelector("#prizeImageUrl")).sendKeys("C:\\Users\\刘媛媛\\OneDrive\\图片\\cs.png");
Thread.sleep(1000);
driver.findElement(By.cssSelector("#price")).sendKeys("20");
driver.findElement(By.cssSelector("#description")).sendKeys("测试描述");
driver.findElement(By.cssSelector("body > div > button")).click();
//处理弹窗
wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
Assertions.assertEquals("奖品创建成功!",alert.getText());
alert.accept();
}
}
5.3.6 奖品列表自动化测试
1.测试界面元素
2.测试翻页情况
package com.example.lotterysystem.test;
import com.example.lotterysystem.common.Utils;
import org.junit.jupiter.api.Assertions;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
/**
* 奖品列表测试
*/
public class PrizeListPage extends Utils {
public static String url = "http://127.0.0.1:8080/admin.html";
public PrizeListPage() {
super(url);
}
public void check() throws InterruptedException {
checkPageRight();
button();
System.out.println("奖品列表测试成功");
}
/**
* 页面元素测试
*/
public void checkPageRight() {
// 切换回主页
driver.switchTo().defaultContent();
driver.findElement(By.cssSelector("body > div.cont-box > div.sidebar > ul > li:nth-child(2) > ul > li:nth-child(1) > a")).click();
driver.switchTo().frame(0);
// "奖品列表"
driver.findElement(By.cssSelector("body > div > h2"));
// "奖品id"
driver.findElement(By.cssSelector("body > div > div.table-box > table > thead > tr > th:nth-child(1)"));
// "奖品图"
driver.findElement(By.cssSelector("body > div > div.table-box > table > thead > tr > th:nth-child(2)"));
// "奖品名"
driver.findElement(By.cssSelector("body > div > div.table-box > table > thead > tr > th:nth-child(3)"));
// "奖品描述"
driver.findElement(By.cssSelector("body > div > div.table-box > table > thead > tr > th:nth-child(4)"));
// "奖品价值"
driver.findElement(By.cssSelector("body > div > div.table-box > table > thead > tr > th:nth-child(5)"));
// "首页" 按钮
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(1)"));
// "上一页" 按钮
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(2)"));
//页面显示方框
driver.findElement(By.cssSelector("#pageInput"));
// "下一页" 按钮
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(4)"));
// "尾页" 按钮
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(5)"));
}
//界面按钮测试
public void button() throws InterruptedException {
//页面显示方框
WebElement pageInput = driver.findElement(By.cssSelector("#pageInput"));
//点击下一页
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(4)")).click();
//获取页面显示框中的数字
Thread.sleep(2500);
String pageValue = pageInput.getAttribute("value");
assertTrue(Integer.parseInt(pageValue) > 1, "页码应该增加");
//点击上一页
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(2)")).click();
Thread.sleep(2500);
pageValue = pageInput.getAttribute("value");
assertEquals("1", pageValue, "页码应该回到第一页");
//点击尾页
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(5)")).click();
//获取页面显示框中的数字
Thread.sleep(2000);
pageValue = pageInput.getAttribute("value");
assertTrue(Integer.parseInt(pageValue) > 1, "页码应该增加");
//点击首页
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(1)")).click();
Thread.sleep(2000);
pageValue = pageInput.getAttribute("value");
assertEquals("1", pageValue, "页码应该回到第一页");
//点击上一页
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(2)")).click();
wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
assertEquals("已经是第一页",alert.getText());
alert.accept();
//点击尾页之后在点击下一页
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(5)")).click();
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(4)")).click();
wait.until(ExpectedConditions.alertIsPresent());
alert = driver.switchTo().alert();
assertEquals("已经是最后一页",alert.getText());
alert.accept();
}
}
5.3.7 新建抽奖活动自动化测试
1.什么都不输入圈选,点击创建 2.填写活动名称和活动描述 ,什么都不圈选,点击创建按钮 3.填写活动名称和活动描述+圈选两个奖品,点击创建 4.圈选奖品数大于圈选人员数,点击创建
package com.example.lotterysystem.test;
import com.example.lotterysystem.common.Utils;
import org.junit.jupiter.api.Assertions;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.Select;
public class CreateActivityPage extends Utils {
public static String url = "http://127.0.0.1:8080/admin.html";
public CreateActivityPage() {
super(url);
}
public void check(){
checkPageRight();
createPrizeFail();
createPrizeSuc();
System.out.println("测试创建活动成功");
}
public void checkPageRight(){
//切换回主页面
driver.switchTo().defaultContent();
driver.findElement(By.cssSelector("#createActivity")).click();
//切换到frame
driver.switchTo().frame(0);
//检查标题名称是否相同
Assertions.assertEquals(driver.findElement(By.cssSelector("body > div.container > h2")).getText(),"创建抽奖活动");
//检查活动名称
Assertions.assertEquals(driver.findElement(By.cssSelector("#activityForm > div:nth-child(1) > label")).getText(),"活动名称");
driver.findElement(By.cssSelector("#activityName"));
//检查活动描述
Assertions.assertEquals(driver.findElement(By.cssSelector("#activityForm > div.form-group.desc-row > label")).getText(),"活动描述");
driver.findElement(By.cssSelector("#description"));
//检查圈选奖品按钮 #prizesContainer > div:nth-child(2)
driver.findElement(By.cssSelector("#buttonPrizes"));
driver.findElement(By.cssSelector("#buttonPrizes")).click();
//奖品列表
driver.findElement(By.cssSelector("#prizesModal > div > h2"));
driver.findElement(By.cssSelector("#prizesModal > div > div.prize-item"));
driver.findElement(By.cssSelector("#prizesContainer"));
//取消确定按钮
driver.findElement(By.cssSelector("#prizesModal > div > div.form-btn-box > button.btn.btn-primary"));
driver.findElement(By.cssSelector("#prizesModal > div > div.form-btn-box > button.btn.btn-secondary.pre-btn"));
//x
driver.findElement(By.cssSelector("#prizesModal > div > h2 > span")).click();
//检查圈选人员按钮
driver.findElement(By.cssSelector("#buttonUsers"));
driver.findElement(By.cssSelector("#buttonUsers")).click();
//人员列表
driver.findElement(By.cssSelector("#usersModal > div > h2"));
driver.findElement(By.cssSelector("#usersContainer"));
//取消确定按钮
driver.findElement(By.cssSelector("#usersModal > div > div.form-btn-box > button.btn.btn-secondary.pre-btn"));
driver.findElement(By.cssSelector("#usersModal > div > div.form-btn-box > button.btn.btn-primary"));
//x
driver.findElement(By.cssSelector("#usersModal > div > h2 > span")).click();
//检查创建活动
driver.findElement(By.cssSelector("#createActivity"));
}
/**
* 创建失败
*/
public void createPrizeFail(){
//情况一:什么都不输入圈选,点击创建
driver.findElement(By.cssSelector("#createActivity")).click();
//查看是否有提示
driver.findElement(By.cssSelector("#activityName-error "));
driver.findElement(By.cssSelector("#description-error"));
//情况二:填写活动名称和活动描述 什么都不圈选 点击创建按钮
driver.findElement(By.cssSelector("#activityName")).sendKeys("测试");
driver.findElement(By.cssSelector("#description")).sendKeys("测试");
driver.findElement(By.cssSelector("#createActivity")).click();
//处理弹窗 请至少选择一个奖品
wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
Assertions.assertEquals("请至少选择一个奖品",alert.getText());
alert.accept();
//情况三:填写活动名称和活动描述+圈选两个奖品,点击创建
driver.findElement(By.cssSelector("#buttonPrizes")).click();
//勾选两个 第一个设置为二等奖
driver.findElement(By.cssSelector("#prize-18")).click();
WebElement levelSelect = driver.findElement(By.cssSelector("#prizesContainer > div:nth-child(1) > select"));
Select select = new Select(levelSelect);
select.selectByIndex(1);
//第二个奖品设置为 三等奖
driver.findElement(By.cssSelector("#prize-19")).click();
levelSelect = driver.findElement(By.cssSelector("#prizesContainer > div:nth-child(2) > select"));
select = new Select(levelSelect);
select.selectByIndex(2);
//确定
driver.findElement(By.cssSelector("#prizesModal > div > div.form-btn-box > button.btn.btn-primary")).click();
//创建活动
driver.findElement(By.cssSelector("#createActivity")).click();
//处理弹窗
wait.until(ExpectedConditions.alertIsPresent());
alert = driver.switchTo().alert();
Assertions.assertEquals("请至少选择一个人员, 人员数量应大于等于奖品总量",alert.getText());
alert.accept();
//情况四:圈选奖品数大于 圈选人员数 点击创建
//圈选人员
driver.findElement(By.cssSelector("#buttonUsers")).click();
driver.findElement(By.cssSelector("#user-45")).click();
driver.findElement(By.cssSelector("#usersModal > div > div.form-btn-box > button.btn.btn-primary")).click();
//点击创建
driver.findElement(By.cssSelector("#createActivity")).click();
//处理弹窗
wait.until(ExpectedConditions.alertIsPresent());
alert = driver.switchTo().alert();
Assertions.assertEquals("创建失败!活动关联的奖品及人员数量设置异常",alert.getText());
alert.accept();
}
/**
* 创建成功
*/
public void createPrizeSuc(){
//再圈选一位人员
driver.findElement(By.cssSelector("#buttonUsers")).click();
driver.findElement(By.cssSelector("#user-47")).click();
driver.findElement(By.cssSelector("#usersModal > div > div.form-btn-box > button.btn.btn-primary")).click();
//点击创建 创建成功!
driver.findElement(By.cssSelector("#createActivity")).click();
//创建成功
wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
Assertions.assertEquals("创建成功!",alert.getText());
alert.accept();
}
}
5.3.8 活动列表自动化测试
1.测试界面元素
2.测试翻页情况
package com.example.lotterysystem.test;
import com.example.lotterysystem.common.Utils;
import org.junit.jupiter.api.Assertions;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
public class ActivityListPage extends Utils {
public static String url = "http://127.0.0.1:8080/admin.html";
public ActivityListPage() {
super(url);
}
public void check() throws InterruptedException {
checkPageRight();
button();
System.out.println("活动列表测试成功");
}
public void checkPageRight(){
driver.switchTo().defaultContent();
//点击活动列表页面是否正常显示
driver.findElement(By.cssSelector("#activitiesList")).click();
driver.switchTo().frame(0);
//活动列表页面元素是否都存在
Assertions.assertEquals(driver.findElement(By.cssSelector("body > div > h2")).getText(),"活动列表");
//活动列表
driver.findElement(By.cssSelector("#activities"));
//首页 尾页 上一页 下一页
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(1)"));
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(2)"));
driver.findElement(By.cssSelector("#pageInput"));
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(4)"));
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(5)"));
}
//界面按钮测试
public void button() throws InterruptedException {
//页面显示方框
WebElement pageInput = driver.findElement(By.cssSelector("#pageInput"));
//点击下一页
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(4)")).click();
//获取页面显示框中的数字
Thread.sleep(2500);
String pageValue = pageInput.getAttribute("value");
assertTrue(Integer.parseInt(pageValue) > 1, "页码应该增加");
//点击上一页
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(2)")).click();
Thread.sleep(2500);
pageValue = pageInput.getAttribute("value");
assertEquals("1", pageValue, "页码应该回到第一页");
//点击尾页
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(5)")).click();
//获取页面显示框中的数字
Thread.sleep(2000);
pageValue = pageInput.getAttribute("value");
assertTrue(Integer.parseInt(pageValue) > 1, "页码应该增加");
//点击首页
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(1)")).click();
Thread.sleep(2000);
pageValue = pageInput.getAttribute("value");
assertEquals("1", pageValue, "页码应该回到第一页");
//点击上一页
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(2)")).click();
wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
assertEquals("已经是第一页",alert.getText());
alert.accept();
//点击尾页之后在点击下一页
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(5)")).click();
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(4)")).click();
wait.until(ExpectedConditions.alertIsPresent());
alert = driver.switchTo().alert();
assertEquals("已经是最后一页",alert.getText());
alert.accept();
}
}
5.3.9抽奖页面测试
1.测试界面元素
2.测试抽奖过程
package com.example.lotterysystem.test;
import com.example.lotterysystem.common.Utils;
import org.junit.jupiter.api.Assertions;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.io.IOException;
import java.util.Set;
/**
* 抽奖测试
*/
public class LotteryPage extends Utils {
public static String url = "http://127.0.0.1:8080/admin.html";
public LotteryPage() {
super(url);
}
public void check() throws InterruptedException, IOException, UnsupportedFlavorException {
testPage();
lotteryPage();
System.out.println("抽奖页面测试成功");
}
/**
* 页面元素
*/
public void testPage() throws InterruptedException {
// 抽奖页面
driver.switchTo().frame(0);
String actualText = driver.findElement(By.cssSelector("#activities > div:nth-child(1) > div.active > p > a")).getText();
System.out.println(actualText);
Assertions.assertEquals("活动进行中,去抽奖", actualText);
driver.findElement(By.cssSelector("#activities > div:nth-child(1) > div.active > p > a")).click();
// 切换句柄
Thread.sleep(3000);
String cur = driver.getWindowHandle();
Set<String> all = driver.getWindowHandles();
for(String w :all){
if(!w.equals(cur)){
driver.switchTo().window(w);
}
}
// 测试名称
driver.findElement(By.cssSelector("#title"));
// 描述
driver.findElement(By.cssSelector("#disc"));
// 图片
driver.findElement(By.cssSelector("#image"));
// "查看上一奖项" 按钮
driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.pre-btn"));
// "开始抽奖" 按钮
driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.next-btn"));
}
/**
* 抽奖(两次)
*/
public void lotteryPage() throws IOException, UnsupportedFlavorException, InterruptedException {
// 第一次
// 点击 "开始抽奖"
driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.next-btn")).click();
// 点击 "点我确定"
driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.next-btn")).click();
// 点击 "已抽完,下一步"
driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.next-btn")).click();
// 第二次
// 点击 "开始确定"
driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.next-btn")).click();
// 点击 "点我确定"
driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.next-btn")).click();
// 点击 "已抽完,下一步"
driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.next-btn")).click();
// "已全部抽完"
String actualText2 = driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.next-btn")).getText();
Assertions.assertEquals("已全部抽完", actualText2);
// 点击 "分享结果" 按钮
driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.copy-btn")).click();
// 处理弹窗
wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
Assertions.assertEquals("链接已复制到剪贴板", alert.getText());
alert.accept();
// 返回活动列表页,查看活动状态
driver.get(url);
driver.switchTo().defaultContent();
driver.findElement(By.cssSelector("#activitiesList")).click();
Thread.sleep(4000);
driver.navigate().refresh();
driver.switchTo().frame(0);
String actualText1 = driver.findElement(By.cssSelector("#activities > div:nth-child(8) > div.inactive > p > a")).getText();
System.out.println(actualText1);
Assertions.assertEquals("活动已完成,查看中奖名单", actualText1);
}
}
5.4 接口测试
1.注册接口


2 .登录接口



3.发送验证码接口

4.验证码登录接口

5.查看管理员用户信息

6.查看普通用户信息

7.创建奖品接口

8.获取奖品列表接口

9.创建活动列表接口

10.查找活动列表接口

11.查找活动详情接口

12.抽奖接口

13.获取中奖记录接口

六、性能测试




1.聚合报告
2.TPS

3.响应时间

**关键指标分析:**整体 TPS 表现,多数接口的 TPS 稳定在 12-20 之间,核心交互与查询类接口(如创建活动接口、抽奖接口、查询活动详情接口)的 TPS 峰值可达 22-23,事务处理效率处于较高水平,系统单位时间承载能力较强。波动特征:在 00:00:31 左右出现多接口 TPS 峰值(部分接口达 22-23),随后在 12-20 区间内持续波动,说明测试期间系统多次承受梯度压力冲击,仍具备良好的压力消解与负载自适应能力,整体运行状态未出现断裂或雪崩。最低阈值保障:所有接口的 TPS 均未低于 3,全程无 "事务中断""请求无响应" 等异常情况,核心业务链路(活动查询、奖品管理、用户信息、抽奖、中奖记录)的事务处理连续性得到充分保障,未出现服务宕机或请求丢失。
**总结:**本次性能测试结果,抽奖系统整体性能表现优异,事务处理能力与接口稳定性均达到预期结果。稳定期 TPS 维持在 12-20 区间,峰值接近 23,全程接口成功率 100%,响应时间控制在合理水平,系统可有效支撑梯度压力冲击,核心业务链路无中断风险;但部分接口(如发送验证码、创建活动)存在短暂响应峰值,后续可针对性优化接口响应效率,进一步提升系统吞吐量与整代码段 小部件
七、兼容性测试
场景一:以edge浏览器进行测试

场景二:以chrome浏览器进行测试

结果:两个浏览器均可正常兼容网站
八、安全测试
场景一:未登录状况下,是否能访问除登陆外的其它板块
结果:无法访问且将强制到登录页面

场景二: 用户密码是否在数据库加密
结果:用户的密码在数据库中已加密

场景三: 用户手机号是否在数据库加密
结果:用户的手机号在数据库中已加密

九、缺陷列表
BUG-LOTTERY-001
- 严重程度: P2
- 缺陷描述: 使用格式错误邮箱进行验证码登录,并没有校验出格式错误,而是出现弹窗"用户未注册"
- 状态:已修复,修复后如下

十、测试小结
本次测试覆盖的功能、性能、兼容性、安全性等核心指标均满足上线标准 ,建议项目可按计划上线。