一、项目概述
1.项目背景
基于 Spring Boot 开发的在线抽奖管理平台,支持活动创建、奖品管理、用户管理、抽奖执行和中奖记录查询等功能。具备异常回滚机制,确保业务处理正常,中奖数据不会丢失,中奖结果通过邮箱、短信通知。
2.项目结构
- 管理员模块:登录、注册
- 普通用户模块:用户列表、普通用户注册
- 奖品模块:奖品列表、奖品创建
- 活动模块:活动列表、创建活动
- 抽奖模块:抽奖活动、中奖结果展示
3.测试环境
操作系统:Windows 11
浏览器:Chrome
测试工具:Selenium、JMeter、postman
二、测试用例







三、功能测试
1.手动测试
1.1登录页面测试
1.1.1密码登录
测试场景一:手机号和密码都不填
预期结果:系统提示手机号、密码为空

测试场景二:手机号填写正确和密码填写正确(手机号格式不正确)
预期结果:弹窗提醒"登录失败,登录方式不存在"

测试场景三:手机号填写错误和密码填写正确(手机号格式正确)
预期结果:弹窗提醒"登录失败用户信息为空"

测试场景四:手机号正确,密码错误(密码格式错误)
预期结果:系统提醒"密码长度至少为6个字符"

测试场景五:手机号正确,密码错误(密码格式正确)
预期结果:弹窗提醒"登录失败密码错误"

测试场景六:手机号正确,密码正确
预期结果:跳转到活动中心页

1.1.2 验证码登录
测试场景一:手机号和验证码都为空
预期结果:系统提示"手机、验证码为空"

测试场景二:手机号错误和验证码正确
预期结果:弹窗提醒"登录失败用户信息为空"

测试场景三:手机号正确和验证码不正确
预期结果:弹窗提醒"登录失败验证码错误"

测试场景四:手机号和验证码都正确
预期结果:进去活动中心页

1.2 注册管理员用户页面测试
测试场景一:所有都为空
预测场景:系统提示为空

测试场景二:密码格式错误,其他正确
预测场景:系统提示密码长度至少为6个字符

测试场景三:全部正确
预测场景:弹窗"注册成功,点击确定",成功跳转登录页

1.3 用户列表页面测试
测试场景一:点击人员列表
预测场景:正常显示人员列表

1.4 注册普通用户页面测试
测试场景一:姓名、邮箱和手机号都为空
预期结果:系统提示姓名、邮箱、手机号为空

测试场景二:全部正确填写
预期结果:跳转人员列表

1.5 奖品列表页面测试
测试场景一:点击奖品列表
预测场景:正常显示奖品列表

1.6 创建奖品页面测试
测试场景一:全部空着提交
预测场景:弹窗"创建失败"

测试场景二:只填奖品名称、其他不填
预测场景:弹窗"创建失败"


测试场景三:全部正常填写
预测场景:弹窗"创建成功"
1.7 活动页面测试
测试场景一:点击活动列表
预测场景:正常显示活动列表

1.8 创建活动页面测试
测试场景一:都空着
预测场景:系统提示为空

测试场景二:填写活动名称和奖品描述,未圈选奖品和人员
预测场景:弹窗提醒"请至少选择一个奖品"

测试场景三:填写活动名称和奖品描述,圈选奖品,未圈选人员
预测场景:弹窗提醒"请至少选择一个人员"

测试场景四:填写活动名称和奖品描述,圈选奖品,圈选人员(圈选人员人数比奖品多)
预测场景:弹窗提示创建成功,跳转活动列表


1.9抽奖页面测试
测试场景一:正常抽奖流程
预期结果:展示中奖者名单
1.10 中奖者展示页面测试
测试用例一:查看抽奖结束后的名单
预期结果:展示名单
2. 自动化测试
2.1 工具类
Maven 依赖配置
XML
<!-- Selenium 依赖 -->
<dependency>
<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>4.24.0</version>
<scope>test</scope>
</dependency>
<!-- WebDriverManager 依赖 -->
<dependency>
<groupId>io.github.bonigarcia</groupId>
<artifactId>webdrivermanager</artifactId>
<version>5.9.2</version>
<scope>test</scope>
</dependency>
<!-- Apache Commons IO 依赖,用于截图保存 -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.16.1</version>
<scope>test</scope>
</dependency>
自动化测试工具类
Utils.java
java
package common;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.edge.EdgeDriver;
import org.openqa.selenium.edge.EdgeOptions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;
public class Utils {
public static WebDriver driver = null;
public WebDriverWait wait = null;
public static String detailUrl = "";
public Utils(String url){
driver = createDriver();
driver.get(url);
wait = new WebDriverWait(driver, Duration.ofSeconds(3));
}
public static WebDriver createDriver(){
if(driver == null){
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
options.addArguments("--no-sandbox");
options.addArguments("--disable-dev-shm-usage");
options.addArguments("--headless");
options.addArguments("--disable-gpu");
options.addArguments("--window-size=1920,1080");
driver = new ChromeDriver(options);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
}
return driver;
}
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/images/" + dirTime + "/" + str + "-" + fileTime + ".png";
File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(srcFile, new File(fileName));
}
public static void quit(){
if (driver != null){
driver.quit();
}
}
}
自动化测试案例
UserRegisterTest.java
java
package com.example.lotterysystem;
import common.Utils;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
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.WebDriverWait;
import java.io.IOException;
import java.time.Duration;
import java.util.List;
public class UserRegisterTest {
private static Utils utils;
@BeforeAll
public static void setUp() {
// 启动浏览器并打开注册页面
utils = new Utils("http://localhost:8080/register.html");
}
@Test
public void testUserRegister() throws IOException {
// 等待页面加载
WebDriverWait wait = new WebDriverWait(utils.driver, Duration.ofSeconds(10));
// 等待所有输入框加载完成
wait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.tagName("input")));
// 获取所有输入框
List<WebElement> inputElements = utils.driver.findElements(By.tagName("input"));
// 输入姓名(第一个输入框)
if (inputElements.size() > 0) {
inputElements.get(0).sendKeys("testuser");
}
// 输入邮箱(第二个输入框)
if (inputElements.size() > 1) {
inputElements.get(1).sendKeys("test@example.com");
}
// 输入手机号(第三个输入框)
if (inputElements.size() > 2) {
inputElements.get(2).sendKeys("13800138000");
}
// 输入密码(第四个输入框)
if (inputElements.size() > 3) {
inputElements.get(3).sendKeys("123456");
}
// 点击注册按钮(使用标签名定位)
WebElement registerButton = wait.until(ExpectedConditions.elementToBeClickable(By.tagName("button")));
registerButton.click();
// 等待结果
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 处理弹出的提示框
try {
Alert alert = wait.until(ExpectedConditions.alertIsPresent());
System.out.println("Alert text: " + alert.getText());
alert.accept(); // 点击确定按钮
} catch (Exception e) {
// 没有弹出框,继续执行
}
// 截图保存
utils.screenShot("register_result");
}
@AfterAll
public static void tearDown() {
// 关闭浏览器
Utils.quit();
}
}
运行测试的命令
java
# 清理并重新编译项目
.\mvnw clean test-compile
# 运行测试
.\mvnw test -Dtest=UserRegisterTest
2.2 注册测试类
自动化测试工具类(Utils.java)
java
package common;
import io.github.bonigarcia.wdm.WebDriverManager;
import org.apache.commons.io.FileUtils;
import org.openqa.selenium.OutputType;
import org.openqa.selenium.TakesScreenshot;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.io.File;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.time.Duration;
public class Utils {
public static WebDriver driver = null;
public WebDriverWait wait = null;
public Utils(String url){
driver = createDriver();
driver.get(url);
wait = new WebDriverWait(driver, Duration.ofSeconds(3));
}
public static WebDriver createDriver(){
if(driver == null){
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
options.addArguments("--no-sandbox");
options.addArguments("--headless");
driver = new ChromeDriver(options);
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
}
return driver;
}
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/images/" + dirTime + "/" + str + "-" + fileTime + ".png";
File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
FileUtils.copyFile(srcFile, new File(fileName));
}
public static void quit(){
if (driver != null){
driver.quit();
}
}
}
注册测试类
RegisterPage.java
java
package tests;
import common.Utils;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;
import java.io.IOException;
public class RegisterPage extends Utils {
public static String url = "http://8.134.19.72:8080/register.html?admin=true";
private static RegisterPage registerPage;
@BeforeAll
public static void setUp() {
registerPage = new RegisterPage();
}
public RegisterPage() {
super(url);
}
@Test
public void checkPage() throws IOException {
String title = driver.findElement(By.cssSelector("body > div > h2")).getText();
assert title.equals("填写注册信息");
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());
}
@Test
public void registerFail() {
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("zy");
driver.findElement(By.cssSelector("#mail")).sendKeys("127@qq.com");
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("13805141117");
driver.findElement(By.cssSelector("#password")).sendKeys("123456");
driver.findElement(By.cssSelector("#registerForm > button")).click();
wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
alert.accept();
}
@Test
public void registerSuccess() {
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("zmh");
driver.findElement(By.cssSelector("#mail")).sendKeys("128@qq.com");
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("19067399268");
driver.findElement(By.cssSelector("#password")).sendKeys("123456");
driver.findElement(By.cssSelector("#registerForm > button")).click();
wait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
alert.accept();
}
@AfterAll
public static void tearDown() {
Utils.quit();
}
}
输出结果

2.3 登陆测试
LoginPage.java
java
package tests;
import common.Utils;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
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.WebDriverWait;
import java.io.IOException;
import java.time.Duration;
public class LoginPage extends Utils {
public static String url = "http://8.134.19.72:8080/blogin.html";
private static LoginPage loginPage;
@BeforeAll
public static void setUp() {
loginPage = new LoginPage();
}
public LoginPage() {
super(url);
}
@Test
public void checkPage() throws IOException {
// 等待页面加载
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(15));
longWait.until(ExpectedConditions.presenceOfAllElementsLocatedBy(By.tagName("input")));
// 检查元素
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(1)"));
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("#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.register-link > a"));
screenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
}
@Test
public void loginFail(){
// 使用更长的等待时间
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(15));
// 先点击密码登录标签
WebElement passwordLoginTab = longWait.until(ExpectedConditions.elementToBeClickable(
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(1)")
));
passwordLoginTab.click();
// 等待手机号输入框可交互
WebElement mobileInput = longWait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#phoneNumber")));
WebElement passwordInput = longWait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#password")));
// 清空输入框
mobileInput.clear();
passwordInput.clear();
// 正确用户名,错误密码
mobileInput.sendKeys("13019523030");
passwordInput.sendKeys("1234567");
driver.findElement(By.cssSelector("#loginForm > button")).click();
// 等待弹窗出现,处理弹窗
longWait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
alert.accept();
}
@Test
public void loginSuccess(){
// 使用更长的等待时间
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(15));
// 先点击密码登录标签
WebElement passwordLoginTab = longWait.until(ExpectedConditions.elementToBeClickable(
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(1)")
));
passwordLoginTab.click();
// 等待手机号输入框可交互
WebElement mobileInput = longWait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#phoneNumber")));
WebElement passwordInput = longWait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#password")));
// 清空输入框
mobileInput.clear();
passwordInput.clear();
// 正确登录
mobileInput.sendKeys("13019523030");
passwordInput.sendKeys("123456");
driver.findElement(By.cssSelector("#loginForm > button")).click();
}
@AfterAll
public static void tearDown() {
// 关闭浏览器
Utils.quit();
}
}
命令执行
java
# 使用 Maven Wrapper 运行测试
.\mvnw test -Dtest=LoginPage
运行日志
INFO\] Running tests.LoginPage 21:38:33.031 \[main\] INFO io.github.bonigarcia.wdm.WebDriverManager -- Using chromedriver 147.0.7727.57 (resolved driver for Chrome 147) \[INFO\] Tests run: 3, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 5.942 s -- in tests.LoginPage \[INFO\] BUILD SUCCESS
2.4 活动中心测试
java
package tests;
import common.Utils;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import java.io.IOException;
import java.time.Duration;
import java.util.List;
import java.util.Set;
public class ActivePage extends Utils {
public static String loginUrl = "http://8.134.19.72:8080/blogin.html";
public static String adminUrl = "http://8.134.19.72:8080/admin.html";
private static ActivePage activePage;
@BeforeAll
public static void setUp() {
activePage = new ActivePage();
activePage.loginFirst();
}
public ActivePage() {
super(loginUrl);
}
public void loginFirst() {
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(20));
// 先点击密码登录标签
WebElement passwordLoginTab = longWait.until(ExpectedConditions.elementToBeClickable(
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(1)")
));
passwordLoginTab.click();
// 等待手机号输入框可交互
WebElement mobileInput = longWait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#phoneNumber")));
WebElement passwordInput = longWait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#password")));
// 清空输入框
mobileInput.clear();
passwordInput.clear();
// 正确登录
mobileInput.sendKeys("13019523030");
passwordInput.sendKeys("123456");
driver.findElement(By.cssSelector("#loginForm > button")).click();
// 等待URL变化
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
// 输出当前URL
System.out.println("After login, current URL: " + driver.getCurrentUrl());
// 看看页面是否有alert
try {
Alert alert = driver.switchTo().alert();
System.out.println("Alert text: " + alert.getText());
alert.accept();
} catch (Exception e) {
System.out.println("No alert found");
}
// 再等待URL变化
try {
Thread.sleep(3000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("After waiting, current URL: " + driver.getCurrentUrl());
// 直接导航到adminUrl
ensureOnAdminPage();
System.out.println("Final URL: " + driver.getCurrentUrl());
}
/**
* 确保在admin页面
*/
private void ensureOnAdminPage() {
if (!driver.getCurrentUrl().contains(adminUrl)) {
driver.get(adminUrl);
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(15));
longWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("body")));
}
}
@Test
public void checkPage() throws IOException {
ensureOnAdminPage();
// 等待页面加载
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(15));
longWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("body")));
// 先截图看看页面结构
screenShot("checkPage-before");
// 先检查页面是否加载了,获取当前URL
System.out.println("Current URL: " + driver.getCurrentUrl());
System.out.println("Page title: " + driver.getTitle());
// 尝试检查一些基本元素
List<WebElement> allInputs = driver.findElements(By.cssSelector("input"));
System.out.println("Found " + allInputs.size() + " input elements");
List<WebElement> allLinks = driver.findElements(By.cssSelector("a"));
System.out.println("Found " + allLinks.size() + " link elements");
// 获取页面源代码看看结构
String pageSource = driver.getPageSource();
System.out.println("Page source length: " + pageSource.length());
if (pageSource.length() > 0) {
System.out.println("Page preview: " + pageSource.substring(0, Math.min(500, pageSource.length())));
}
screenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
}
// 用户管理
@Test
public void checkRegisterPage() throws IOException {
ensureOnAdminPage();
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(15));
WebElement registerButton = longWait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#register")));
registerButton.click();
// 先切换到 iframe
WebElement iframe = longWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#contentFrame")));
driver.switchTo().frame(iframe);
// 检查元素
String title = driver.findElement(By.cssSelector("body > div > h2")).getText();
assert title.equals("填写注册信息");
driver.findElement(By.cssSelector("#name"));
driver.findElement(By.cssSelector("#mail"));
driver.findElement(By.cssSelector("#phoneNumber"));
driver.findElement(By.cssSelector("#registerForm > button"));
// 操作完成后,切回主页面
driver.switchTo().defaultContent();
screenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
}
@Test
public void registerFail() {
ensureOnAdminPage();
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(15));
// 先点击注册按钮
WebElement registerButton = longWait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#register")));
registerButton.click();
// 先切换到 iframe
WebElement iframe = longWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#contentFrame")));
driver.switchTo().frame(iframe);
driver.findElement(By.cssSelector("#name")).clear();
driver.findElement(By.cssSelector("#mail")).clear();
driver.findElement(By.cssSelector("#phoneNumber")).clear();
driver.findElement(By.cssSelector("#name")).sendKeys("zy");
driver.findElement(By.cssSelector("#mail")).sendKeys("127@qq.com");
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("13019523030");
driver.findElement(By.cssSelector("#registerForm > button")).click();
// 等待弹窗出现,处理弹窗
longWait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
alert.accept();
// 操作完成后,切回主页面
driver.switchTo().defaultContent();
}
@Test
public void registerSuccess() {
ensureOnAdminPage();
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(15));
// 先点击注册按钮
WebElement registerButton = longWait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#register")));
registerButton.click();
// 先切换到 iframe
WebElement iframe = longWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#contentFrame")));
driver.switchTo().frame(iframe);
driver.findElement(By.cssSelector("#name")).clear();
driver.findElement(By.cssSelector("#mail")).clear();
driver.findElement(By.cssSelector("#phoneNumber")).clear();
driver.findElement(By.cssSelector("#name")).sendKeys("zyq");
driver.findElement(By.cssSelector("#mail")).sendKeys("129@qq.com");
driver.findElement(By.cssSelector("#phoneNumber")).sendKeys("13019523030");
driver.findElement(By.cssSelector("#registerForm > button")).click();
// 操作完成后,切回主页面
driver.switchTo().defaultContent();
}
@Test
public void checkUserPage() throws IOException {
ensureOnAdminPage();
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(15));
WebElement userListButton = longWait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#userList")));
userListButton.click();
// 先切换到 iframe
WebElement iframe = longWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#contentFrame")));
driver.switchTo().frame(iframe);
// 检查元素
String title = driver.findElement(By.cssSelector("body > div > h2")).getText();
assert title.equals("人员列表");
String userId = driver.findElement(By.cssSelector("body > div > div > table > thead > tr > th:nth-child(1)")).getText();
assert userId.equals("人员id");
String username = driver.findElement(By.cssSelector("body > div > div > table > thead > tr > th:nth-child(2)")).getText();
assert username.equals("姓名");
String identity = driver.findElement(By.cssSelector("body > div > div > table > thead > tr > th:nth-child(3)")).getText();
assert identity.equals("身份");
// 操作完成后,切回主页面
driver.switchTo().defaultContent();
screenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
}
// 奖品管理
@Test
public void checkCreatePrizePage() throws IOException {
ensureOnAdminPage();
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(15));
// 先点击奖品管理菜单
WebElement prizeManagement = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//li[contains(text(), '奖品管理')]")
));
prizeManagement.click();
// 等待子菜单出现
WebElement createPrizeButton = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//a[contains(text(), '创建奖品')]")
));
createPrizeButton.click();
// 先切换到 iframe
WebElement iframe = longWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#contentFrame")));
driver.switchTo().frame(iframe);
// 检查元素
String title = driver.findElement(By.cssSelector("body > div > h2")).getText();
assert title.equals("开始创建奖品");
driver.findElement(By.cssSelector("#prizeName"));
driver.findElement(By.cssSelector("#prizeImageUrl"));
driver.findElement(By.cssSelector("#price"));
driver.findElement(By.cssSelector("#description"));
driver.findElement(By.cssSelector("body > div > button"));
// 操作完成后,切回主页面
driver.switchTo().defaultContent();
screenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
}
@Test
public void createPrizeFail(){
ensureOnAdminPage();
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(15));
// 先点击奖品管理菜单
WebElement prizeManagement = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//li[contains(text(), '奖品管理')]")
));
prizeManagement.click();
// 等待子菜单出现
WebElement createPrizeButton = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//a[contains(text(), '创建奖品')]")
));
createPrizeButton.click();
// 先切换到 iframe
WebElement iframe = longWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#contentFrame")));
driver.switchTo().frame(iframe);
driver.findElement(By.cssSelector("#prizeName")).sendKeys("手机2");
driver.findElement(By.cssSelector("#prizeImageUrl"));
driver.findElement(By.cssSelector("#price")).sendKeys("6000");
driver.findElement(By.cssSelector("#description")).sendKeys("一部手机");
driver.findElement(By.cssSelector("body > div > button")).click();
// 等待弹窗出现,处理弹窗
longWait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
alert.accept();
// 操作完成后,切回主页面
driver.switchTo().defaultContent();
}
@Test
public void createPrizeSuccess(){
ensureOnAdminPage();
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(15));
// 先点击奖品管理菜单
WebElement prizeManagement = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//li[contains(text(), '奖品管理')]")
));
prizeManagement.click();
// 等待子菜单出现
WebElement createPrizeButton = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//a[contains(text(), '创建奖品')]")
));
createPrizeButton.click();
// 先切换到 iframe
WebElement iframe = longWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#contentFrame")));
driver.switchTo().frame(iframe);
driver.findElement(By.cssSelector("#prizeName")).sendKeys("手机2");
driver.findElement(By.cssSelector("#prizeImageUrl"))
.sendKeys("D:\\比特学习\\PIC\\bc832f1e-ea49-4621-ab8f-c9204490418e.png");
driver.findElement(By.cssSelector("#price")).sendKeys("6000");
driver.findElement(By.cssSelector("#description")).sendKeys("一部手机");
driver.findElement(By.cssSelector("body > div > button")).click();
// 等待弹窗出现,处理弹窗
longWait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
alert.accept();
// 操作完成后,切回主页面
driver.switchTo().defaultContent();
}
@Test
public void checkPricePage() throws IOException {
ensureOnAdminPage();
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(15));
// 先点击奖品管理菜单
WebElement prizeManagement = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//li[contains(text(), '奖品管理')]")
));
prizeManagement.click();
// 等待子菜单出现
WebElement prizeListButton = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//a[contains(text(), '奖品列表')]")
));
prizeListButton.click();
// 先切换到 iframe
WebElement iframe = longWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#contentFrame")));
driver.switchTo().frame(iframe);
// 检查元素
String title = driver.findElement(By.cssSelector("body > div > h2")).getText();
assert title.equals("奖品列表");
String id = driver.findElement(By.cssSelector("body > div > div.table-box > table > thead > tr > th:nth-child(1)")).getText();
assert id.equals("奖品id");
String prizePic = driver.findElement(By.cssSelector("body > div > div.table-box > table > thead > tr > th:nth-child(2)")).getText();
assert prizePic.equals("奖品图");
String prizeName = driver.findElement(By.cssSelector("body > div > div.table-box > table > thead > tr > th:nth-child(3)")).getText();
assert prizeName.equals("奖品名");
String prizeDesc = driver.findElement(By.cssSelector("body > div > div.table-box > table > thead > tr > th:nth-child(4)")).getText();
assert prizeDesc.equals("奖品描述");
String price = driver.findElement(By.cssSelector("body > div > div.table-box > table > thead > tr > th:nth-child(5)")).getText();
assert price.equals("奖品价值");
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("body > div > div.pagination > span"));
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(4)"));
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(5)"));
// 操作完成后,切回主页面
driver.switchTo().defaultContent();
screenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
}
// 活动管理
@Test
public void checkCreateActivityPage() throws IOException {
ensureOnAdminPage();
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(15));
// 先点击活动管理菜单
WebElement activityManagement = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//li[contains(text(), '活动管理')]")
));
activityManagement.click();
// 等待子菜单出现
WebElement createActivityButton = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//a[contains(text(), '创建活动')]")
));
createActivityButton.click();
// 先切换到 iframe
WebElement iframe = longWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#contentFrame")));
driver.switchTo().frame(iframe);
// 检查元素
String title = driver.findElement(By.cssSelector("body > div > h2")).getText();
assert title.equals("创建抽奖活动");
driver.findElement(By.cssSelector("#activityName"));
driver.findElement(By.cssSelector("#description"));
driver.findElement(By.cssSelector("#buttonPrizes"));
driver.findElement(By.cssSelector("#buttonUsers"));
driver.findElement(By.cssSelector("#createActivity"));
// 操作完成后,切回主页面
driver.switchTo().defaultContent();
screenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
}
@Test
public void createActivityFail(){
ensureOnAdminPage();
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(15));
// 先点击活动管理菜单
WebElement activityManagement = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//li[contains(text(), '活动管理')]")
));
activityManagement.click();
// 等待子菜单出现
WebElement createActivityButton = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//a[contains(text(), '创建活动')]")
));
createActivityButton.click();
// 先切换到 iframe
WebElement iframe = longWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#contentFrame")));
driver.switchTo().frame(iframe);
driver.findElement(By.cssSelector("#activityName")).clear();
driver.findElement(By.cssSelector("#description")).clear();
driver.findElement(By.cssSelector("#activityName")).sendKeys("自动化测试");
driver.findElement(By.cssSelector("#description")).sendKeys("自动化测试");
driver.findElement(By.cssSelector("#buttonPrizes")).click();
List<WebElement> prizes = driver.findElements(By.xpath("//*[@id=\"prizesContainer\"]//input"));
prizes.get(0).click();
prizes.get(1).clear();
prizes.get(1).sendKeys("2");
driver.findElement(By.cssSelector("#prizesModal > div > div.form-btn-box > button.btn.btn-primary")).click();
driver.findElement(By.cssSelector("#buttonUsers")).click();
List<WebElement> users = driver.findElements(By.xpath("//*[@id=\"usersContainer\"]//input"));
users.get(0).click();
driver.findElement(By.cssSelector("#usersModal > div > div.form-btn-box > button.btn.btn-primary")).click();
driver.findElement(By.cssSelector("#createActivity")).click();
// 等待弹窗出现,处理弹窗
longWait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
alert.accept();
// 操作完成后,切回主页面
driver.switchTo().defaultContent();
}
@Test
public void createActivitySuccess(){
ensureOnAdminPage();
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(15));
// 先点击活动管理菜单
WebElement activityManagement = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//li[contains(text(), '活动管理')]")
));
activityManagement.click();
// 等待子菜单出现
WebElement createActivityButton = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//a[contains(text(), '创建活动')]")
));
createActivityButton.click();
// 先切换到 iframe
WebElement iframe = longWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#contentFrame")));
driver.switchTo().frame(iframe);
driver.findElement(By.cssSelector("#activityName")).clear();
driver.findElement(By.cssSelector("#description")).clear();
driver.findElement(By.cssSelector("#activityName")).sendKeys("自动化测试");
driver.findElement(By.cssSelector("#description")).sendKeys("自动化测试");
driver.findElement(By.cssSelector("#buttonPrizes")).click();
List<WebElement> prizes = driver.findElements(By.xpath("//*[@id=\"prizesContainer\"]//input"));
prizes.get(0).click();
prizes.get(1).clear();
prizes.get(1).sendKeys("2");
driver.findElement(By.cssSelector("#prizesModal > div > div.form-btn-box > button.btn.btn-primary")).click();
driver.findElement(By.cssSelector("#buttonUsers")).click();
List<WebElement> users = driver.findElements(By.xpath("//*[@id=\"usersContainer\"]//input"));
users.get(0).click();
users.get(1).click();
driver.findElement(By.cssSelector("#usersModal > div > div.form-btn-box > button.btn.btn-primary")).click();
driver.findElement(By.cssSelector("#createActivity")).click();
// 等待弹窗出现,处理弹窗
longWait.until(ExpectedConditions.alertIsPresent());
Alert alert = driver.switchTo().alert();
alert.accept();
// 操作完成后,切回主页面
driver.switchTo().defaultContent();
}
@Test
public void checkActivityPage() throws IOException {
ensureOnAdminPage();
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(15));
// 先点击活动管理菜单
WebElement activityManagement = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//li[contains(text(), '活动管理')]")
));
activityManagement.click();
// 等待子菜单出现
WebElement activityListButton = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//a[contains(text(), '活动列表')]")
));
activityListButton.click();
// 先切换到 iframe
WebElement iframe = longWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#contentFrame")));
driver.switchTo().frame(iframe);
// 检查元素
String title = driver.findElement(By.cssSelector("body > div > h2")).getText();
assert title.equals("活动列表");
driver.findElement(By.cssSelector("#activities > div:nth-child(1) > div.activity-info > h4"));
driver.findElement(By.cssSelector("#activities > div:nth-child(1) > div.activity-info > p"));
driver.findElement(By.cssSelector("#activities > div:nth-child(1) > div.active > p > a"));
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("body > div > div.pagination > span"));
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(4)"));
driver.findElement(By.cssSelector("body > div > div.pagination > button:nth-child(5)"));
// 操作完成后,切回主页面
driver.switchTo().defaultContent();
screenShot(Thread.currentThread().getStackTrace()[1].getMethodName());
}
@Test
public void checkDrawPage(){
ensureOnAdminPage();
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(15));
// 先点击活动管理菜单
WebElement activityManagement = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//li[contains(text(), '活动管理')]")
));
activityManagement.click();
// 等待子菜单出现
WebElement activityListButton = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//a[contains(text(), '活动列表')]")
));
activityListButton.click();
// 先切换到 iframe
WebElement iframe = longWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#contentFrame")));
driver.switchTo().frame(iframe);
String curWindow = driver.getWindowHandle();
driver.findElement(By.cssSelector("#activities > div:nth-child(1) > div.active > p > a")).click();
// 操作完成后,切回主页面
driver.switchTo().defaultContent();
Set<String> windowHandles = driver.getWindowHandles();
for (String windowHandle : windowHandles){
if(!curWindow.equals(windowHandle)){
driver.switchTo().window(windowHandle);
break;
}
}
driver.findElement(By.cssSelector("#title"));
driver.findElement(By.cssSelector("#disc"));
driver.findElement(By.cssSelector("#image"));
// 等待页面完全加载
longWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#container")));
// 找到按钮并滚动到视口
WebElement prevBtn = driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.pre-btn"));
WebElement nextBtn = driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.next-btn"));
// 关键:滚动到元素可见
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView({block: 'center'});", prevBtn);
((JavascriptExecutor) driver).executeScript("arguments[0].scrollIntoView({block: 'center'});", nextBtn);
String prev = prevBtn.getText().trim();
String next = nextBtn.getText().trim();
System.out.println(prev + next);
assert prev.contains("查看上一奖项");
assert next.contains("开始抽奖");
}
@Test
public void draw(){
ensureOnAdminPage();
WebDriverWait longWait = new WebDriverWait(driver, Duration.ofSeconds(15));
// 先点击活动管理菜单
WebElement activityManagement = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//li[contains(text(), '活动管理')]")
));
activityManagement.click();
// 等待子菜单出现
WebElement activityListButton = longWait.until(ExpectedConditions.elementToBeClickable(
By.xpath("//a[contains(text(), '活动列表')]")
));
activityListButton.click();
// 先切换到 iframe
WebElement iframe = longWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#contentFrame")));
driver.switchTo().frame(iframe);
String curWindow = driver.getWindowHandle();
driver.findElement(By.cssSelector("#activities > div:nth-child(1) > div.active > p > a")).click();
// 操作完成后,切回主页面
driver.switchTo().defaultContent();
Set<String> windowHandles = driver.getWindowHandles();
for (String windowHandle : windowHandles){
if(!curWindow.equals(windowHandle)){
driver.switchTo().window(windowHandle);
break;
}
}
// 等待页面完全加载
longWait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#container")));
while(driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.next-btn")).getText().contains("开始抽奖")){
driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.next-btn")).click();
// 等待抽奖动画完成
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.next-btn")).click();
}
String next = driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.next-btn")).getText();
assert next.contains("已抽完,下一步");
driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.next-btn")).click();
String share = driver.findElement(By.cssSelector("#container > div.opt-box > span.btn.copy-btn")).getText();
assert share.contains("分享结果");
}
@AfterAll
public static void tearDown() {
// 关闭浏览器
Utils.quit();
}
}
四、兼容性测试
测试场景一:在Edge浏览器中进入抽奖系统
预期结果:无异常且布局显示功能与预期一致

测试场景二:在火狐浏览器中进入抽奖系统
预期结果:无异常且布局显示功能与预期一致

五、易用性测试
1. 错误有引导,反馈清晰


六、测试总结
1.问题点
1.1有些错误提示不明显

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