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

考问通系统测试分析报告

一、报告简介

1.项目背景

考问通系统是 Web 在线测评平台,核心功能包括:全周期管理问卷与考试,支持组织在线问卷、考试及练习,能收集分析数据,还可管理题库资源。
系统面向教育机构、企业培训部门及市场调研机构,提供从问卷 / 考试创建、发布、答题到结果分析的一站式全流程解决方案,助力高效智能化管理测评工作。

考问通系统的核心模块:

  • 用户管理模块:包含用户注册、登录以及用户权限控制。
  • 问卷/考试管理模块:包含问卷/考试的创建、修改、发布。
  • 题库管理模块:包含新建题库、查询、导入导出题库。
  • 练习管理模块:包含查询练习、在线进行练习、错题记录。
  • 模板管理模块:包含问卷/考试模板的创建、添加、发布。
  • 系统设置模块:包含个人设置、界面设置、安全设置。

2.测试目的

1.功能验证

  1. 确保所有核心功能符合需求规格说明书要求。
  2. 验证用户注册/登录流程的完整性和正确性。
  3. 确定问卷/考试管理模块中问卷/考试的创建、修改、发布流程的完整性和可用性。
  4. 检查题库管理模块相关核心功能的完整性和可用性。
  5. 验证模板管理的问卷/考试模板的创建、添加、发布的完整性和可用性。

2.用户体验优化

  1. 通过测试评估页面布局的合理性和美观性。
  2. 测试不同错误操作下的错误提示是否完整清晰易懂。
  3. 检查设计风格是否统一(如按钮样式、字体大小、颜色搭配在全平台保持一致)。
  4. 测试新用户能否快速理解产品功能。

3.测试系统的稳定性

  1. 评估系统在高并发场景下的稳定性。
  2. 测试长时间运行时系统的性能表现。
  3. 测试超出预期用户量时的系统行为表现。
  4. 验证异常情况(网络中断、服务器错误)下的系统行为。

4.安全性测试

  1. 测试用户身份认证与授权机制。
  2. 检查敏感数据(如密码、支付信息)是否通过 HTTPS 等加密协议传输,避免明文泄露。
  3. 测试数据库中敏感数据是否加密存储,而非明文保存。
  4. 检查是否存在已知高危漏洞(如 Heartbleed、Log4j 漏洞)。
  5. 测试SQL注入、XSS等常见Web攻击防护。

5.兼容性验证

  1. 检查网页应用在不同浏览器及其不同版本上的显示效果、功能可用性。
  2. 测试软件在不同操作系统(Windows、macOS、Linux 等)及其不同版本上的兼容性。
  3. 测试产品在不同网络环境(如 4G、5G、Wi-Fi、局域网等)下的性能和功能。

3.测试环境

  • 操作系统:Windows 11 / Windows 10。
  • 浏览器:Chrome、Edge。
  • 测试工具:Selenium、JMeter、postman。

二、测试用例

下图为该系统测试用例的思维导图,因图片过长分开展示。为避免图片模糊,下方附链接可点击查看完整内容。

图片链接:测试用例思维导图

三、手动测试

1.用户注册功能

测试场景一:输入用户名、登录账号、密码、确认密码后进行注册。

预期结果:注册成功跳转到登录页面可以正常登录,并跳转到问卷考试系统首页。

测试场景二:不输入用户名、但输入登陆账号、密码、确认密码后进行注册。
预期结果:提示用户名是必填项。

测试场景三:输入已经注册过的的账号进行注册。
预期结果:提示账号已存在。

测试场景四:密码和确认密码输入不一致。
预期结果:提示两次密码不一致。

2.用户登录功能

测试场景一:输入正确用户名和密码,点击登录。
预期结果:登录成功,直接跳转到问卷考试系统首页。

测试场景二:不输用户名但输入密码,点击登录。
预期结果:提示用户名是必填项。

测试场景三:输如用户名但不输入密码,点击登录。
预期结果:提示密码是必填项。

测试场景四:输入错误的用户名和密码,点击登录。
预期结果:提示错误的用户名和密码。

测试场景五:输入错误的用户名和正确的密码,点击登录。
预期结果:提示错误的用户名和密码。

测试场景六:输入正确的用户名和错误的密码,点击登录。
预期结果:提示错误的用户名和密码。

3.系统首页功能

测试场景一:点击“创建问卷”按钮。
预期结果:跳转到编辑问卷页面。

测试场景二:编辑好问卷后点击“保存”按钮。
预期结果:提示保存成功,首页问卷数+1,可在我的项目中查看到新创建标题为“测试”的问卷。

测试场景三:点击“创考试卷”按钮。
预期结果:点击“创考试卷”按钮后,跳转到编辑考试页面

测试场景四:编辑好考试后点击“保存”按钮。
预期结果:提示保存成功,首页考试数+1,可在我的项目中查看到新创建标题为“数学”的问卷。

4.页面设置功能

测试场景一:点击页面右上方设置图标。
预期结果:弹出下拉选项框。

测试场景二:点击“整体风格设置”按钮后,更改为暗黑风格
预期结果:页面主题变为暗黑风格

测试场景三:点击“退出登录”按钮
预期结果:从系统首页直接跳转到登录页面

5.我的项目页面功能

测试场景一:进行项目的查找,在搜索框输入项目名称,点击“搜索”按钮。
预期结果:显示搜索出的项目。

测试场景二:点击“新建”按钮,进行项目的新建操作。
预期结果:选择要创建的项目类型后,跳转到项目创建页面。

测试场景三:点击“回收站”按钮
预期结果:弹出回收站页面

测试场景四:选择一个项目,点击“删除”按钮。
预期结果:选择的项目从列表页被删除。

测试场景五:,打开回收站,选择一个项目后,点击“彻底删除”按钮。
预期结果:弹出提示弹窗。

测试场景六:点击一个项目。
预期结果:跳转到项目的设置页面。

测试场景七:开启问卷后,点击“打开”按钮并作答。
预期结果:跳转到正式问卷,可以作答并提交,提交后项目状态由未发布变为收集中。

6.我的练习页面功能

测试场景一:点击状态选择框,状态选择“正在进行”并且点击“查询”按钮。
预期结果:查询显示出正在进行状态的练习。

测试场景二:点击“重置”按钮。
预期结果:状态选择框清空,下方显示全部我的练习。

7.我的题库页面功能

测试场景一:名称输入框输入题库名称,选择题库的类型,点击“查询”按钮。
预期结果:查询出了符合条件的题库。

测试场景二:点击“重置”按钮。
预期结果:名称输入框和类型选择框清空,下方题库列表中显示全部题库。

测试场景三:点击“新建”按钮。
预期结果:弹出新增题库编辑页面。

测试场景四:编辑好题库信息后,点击“确定”按钮。
预期结果:题库列表新增了名为“测试新增题库功能”的题库。

测试场景五:新建题库时,不填写题库名称。
预期结果:提示题库名称不能为空。

测试场景六:新建题库时,不选择题库类型。
预期结果:提示请选择题库类型。

测试场景七:点击“导出”按钮,进行题库得导出。
预期结果:成功导出了选择的题库。

实际结果:点击“导出”按钮没有反应。
Bug:“导出”按钮存在异常,导出功能失效。

8.问题管理页面功能

测试场景一:选择好类型和题型,输入要查询的问题名称,点击“查询”按钮。
预期结果:查询出了符合条件的问题。

测试场景二:只选择问题类型,点击“查询”按钮。
预期结果:查询出了符合选择的问题类型条件的所有问题。

测试场景三:输入不存在的问题名称,点击“查询”按钮。
预期结果:查询为空什么也不显示。

测试场景四:查询条件重置,点击“重置”按钮。
预期结果:类型、题型选项框和名称输入框清空,试题列表显示全部问题。

9.模板广场页面功能

测试场景一:新增模板,点击“添加模板”按钮。
预期结果:跳转到编辑模板页面。

测试场景二:保存编辑的模板,点击“保存”按钮。
预期结果:模板广场公有库新添加的名为“模板”的模板。

测试场景三:点击模板搜索框,输入已有模板名字(模板),点击“搜模板”按钮。
预期结果:搜索出并显示名为“模板”的模板。

实际结果:输入“模板”点击“搜模板”按钮后,无结果响应。
Bug:存在名为“模板”的模板,但搜索功能失效。

10.用户管理页面功能

测试场景一:姓名输入框输入用户姓名后,点击“查询”按钮。
预期结果:查询到此用户信息。

测试场景二:点击“重置”按钮。
预期结果:姓名输入框清空,下面系统用户列表显示全部用户信息。

测试场景三:点击“新建”按钮。
预期结果:弹出新建编辑用户信息页面。

测试场景四:编辑好要新建的用户信息,点击“确定”按钮。
预期结果:用户列表中新增了刚创建的名为王五的用户。

测试场景五:新建用户时,输入已存在的用户登录名。
预期结果:提示登录名已存在。

测试场景六:新建用户时,输入密码和确认密码输入的不一致。
预期结果:提示两次输入的密码不一致。

测试场景七:新建用户时,不输入用户名。
预期结果:提示用户名不能为空。

测试场景八:新建用户时,必选项状态未选择,点击“确定”按钮。
预期结果:提示请选择状态。

实际结果:成功创建了新用户叶飞,并且状态为激活。
Bug:必选项状态未选,也创建用户成功了。

测试场景九:点击“编辑”按钮。
预期结果:弹出修改用户信息页面。

测试场景十:用户名修改为已存在的用户名aaaaa。
预期结果:提示用户名已存在。

实际结果:成功修改用户名为已经存在的用户名。
Bug:用户名已存在不进行提示而且还可以正常修改。

测试场景十一:点击“重置密码”按钮,进行重置密码。
预期结果:修改成功。

测试场景十二:重置的新密码与旧密码相同。
预期结果:提示新密码不能与旧密码相同。

实际结果:新密码与旧密码相同时不进行提示,并且也可以修改成功。
Bug:当新密码与旧密码相同时不进行提示并且也可以修改成功。

11.个人设置页面功能

测试场景一:基本设置信息全部填写后,点击“提交”按钮。
预期结果:提示更新基本信息成功。

测试场景二:修改基本信息时,不输入姓名。
预期结果:提示请输入您的昵称。

测试场景三:修改基本信息时,不输入手机号。
预期结果:提示请输入您的联系电话。

测试场景四:安全设置界面修改账户密码,点击“修改”按钮。
预期结果:弹出修改密码页面弹窗。

测试场景五:输入正确的旧密码、新密码和确认密码后,点击“修改”按钮。
预期结果:提示密码修改成功。

测试场景六:输入错误的旧密码。
预期结果:提示密码校验失败。

测试场景七:输入正确的旧密码,而新密码和确认密码不一致。
预期结果:提示两次密码输入不一致。

测试场景八:旧密码与新密码相同。
预期结果:提示旧密码不能与新密码一致。

实际结果:旧密码与新密码一致时,修改成功。
Bug:旧密码与新密码一致时没有提示,并且修改成功。

四、兼容性测试

测试场景一:在Edge浏览器下进入问卷考试系统。
预期结果:无异常且一切布局显示与功能等与预期一致。

测试场景一:在Chrome浏览器下进入问卷考试系统。
预期结果:无异常且一切布局显示与功能等与预期一致。

五、自动化测试

自动化测试项目代码文件结构:

1.驱动类(Utils.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 static String DetailUrl = "http://8.155.1.153:8081/user/login";public WebDriverWait wait = null;public Utils(String url){//调用driver对象driver = createDriver();wait = new WebDriverWait(driver,Duration.ofSeconds(2));driver.get(url);}/*** 获取驱动对象* @return*/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;}/*** 屏幕截图*/public void ScreenShot(String str) throws IOException {//屏幕截图文件目录//   ./src/test/java/images///                         /2025-03-02///                                    /test01_09372010.png//                                    /test02_09372011.png//                         /2025-03-03///                                    /test01_19372010.png//                                    /test02_19372011.pngSimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");String dirTime = sim1.format(System.currentTimeMillis());String fileTime = sim2.format(System.currentTimeMillis());//./src/test/java/images/2025-03-02/test01_13972011.pngString filename = "./src/test/java/images/"+ dirTime + "/" + str + "_" + fileTime + ".png";File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);FileUtils.copyFile(srcFile,new File(filename));}
}

2.注册模块测试类(RegisterTest.java)

package tests;import common.Utils;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;import java.io.IOException;public class RegisterTest extends Utils {public static String url = "http://8.155.1.153:8081/user/register";public RegisterTest() {super(url);}// 注册成功的测试用例public void registerSuccessTest() throws IOException {// 刷新当前页面driver.navigate().refresh();// 输入注册信息driver.findElement(By.cssSelector("#name")).sendKeys("zhang");driver.findElement(By.cssSelector("#username")).sendKeys("zhang");driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#rePassword")).sendKeys("123456");// 点击注册按钮driver.findElement(By.cssSelector("#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span")).click();try {Thread.sleep(1000); // 等待1秒} catch (InterruptedException e) {e.printStackTrace();}// 如果能找到登录页面的按钮,说明注册成功wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button > span")));// 添加屏幕截图
//        ScreenShot("registerSuccess");}// 测试用例一:不输入用户名public void registerFailedCase1() throws IOException {// 刷新当前页面driver.navigate().refresh();// 不输入用户名,输入其他信息driver.findElement(By.cssSelector("#username")).sendKeys("test");driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#rePassword")).sendKeys("123456");// 点击注册按钮driver.findElement(By.cssSelector("#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span")).click();try {Thread.sleep(1000); // 等待1秒} catch (InterruptedException e) {e.printStackTrace();}// 检查错误信息String actual = driver.findElement(By.cssSelector("#name_help > div")).getText();// 添加屏幕截图
//        ScreenShot("registerFailedCase1");// 断言检测是否符合预期assert actual.equals("用户名是必填项!") : "测试用例一失败: 预期错误信息与实际不符";}// 测试用例二:不输入登录账号public void registerFailedCase2() throws IOException {// 刷新当前页面driver.navigate().refresh();// 不输入登录账号,输入其他信息driver.findElement(By.cssSelector("#name")).sendKeys("li");driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#rePassword")).sendKeys("123456");// 点击注册按钮driver.findElement(By.cssSelector("#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span")).click();try {Thread.sleep(1000); // 等待1秒} catch (InterruptedException e) {e.printStackTrace();}// 检查错误信息String actual = driver.findElement(By.cssSelector("#username_help > div")).getText();// 添加屏幕截图ScreenShot("registerFailedCase2");// 断言检测是否符合预期assert actual.equals("登录账号不能为空") : "测试用例二失败: 预期错误信息与实际不符";}// 测试用例三:输入已存在的账号public void registerFailedCase3() throws IOException {// 刷新当前页面driver.navigate().refresh();// 输入已存在的账号信息driver.findElement(By.cssSelector("#name")).sendKeys("admin");driver.findElement(By.cssSelector("#username")).sendKeys("admin");driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#rePassword")).sendKeys("123456");// 点击注册按钮driver.findElement(By.cssSelector("#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span")).click();try {Thread.sleep(1000); // 等待1秒} catch (InterruptedException e) {e.printStackTrace();}// 检查错误信息String actual = driver.findElement(By.cssSelector("#root > div > div.content___1k5Ro > div.main___19HXK > div > form > div.ant-alert.ant-alert-error > div > div")).getText();// 添加屏幕截图
//        ScreenShot("registerFailedCase3");// 断言检测是否符合预期assert actual.equals("账号已存在") : "测试用例三失败: 预期错误信息与实际不符";}// 测试用例四:密码和确认密码不一致public void registerFailedCase4() throws IOException {// 刷新当前页面driver.navigate().refresh();// 输入不一致的密码driver.findElement(By.cssSelector("#name")).sendKeys("zhang");driver.findElement(By.cssSelector("#username")).sendKeys("zhang");driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#rePassword")).sendKeys("123123");// 点击注册按钮driver.findElement(By.cssSelector("#root > div > div.content___1k5Ro > div.main___19HXK > div > form > button > span")).click();try {Thread.sleep(1000); // 等待1秒} catch (InterruptedException e) {e.printStackTrace();}// 检查错误信息String actual = driver.findElement(By.cssSelector("#rePassword_help > div")).getText();// 添加屏幕截图
//        ScreenShot("registerFailedCase4");// 断言检测是否符合预期assert actual.equals("两次密码不一致!") : "测试用例四失败: 预期错误信息与实际不符";}}

3.登录模块测试类(LoginTest.java)

package tests;import common.Utils;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;import java.io.IOException;public class LoginTest extends Utils {public static String url = "http://8.155.1.153:8081/user/login";public LoginTest() {super(url);}// 登录成功的测试用例public void loginSuccess() throws IOException {// 刷新当前页面driver.navigate().refresh();driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan1");driver.findElement(By.cssSelector("#password")).sendKeys("666666");driver.findElement(By.cssSelector("#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button")).click();driver.findElement(By.xpath("/html/body/div[1]/div/div/div/section/div[2]/header[2]/div/div[3]/div/div/div/span/div/span[2]"));ScreenShot("loginSuccess");}// 登录异常的测试用例// 测试用例一:输入错误的用户名和错误的密码public void loginFailedCase1() throws IOException {// 刷新当前页面driver.navigate().refresh();driver.findElement(By.cssSelector("#username")).sendKeys("error");driver.findElement(By.cssSelector("#password")).sendKeys("12345");driver.findElement(By.cssSelector("#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button")).click();WebElement errorMessageElement = driver.findElement(By.cssSelector("body > #root > div > div.content___2zk1- > div.main___x4OjT > div > form > div.ant-alert.ant-alert-error > div > div"));String actual = errorMessageElement.getText();assert actual.equals("错误的用户名和密码");ScreenShot("loginFailedCase1");}// 测试用例二:输入错误的用户名和正确的密码public void loginFailedCase2() throws IOException {// 刷新当前页面driver.navigate().refresh();driver.findElement(By.cssSelector("#username")).sendKeys("error");driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button")).click();WebElement errorMessageElement = driver.findElement(By.cssSelector("body > #root > div > div.content___2zk1- > div.main___x4OjT > div > form > div.ant-alert.ant-alert-error > div > div"));String actual = errorMessageElement.getText();assert actual.equals("错误的用户名和密码");ScreenShot("loginFailedCase2");}// 测试用例三:输入正确的用户名和错误的密码public void loginFailedCase3() throws IOException {// 刷新当前页面driver.navigate().refresh();driver.findElement(By.cssSelector("#username")).sendKeys("admin");driver.findElement(By.cssSelector("#password")).sendKeys("12345");driver.findElement(By.cssSelector("#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button")).click();WebElement errorMessageElement = driver.findElement(By.cssSelector("body > #root > div > div.content___2zk1- > div.main___x4OjT > div > form > div.ant-alert.ant-alert-error > div > div"));String actual = errorMessageElement.getText();assert actual.equals("错误的用户名和密码");ScreenShot("loginFailedCase3");}// 测试用例四:不输入用户名但输入密码public void loginFailedCase4() throws IOException {// 刷新当前页面driver.navigate().refresh();driver.findElement(By.cssSelector("#username")).sendKeys("");driver.findElement(By.cssSelector("#password")).sendKeys("123456");driver.findElement(By.cssSelector("#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button")).click();WebElement errorMessageElement = driver.findElement(By.cssSelector("#username_help > div"));String actual = errorMessageElement.getText();assert actual.equals("用户名是必填项!");ScreenShot("loginFailedCase4");}// 测试用例五:输入用户名但不输入密码public void loginFailedCase5() throws IOException {// 刷新当前页面driver.navigate().refresh();driver.findElement(By.cssSelector("#username")).sendKeys("admin");driver.findElement(By.cssSelector("#password")).sendKeys("");driver.findElement(By.cssSelector("#root > div > div.content___2zk1- > div.main___x4OjT > div > form > button")).click();WebElement errorMessageElement = driver.findElement(By.cssSelector("#password_help > div"));String actual = errorMessageElement.getText();assert actual.equals("密码是必填项!");ScreenShot("loginFailedCase5");}
}

4.首页功能测试类(HomeTest.java)

package tests;import common.Utils;
import org.openqa.selenium.By;import java.io.IOException;public class HomeTest extends Utils {public static String url = "http://8.155.1.153:8081/home";public HomeTest() {super(url);}public void homeCheckElement() throws IOException {// 1. 检查首页标题driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > div"));// 2. 检查“问卷数”标题driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div.extraContent___3rMo7 > div:nth-child(1) > div > div.ant-statistic-title"));// 3. 检查“考试数”标题driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div.extraContent___3rMo7 > div:nth-child(2) > div > div.ant-statistic-title"));// 4. 检查“我的考试”按钮driver.findElement(By.cssSelector("#rc-tabs-0-tab-exam"));// 5. 检查“我的问卷”按钮driver.findElement(By.cssSelector("#rc-tabs-0-tab-survey"));// 6. 检查“问卷记录”按钮driver.findElement(By.cssSelector("#rc-tabs-0-tab-surveyHistory"));// 7. 检查“考试记录”按钮driver.findElement(By.cssSelector("#rc-tabs-0-tab-examHistory"));// 8. 检查“创建问卷”按钮driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(1)"));// 9. 检查“创建考试”按钮driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-col.ant-col-xs-24.ant-col-sm-24.ant-col-md-24.ant-col-lg-24.ant-col-xl-8 > div > div.ant-card-body > div > a:nth-child(2)"));// 添加屏幕截图ScreenShot("homeCheckElement");}
}

5.我的项目页面功能测试类(ProjectTest.java)

package tests;import common.Utils;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.testng.Assert;import java.io.IOException;import static java.lang.Thread.sleep;public class ProjectTest extends Utils {private static final String url = "http://8.155.1.153:8081/project";public ProjectTest() {super(url);}/*** 检查“我的项目”页面的基本元素是否存在* @throws IOException*/public void projectCheckElement() throws IOException {// 1. 页面标题driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > div > span"));// 2. 新建按钮driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button"));// 3. 搜索框driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > input"));// 4. 搜索按钮driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > span > button > span > svg"));// 截图ScreenShot("projectCheckElement");}/*** 功能测试:测试“新建问卷调查”和“查询”功能* @throws IOException* @throws InterruptedException*/public void projectFunctionTest_CreateSurvey() throws IOException, InterruptedException {// 点击【新建】按钮WebElement createBtn = driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button"));createBtn.click();ScreenShot("clickCreateButton");// 选择“新建问卷调查”WebElement surveyOption = driver.findElement(By.cssSelector("body > div:nth-child(7) > div > div > ul > li:nth-child(1)"));surveyOption.click();sleep(1000);ScreenShot("selectSurvey");// 等待编辑器出现并点击【保存】WebElement saveBtn = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button.ant-btn-primary")));saveBtn.click();ScreenShot("saveSurvey");// 返回项目页driver.navigate().back();driver.navigate().back();sleep(1000);ScreenShot("backToProject");// 输入搜索关键词WebElement searchInput = driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > input"));searchInput.sendKeys("请输入标题");ScreenShot("inputSearchKeyword");// 点击搜索按钮driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > span > button")).click();sleep(1000);ScreenShot("clickSearchButton");// 验证搜索结果WebElement resultTitle = driver.findElement(By.xpath("/html/body/div[1]/div/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/div/div/div/div[1]/div/div/div/div/div/div[1]/span[1]"));String actual = resultTitle.getText();System.out.println("提示信息: " + actual);Assert.assertEquals(actual, "请输入标题", "搜索结果与预期不符");ScreenShot("verifySearchResult");}public void projectFunctionTest_CreateExam() throws InterruptedException, IOException {// 点击【新建】按钮WebElement createBtn = driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button"));createBtn.click();ScreenShot("clickCreateButton_Exam");// 选择“新建在线考试”WebElement examOption = driver.findElement(By.xpath("/html/body/div[5]/div/div/ul/li[2]"));examOption.click();sleep(1000);ScreenShot("selectExam");// 等待并点击【保存】按钮WebElement saveBtn = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("/html/body/div[1]/div/div[2]/div/div[2]/div[1]/div[2]/div/button[5]")));saveBtn.click();sleep(1000);ScreenShot("saveExam");// 返回项目页driver.navigate().back();driver.navigate().back();ScreenShot("backToProject_Exam");// 输入搜索关键词WebElement searchInput = driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > input"));searchInput.sendKeys("考试名称");ScreenShot("inputExamSearch");// 点击搜索按钮driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > div > div > span > span > span > button > span > svg")).click();sleep(1000);ScreenShot("clickSearchButton_Exam");// 验证结果WebElement resultTitle = driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-list.ant-list-split.ant-list-grid.survey-home-content > div > div > div > div > div > div > div > div > div > div.card-header > span.survey-title"));String actual = resultTitle.getText();System.out.println("项目名称: " + actual);Assert.assertEquals(actual, "考试名称", "新建考试未正确保存或查询失败");ScreenShot("verifyExamResult");}
}

6.我的题库页面功能测试类(QuestionTest.java)

package tests;import common.Utils;
import org.openqa.selenium.By;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.testng.Assert;
import org.openqa.selenium.JavascriptExecutor;import java.io.IOException;import static java.lang.Thread.sleep;public class QuestionTest extends Utils {public static String url = "http://8.155.1.153:8081/repo/index";public QuestionTest() {super(url);}/*** 检查“我的题库”页面的基本 UI 元素是否存在*/public void questionCheckElement() throws IOException {// 名称输入标签driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(1) > div > div > div.ant-col.ant-form-item-label > label"));// 名称输入框driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(1) > div > div > div.ant-col.ant-form-item-control > div > div > span"));// 类型选择框标签driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(2)"));// 重置按钮driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(1) > button"));// 查询按钮driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button"));// 新建按钮driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-pro-table-list-toolbar > div > div.ant-space.ant-space-horizontal.ant-space-align-center.ant-pro-table-list-toolbar-right > div:nth-child(1) > div > div:nth-child(1) > button"));// 导出按钮driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-pro-table-list-toolbar > div > div.ant-space.ant-space-horizontal.ant-space-align-center.ant-pro-table-list-toolbar-right > div:nth-child(1) > div > div:nth-child(2) > button"));// 题库列表标题driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-pro-table-list-toolbar > div > div.ant-pro-table-list-toolbar-left > div"));// 文本导入按钮(第二行)driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-table-wrapper > div > div > div > div > div > table > tbody > tr:nth-child(2) > td:nth-child(9) > div > div:nth-child(1) > a"));// 试题管理按钮driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-table-wrapper > div > div > div > div > div > table > tbody > tr:nth-child(2) > td:nth-child(9) > div > div:nth-child(3) > a"));ScreenShot("questionCheckElement");}/*** 功能测试:测试“新建题库”功能*/public void questionFunctionTest_CreateRepo() throws InterruptedException, IOException {// 点击【新建】按钮WebElement createBtn = driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-pro-table-list-toolbar > div > div.ant-space.ant-space-horizontal.ant-space-align-center.ant-pro-table-list-toolbar-right > div:nth-child(1) > div > div:nth-child(1) > button"));createBtn.click();ScreenShot("clickCreateButton");// 定位抽屉区域(限制查找范围)WebElement drawer = wait.until(ExpectedConditions.visibilityOfElementLocated(By.className("ant-drawer-wrapper-body")));// 输入题库名称WebElement nameInput = drawer.findElement(By.cssSelector("#name"));nameInput.sendKeys("测试新增题库功能");ScreenShot("inputRepoName");sleep(3000); // 等待动态加载// 点击类型下拉框WebElement modeSelect = drawer.findElement(By.cssSelector("#mode"));modeSelect.click();ScreenShot("openTypeDropdown");sleep(1000);// 查找“问卷”选项并滚动点击WebElement optionsContainer = drawer.findElement(By.className("rc-virtual-list-holder-inner"));WebElement questionnaireOption = optionsContainer.findElement(By.xpath(".//div[@title='问卷']"));questionnaireOption.click();ScreenShot("selectQuestionnaire");sleep(2000);// 点击【确定】按钮WebElement confirmBtn = drawer.findElement(By.xpath("/html/body/div[4]/div/div[3]/div/div/div[3]/div/div/div[2]/button"));confirmBtn.click();ScreenShot("clickConfirm");// 验证是否返回题库列表页(查询按钮是否存在)driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button"));ScreenShot("backToQuestionList");}/*** 功能测试:测试“查询”功能*/public void questionFunctionTest_SearchRepo() throws InterruptedException, IOException {// 在名称输入框中输入WebElement nameInput = driver.findElement(By.cssSelector("#name"));nameInput.sendKeys("测试新增题库功能");ScreenShot("inputSearchKeyword");// 点击查询按钮WebElement searchBtn = driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(2) > button"));searchBtn.click();sleep(1000);ScreenShot("clickSearchButton");// 验证结果:检查第一行题库名称是否匹配WebElement resultName = driver.findElement(By.cssSelector("#sk-layout > div > div > section > div > main > div > div.ant-pro-grid-content > div > div > div > div:nth-child(2) > div > div.ant-table-wrapper > div > div > div > div > div > table > tbody > tr.ant-table-row.ant-table-row-level-0 > td:nth-child(2)"));Assert.assertEquals(resultName.getText(), "测试新增题库功能", "查询结果不匹配");ScreenShot("verifySearchResult");}/*** 功能测试:测试“重置”功能*/public void questionFunctionTest_ResetForm() throws InterruptedException, IOException {// 点击重置按钮WebElement resetBtn = driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-pro-grid-content > div > div > div > div.ant-pro-card.ant-pro-table-search.ant-pro-table-search-query-filter > form > div > div:nth-child(3) > div > div > div.ant-col.ant-form-item-control > div > div > div > div > div > div:nth-child(1) > button"));resetBtn.click();sleep(1000);ScreenShot("clickResetButton");// 验证输入框是否清空WebElement nameInput = driver.findElement(By.cssSelector("#name"));String actualValue = nameInput.getAttribute("value"); // 注意:input 的值用 getAttribute("value")Assert.assertEquals(actualValue, "", "重置后输入框未清空");ScreenShot("verifyReset");}}

7.模板广场页面功能测试类(TemplateTest.java)

package tests;import common.Utils;
import org.openqa.selenium.*;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert;import java.io.IOException;
import java.time.Duration;import static java.lang.Thread.sleep;public class TemplateTest extends Utils {public static String url = "http://8.155.1.153:8081/template";public TemplateTest() {super(url);}/*** 检查模板广场页面的基本 UI 元素是否存在*/public void templateCheckElement() throws IOException {// 检查页面标题driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-heading > div > span"));// 检查模板名字检索框driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > span > span > input")); // 更推荐用 placeholder// 检查“搜模板”按钮driver.findElement(By.xpath("//*[@id=\"sk-layout\"]/div/div/section/div[2]/main/div/div[1]/div[2]/div/div/div/div/div/span/span/span/button"));// 检查“添加模板”按钮driver.findElement(By.xpath("//*[@id=\"sk-layout\"]/div/div/section/div[2]/main/div/div[1]/div[1]/span/div/div/button"));// 检查“公有库”标签页driver.findElement(By.xpath("//*[@id=\"sk-layout\"]/div/div/section/div[2]/main/div/div[1]/div[3]/div/div[1]/div[1]/div/div[1]"));// 检查“私有库”标签页driver.findElement(By.xpath("//*[@id=\"sk-layout\"]/div/div/section/div[2]/main/div/div[1]/div[3]/div/div[1]/div[1]/div/div[2]"));// 检查“分类”标签driver.findElement(By.xpath("//*[@id=\"sk-layout\"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/div/form/div[1]/div[1]/span"));// 检查“标签”标签driver.findElement(By.xpath("//*[@id=\"sk-layout\"]/div/div/section/div[2]/main/div/div[2]/div/div/div/div[1]/div/form/div[2]/div[1]/span"));// 截图ScreenShot("templateCheckElement");}/*** 功能测试:添加模板和搜索功能*/public void templateFunctionTest() throws InterruptedException {// 测试添加模板功能// 点击添加模板按钮WebElement addTemplateBtn = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-heading > span > div > div > button")));addTemplateBtn.click();Thread.sleep(1000); // 等待1秒// 点击保存按钮driver.findElement(By.cssSelector("#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button:nth-child(5)")).click();Thread.sleep(1000);// 输入新增模板名称WebElement nameInput = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#name")));nameInput.sendKeys("测试添加模板功能");// 分类输入二号WebElement categoryInput = driver.findElement(By.cssSelector("#category"));categoryInput.sendKeys("二号");// 1. 定位并点击下拉框(触发下拉菜单)WebElement dropdownTrigger = driver.findElement(By.id("category")); // 或其他定位方式dropdownTrigger.click();// 2. 等待下拉选项出现(使用显式等待)WebDriverWait wait = new WebDriverWait(driver, Duration.ofSeconds(5));WebElement option = wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//div[@class='ant-select-item' and text()='二号']")));// 3. 点击目标选项option.click();Thread.sleep(5000);// 点击保存按钮driver.findElement(By.cssSelector("#survey-modal-container > div > div > div.ant-modal-wrap > div > div.ant-modal-content > div.ant-modal-footer > button.ant-btn.ant-btn-primary")).click();Thread.sleep(5000); // 等待5秒(视页面响应速度调整)// 点击关闭按钮driver.findElement(By.cssSelector("#editor > div.survey-main-panel > div.survey-main-panel-toolbar > div:nth-child(2) > div > button.ant-btn.ant-btn-primary.ant-btn-sm.ant-btn-dangerous")).click();Thread.sleep(1000);// 验证是否添加模板成功WebElement templateItem = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[contains(text(),'测试添加模板功能')]")));String actualText = templateItem.getText();System.out.println("找到的文本内容: " + actualText);Assert.assertTrue(actualText.contains("测试添加模板功能"), "模板添加失败");// 测试模板名字检索功能// 模板检索框中输入模板名字WebElement searchInput = wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > span > span > input")));searchInput.sendKeys("测试添加模板功能");// 点击搜模板按钮WebElement searchBtn = wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div.ant-page-header.ant-pro-page-container-warp-page-header.ant-pro-page-container-warp-page-header.ant-page-header-has-breadcrumb.ant-page-header-has-footer.ant-page-header-ghost > div.ant-page-header-content > div > div > div > div > div > span > span > span > button")));searchBtn.click();Thread.sleep(1000);// 验证是否检索成功(原逻辑存在Bug:应断言不存在"暂无数据")try {// 检查是否出现"暂无数据"WebElement noDataElement = driver.findElement(By.xpath("//*[contains(text(),'暂无数据')]"));Assert.fail("搜索功能异常:出现了\"暂无数据\"");} catch (Exception e) {System.out.println("搜索功能正常,未出现\"暂无数据\"");}}
}

8.个人设置页面功能测试类(IndividualTest.java)

package tests;import common.Utils;
import org.openqa.selenium.By;
import org.testng.Assert;
import org.testng.annotations.Test;import java.io.IOException;
import java.util.concurrent.TimeUnit;public class IndividualTest extends Utils {public static String url = "http://8.155.1.153:8081/system/setting";public IndividualTest() {super(url);}public void personalCheckElement() {// 检查页面标题driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.title___3cGwa"));// 检查更换头像按钮driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.right___3-EXe > span > div > span > div > button"));// 检查姓名标签driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(2) > div > div.ant-col.ant-form-item-label > label"));// 检查姓名输入框driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(2) > div > div.ant-col.ant-form-item-control > div > div > span"));// 检查手机号标签driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(3) > div > div.ant-col.ant-form-item-label > label"));// 检查手机号输入框driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(3) > div > div.ant-col.ant-form-item-control > div > div > span"));// 检查邮箱标签driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(4) > div > div.ant-col.ant-form-item-label > label"));// 检查邮箱输入框driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(4) > div > div.ant-col.ant-form-item-control > div > div > span"));// 检查个人简介标签driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div:nth-child(5) > div > div.ant-col.ant-form-item-label > label"));// 检查个人简介输入框driver.findElement(By.cssSelector("#profile"));// 检查提交按钮driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(2) > button"));}// 更新信息成功的测试用例public void personalSuccessTest() {// 刷新页面driver.navigate().refresh();// 输入姓名driver.findElement(By.cssSelector("#name")).sendKeys("zhangsan123");// 输入手机号driver.findElement(By.cssSelector("#phone")).sendKeys("14745667235");// 输入邮箱driver.findElement(By.cssSelector("#email")).sendKeys("lvdongrui2023@163.com");// 输入个人简介driver.findElement(By.cssSelector("#profile")).sendKeys("这是更新个人基本信息功能测试");// 点击提交按钮driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(2) > button")).click();// 验证是否更新成功(通过页面右上角的用户名)String actual = driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > header.ant-layout-header.ant-pro-layout-header.ant-pro-layout-header-fixed-header.ant-pro-layout-header-mix.ant-pro-layout-header-fixed-header-action.ant-pro-layout-header-header > div > div.ant-pro-global-header-right-content > div > div > div > span > div > span:nth-child(2)")).getText();System.out.println("姓名: " + actual);// 断言检测是否符合预期Assert.assertEquals(actual, "zhangsan123", "姓名更新验证失败");}public void personalFailTest() throws InterruptedException {// 测试用例一:不输入姓名,其他信息正常输入// 刷新页面driver.navigate().refresh();// 输入手机号driver.findElement(By.cssSelector("#phone")).sendKeys("14745667235");// 输入邮箱driver.findElement(By.cssSelector("#email")).sendKeys("lvdongrui2023@163.com");// 输入个人简介driver.findElement(By.cssSelector("#profile")).sendKeys("这是更新个人基本信息功能测试");// 点击提交按钮driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(2) > button")).click();TimeUnit.SECONDS.sleep(1);// 验证是否更新失败String actual = driver.findElement(By.cssSelector("#name_help > div")).getText();System.out.println("提示信息: " + actual);Assert.assertEquals(actual, "请输入您的昵称!", "姓名为空验证失败");// 测试用例二:不输入手机号,其他信息正常输入// 刷新页面driver.navigate().refresh();// 输入姓名driver.findElement(By.cssSelector("#name")).sendKeys("Admin123");// 输入邮箱driver.findElement(By.cssSelector("#email")).sendKeys("lvdongrui2023@163.com");// 输入个人简介driver.findElement(By.cssSelector("#profile")).sendKeys("这是更新个人基本信息功能测试");// 点击提交按钮driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(2) > button")).click();TimeUnit.SECONDS.sleep(1);// 验证是否更新失败actual = driver.findElement(By.cssSelector("#phone_help > div")).getText();System.out.println("提示信息: " + actual);Assert.assertEquals(actual, "请输入您的联系电话!", "手机号为空验证失败");// 测试用例三:不输入邮箱,其他信息正常输入// 刷新页面driver.navigate().refresh();// 输入姓名driver.findElement(By.cssSelector("#name")).sendKeys("Admin123");// 输入手机号driver.findElement(By.cssSelector("#phone")).sendKeys("14745667235");// 输入个人简介driver.findElement(By.cssSelector("#profile")).sendKeys("这是更新个人基本信息功能测试");// 点击提交按钮driver.findElement(By.cssSelector("#sk-layout > div > div > section > div.ant-pro-layout-container > main > div > div > div > div.right___2jdGg > div.baseView___3sRG3 > div.left___GavW0 > form > div.ant-space.ant-space-horizontal.ant-space-align-center > div:nth-child(2) > button")).click();TimeUnit.SECONDS.sleep(1);// 验证是否更新失败actual = driver.findElement(By.cssSelector("#email_help > div")).getText();System.out.println("提示信息: " + actual);Assert.assertEquals(actual, "请输入您的邮箱!", "邮箱为空验证失败");}
}

9.启动文件(RunTest.java)

import tests.*;import java.io.IOException;public class RunTest {public static void main(String[] args) throws IOException, InterruptedException {
//        RegisterTest register = new RegisterTest();
//        register.registerFailedCase1();LoginTest login = new LoginTest();
//        login.loginFailedCase1();
//        login.loginFailedCase2();
//        login.loginFailedCase3();
//        login.loginFailedCase4();
//        login.loginFailedCase5();login.loginSuccess();
//        HomeTest home = new HomeTest();
//        home.homeCheckElement();
//        ProjectTest project = new ProjectTest();
//        project.projectCheckElement();
//        project.projectFunctionTest_CreateSurvey();
//        project.projectFunctionTest_CreateExam();
//        QuestionTest question = new QuestionTest();
//        question.questionCheckElement();
//        question.questionFunctionTest_CreateRepo();
//        question.questionFunctionTest_ResetForm();
//        question.questionFunctionTest_SearchRepo();
//        TemplateTest template = new TemplateTest();
//        template.templateCheckElement();
//        template.templateFunctionTest();IndividualTest individual = new IndividualTest();individual.personalFailTest();}}

六、Bug描述

1.我的题库页面

”导出“按钮异常:点击”导出“按钮无响应,导出功能失效

2.用户管理页面

新建用户页面:必选项状态栏未选,正常创建用户成功

修改用户信息页面:用户名已存在不进行提示,而且还可以正常创建

用户重置密码页面:当新密码与旧密码相同时不进行提示并且也可以修改成功

3.个人设置页面

旧密码与新密码一致时没有提示和修改失败,反而修改成功

七、总结

问卷考试系统的基本功能正常运行,正常流程能够正确执行。

需优化“我的题库页面”中“导出”按钮异常问题。

需优化“模板广场页面”中“搜模板”按钮异常问题。

需优化“用户管理页面”中新建用户页里未勾选状态框也能新建成功的问题。

交互体验良好:所有按钮点击响应迅速,页面渲染正常,无错别字、遮挡或显示异常。

http://www.dtcms.com/a/337213.html

相关文章:

  • Golang 语言中的指针操作
  • Android中使用RxJava实现网络请求与缓存策略
  • 实习两个月总结
  • 通义万相Wan2.1- 阿里推出的开源视频生成大模型
  • 从哲学(业务)视角看待数据挖掘:从认知到实践的螺旋上升
  • Elasticsearch查询中的track_total_hits参数
  • 【网络安全实验报告】实验五:网络嗅探及安全性分析
  • 在阿里云 CentOS Stream 9 64位 UEFI 版上离线安装 Docker Compose
  • CentOS 7更换国内镜像源
  • CentOS 7安装OpenVASGVM指南
  • 国产!全志T113-i 双核Cortex-A7@1.2GHz 工业开发板—ARM + DSP、RISC-V核间通信开发案例
  • [数据结构] ArrayList 与 顺序表
  • OVS:ovn为什么默认选择Geneve作为二层隧道网络协议?
  • 【Day 30】Linux-Mysql数据库
  • 大数据计算引擎(三)——Elasticsearch入门
  • uart串口 day57
  • 产品经理如何提升职场学习能力?破除成长瓶颈
  • Vue+Flask 电影协同推荐可视化平台 前后端分离 大数据分析
  • Windows从零到一安装KingbaseES数据库及使用ksql工具连接全指南
  • 05.用户和组管理命令
  • 【机器学习】FPR(False Positive Rate,误报率)是什么?
  • Zephyr下ESP32S3开发环境搭建(Linux篇)
  • 深度研究系统、方法与应用的综述
  • Transformer架构的编码器和解码器介绍
  • 管理本地用户和组:红帽企业 Linux 系统安全的基础
  • TDengine `count_window` 指定列计数功能用户手册
  • 数据泵实施VPS海外:跨国数据同步的完整解决方案
  • elasticsearch-集成prometheus监控(k8s)
  • 【iOS】锁的原理
  • Flutter 多功能列表项:图标、文字与Switch组合