抽奖系统Selenium自动化测试流程解析

抽奖系统Selenium自动化测试流程解析




🌈感谢大家的阅读、点赞、收藏和关注

 💕希望大家喜欢我本次的讲解💕

目录👑

一、自动化测试环境与框架核心配置🌟

1. 技术栈与依赖(测试文档 - 环境配置章节)

2. 浏览器驱动初始化(测试文档 - 基础工具章节)

二、核心工具类(测试文档 - 通用工具章节)❄️

1. 测试数据自动生成(解决测试数据重复问题)

2. 自动化截图(测试失败溯源)

三、核心业务模块测试逻辑(测试文档 - 功能测试章节)🍃

1. 登录 / 注册模块(边界值 + 异常场景全覆盖)

2. 管理员核心模块(iframe 切换 + 多场景校验)

3. 测试执行入口(全流程自动化)

四、关键技术难点与解决方案(测试文档 - 技术难点章节)


一、自动化测试环境与框架核心配置🌟

1. 技术栈与依赖(测试文档 - 环境配置章节)

描述:本次抽奖系统 UI 自动化测试基于 Spring Boot + Selenium 4.0 实现,核心依赖包括 Selenium-Java(浏览器驱动操作)、WebDriverManager(自动管理浏览器驱动版本)、commons-io(截图功能),测试环境为 Java 17,浏览器为 Chrome。

关键代码(pom.xml 核心依赖)

<!-- Selenium核心依赖 --> <dependency> <groupId>org.seleniumhq.selenium</groupId> <artifactId>selenium-java</artifactId> <version>4.0.0</version> </dependency> <!-- 自动管理ChromeDriver版本 --> <dependency> <groupId>io.github.bonigarcia</groupId> <artifactId>webdrivermanager</artifactId> <version>5.8.0</version> <scope>test</scope> </dependency> <!-- 截图功能依赖 --> <dependency> <groupId>commons-io</groupId> <artifactId>commons-io</artifactId> <version>2.6</version> </dependency> 
2. 浏览器驱动初始化(测试文档 - 基础工具章节)

描述:封装统一的 Chrome 驱动创建方法,自动下载匹配版本的驱动,配置--remote-allow-origins=*解决跨域问题,设置 6 秒隐式等待确保元素加载,同时封装 WebDriverWait 显式等待(最长 60 秒)适配复杂场景。

关键代码(Utils 类核心方法)

public static WebDriver createDriver() { if(driver == null) { // 自动下载并配置ChromeDriver WebDriverManager.chromedriver().setup(); ChromeOptions options = new ChromeOptions(); options.addArguments("--remote-allow-origins=*"); // 解决跨域限制 driver = new ChromeDriver(options); // 隐式等待:全局等待元素加载 driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(6)); } return driver; } 

二、核心工具类(测试文档 - 通用工具章节)❄️

1. 测试数据自动生成(解决测试数据重复问题)

描述:封装 3 类随机测试数据生成方法,避免手动造数,保证测试用例的可重复性:

  • 随机手机号:生成符合 11 位规范的手机号(第一位固定为 1,第二位 3-9,后 9 位随机);
  • 唯一 QQ 邮箱:基于 UUID 生成绝对唯一的 QQ 邮箱,避免重复注册问题;
  • 随机管理员名称:生成 1-6 位字母 + 数字混合字符串。

关键代码

// 随机手机号生成 public static String generateRandomMobile() { StringBuilder mobile = new StringBuilder("1"); mobile.append(MOBILE_SECOND_DIGITS[RANDOM.nextInt(MOBILE_SECOND_DIGITS.length)]); for (int i = 0; i < 9; i++) { mobile.append(RANDOM.nextInt(10)); } return mobile.toString(); } // 唯一QQ邮箱生成 public static String generateUniqueQQEmail() { String uuidPart = UUID.randomUUID().toString().replace("-", "").substring(0, 8); long uuidNum = Long.parseLong(uuidPart, 16) % 100000000; String qqNumber = String.valueOf(Math.abs(uuidNum)); if (qqNumber.length() < 5) { qqNumber = "12345" + qqNumber; } return qqNumber.substring(0, 8) + "@qq.com"; } 
2. 自动化截图(测试失败溯源)

描述:封装截图方法,按 “年月日 / 类名 - 时分秒毫秒.png” 路径存储截图,可在测试用例失败时自动捕获页面状态,便于问题定位。

关键代码

public static void screenShot(String str) throws IOException { SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat sim2 = new SimpleDateFormat("HH_mm_ss_SS"); String fileName = "./src/test/java/image/" + sim1.format(System.currentTimeMillis()) + "/" + str + "-" + sim2.format(System.currentTimeMillis()) + ".png"; File srcFile = ((TakesScreenshot) driver).getScreenshotAs(OutputType.FILE); FileUtils.copyFile(srcFile, new File(fileName)); } 

三、核心业务模块测试逻辑(测试文档 - 功能测试章节)🍃

1. 登录 / 注册模块(边界值 + 异常场景全覆盖)

描述:覆盖注册 / 登录的全量异常场景,采用 “先异常后正常” 的测试逻辑,验证前端校验和后端逻辑:

  • 注册:空值校验→格式错误(邮箱 / 手机号)→已注册数据校验→正常注册;
  • 登录:手机号 / 密码错误→手机号正确密码错误→正常登录;
  • 核心技术:切换 Alert 弹窗、显式等待弹窗加载、元素定位(CSS Selector/XPath 混合使用)。

关键代码(注册异常场景)

// 空值校验:不填信息直接注册,验证前端提示 driver.findElement(By.cssSelector("#registerForm > button")).click(); String nameErr = driver.findElement(By.cssSelector("#name-error")).getText(); assert !nameErr.isEmpty(); // 格式错误:邮箱填123456,验证格式提示 driver.findElement(By.xpath("//*[@id=\"mail\"]")).sendKeys("123456"); driver.findElement(By.cssSelector("#registerForm > button")).click(); String mailErr = driver.findElement(By.cssSelector("#mail-error")).getText(); assert !mailErr.isEmpty(); // 已注册数据校验:弹窗提示处理 wait.until(ExpectedConditions.alertIsPresent()); Alert alert = driver.switchTo().alert(); String text = alert.getText(); // 获取弹窗提示(如“手机号已被使用”) alert.accept(); 
2. 管理员核心模块(iframe 切换 + 多场景校验)

描述:抽奖系统管理员端核心模块测试,覆盖人员管理、奖品管理、活动管理,解决 iframe 嵌套页面元素定位问题,核心场景:

  • 人员管理:注册校验、列表元素验证;
  • 奖品管理:奖品创建(价格 0 / 负数 / 正常值校验)、列表数据提取;
  • 活动管理:活动创建(奖品 / 人员数量校验)、抽奖流程自动化、中奖结果复制验证。

关键技术点代码

// 1. iframe切换(解决嵌套页面元素定位) wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("contentFrame"))); // 切入iframe driver.switchTo().defaultContent(); // 切回顶层页面 // 2. 奖品价格校验 driver.findElement(By.xpath("//*[@id=\"price\"]")).sendKeys("0"); // 价格为0 driver.findElement(By.cssSelector("body > div > button")).click(); driver.findElement(By.xpath("//*[@id=\"price\"]")).clear(); driver.findElement(By.xpath("//*[@id=\"price\"]")).sendKeys("-1"); // 价格为负数 driver.findElement(By.cssSelector("body > div > button")).click(); // 3. 抽奖流程自动化(按钮状态切换+循环抽奖) By nextBtnLocator = By.cssSelector("#container > div.opt-box > span.btn.next-btn"); while(true) { WebElement nextBtn = wait.until(ExpectedConditions.visibilityOfElementLocated(nextBtnLocator)); String btnText = nextBtn.getText(); if (btnText.equals("已全部抽完")) break; // 退出条件 nextBtn.click(); // 点击开始抽奖 Thread.sleep(3000); wait.until(ExpectedConditions.textToBe(nextBtnLocator, "点我确定")); nextBtn.click(); // 确定中奖人 wait.until(ExpectedConditions.textToBe(nextBtnLocator, "已抽完,下一步")); nextBtn.click(); // 下一步 } 
3. 测试执行入口(全流程自动化)

描述:统一测试执行入口,按 “注册管理员→管理员登录→人员管理→奖品管理→活动管理→抽奖→退出” 流程执行,自动关闭浏览器,实现全流程无人值守测试。

关键代码

public static void main(String[] args) throws InterruptedException { LoginPage loginPage = new LoginPage(); loginPage.checkRegister(); loginPage.checkLogin(); AdminPage adminPage = new AdminPage(); adminPage.humanAdmin(); adminPage.humanList(); adminPage.createPrize(); adminPage.prizeList(); adminPage.createActivity(); adminPage.activityList(); adminPage.loginout(); Thread.sleep(1500); Utils.quit(); // 关闭浏览器 } 

四、关键技术难点与解决方案(测试文档 - 技术难点章节)

技术难点解决方案
iframe 嵌套页面定位先等待 iframe 加载完成,切换到 iframe 后再定位元素,操作完成切回顶层页面;
弹窗(Alert)处理显式等待弹窗加载(ExpectedConditions.alertIsPresent()),切换到弹窗后操作;
动态按钮状态切换基于按钮文本变化的显式等待(textToBe),适配抽奖按钮 “开始→确定→下一步” 状态;
测试数据重复基于 UUID / 随机数生成唯一测试数据(手机号 / 邮箱),避免重复注册 / 重复抽奖;

Read more

只因一个高级词,作文被判“18% AI生成”!AI检测「荒诞现状」:写得太好=AI作弊,学生被逼“降智”写作

只因一个高级词,作文被判“18% AI生成”!AI检测「荒诞现状」:写得太好=AI作弊,学生被逼“降智”写作

【ZEEKLOG 编者按】当生成式 AI 迅速进入校园,许多学校的第一反应是部署各种“AI 检测工具”,试图用技术手段识别学生是否在作业中使用了 AI。然而,这种看似合理的做法,正在产生一些出乎意料的副作用:学生因为用词稍微“高级”一点就被判定为“AI生成”,优秀写作反而变成一种风险;为了避免被误判,一些原本不使用 AI 的学生开始主动学习和使用 AI 工具,只为“自证清白”。 原文链接:https://www.techdirt.com/2026/03/06/were-training-students-to-write-worse-to-prove-theyre-not-robots-and-its-pushing-them-to-use-more-ai/ 作者 | Mike Masnick      编译 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews)  大约一年半前,我写过一件发生在我孩子身上的事。 当时学校给每个学生发了一台 Chromebook,上面预装了一款 AI

By Ne0inhk
因AI“认错脸”,50岁的她坐了6个月牢:被当诈骗犯抓走,回来后房子、车子和狗全没了!

因AI“认错脸”,50岁的她坐了6个月牢:被当诈骗犯抓走,回来后房子、车子和狗全没了!

整理 | 郑丽媛 出品 | ZEEKLOG(ID:ZEEKLOGnews) 如果有一天,你只是长得像某个人,就被 AI 认定为罪犯——然后被警方带走、关进监狱半年,你会怎么办? 最近,外媒曝光了一起离谱案件:一位来自美国田纳西州的 50 岁女性,仅仅因为 AI 人脸识别误判,被警方当作银行诈骗案的主犯逮捕,并在监狱里待了将近  6 个月。直到银行流水证明她当时根本不在案发地,检方才撤销全部指控。 然而,当她终于重获自由时,她的生活已经几乎被毁掉——房没了,车没了,甚至连她养的宠物狗也没了。 (Angela Lipps 事后接受媒体采访时的照片) 从没坐过飞机,却被押送 1200 英里受审 如开头所说,这位当事人名叫 Angela Lipps,今年 50 岁,住在美国田纳西州中北部。 她有三个已经成年的孩子,

By Ne0inhk
融资3000万美元,服务2000+团队!听Dify专家拆解如何把AI从Demo变生产力

融资3000万美元,服务2000+团队!听Dify专家拆解如何把AI从Demo变生产力

整理 | 梦依丹      出品 | ZEEKLOG(ID:ZEEKLOGnews) 近日,开源 AI 应用开发平台 Dify 宣布完成 3000 万美元 Pre-A 轮融资,由红杉领投,GL Ventures、Alt-Alpha Capital、五源资本、瑞穗力合投资和 NYX Ventures 跟投,目前公司估值已达 1.8 亿美元。 这家从“原型工具”杀出来的黑马,如今已服务全球超 140 万台设备、2000+ 团队和 280 家企业(包括马士基、安克创新等),正朝着“全球 AI 应用工作流标准定义者”狂奔。 那么,Dify 是如何用“

By Ne0inhk
【SpringCloud】注册中心 && 服务注册 && 服务发现 && Eureka

【SpringCloud】注册中心 && 服务注册 && 服务发现 && Eureka

文章目录 * Ⅰ. 背景 * 一、问题描述 * 二、注册中心 * 三、CAP理论 * 四、常见的注册中心 * ① Zookeeper * ② Eureka * ③ Nacos * CAP对比 * Ⅱ. Eureka介绍 * Ⅲ. 搭建EurekaServer * 一、创建Eureka-server子模块 * 二、引入eureka-server依赖 * 三、添加maven项目构建插件 * 四、完善启动类 * 五、编写配置文件 * 六、启动服务 * Ⅳ. 服务注册 * 一、引入eureka-client依赖 * 二、完善配置文件 * 三、启动服务 * Ⅴ. 服务发现 * 一、引入依赖 * 二、完善配置文件 * 三、远程调用 * 四、启动服务 * Ⅵ. Eureka和Zookeeper区别 Ⅰ. 背景 一、问题描述 上个章节的例子中可以看到,远程调用时,

By Ne0inhk