考问通系统测试分析报告
一、报告简介
1.项目背景
考问通系统是 Web 在线测评平台,核心功能包括:全周期管理问卷与考试,支持组织在线问卷、考试及练习,能收集分析数据,还可管理题库资源。
系统面向教育机构、企业培训部门及市场调研机构,提供从问卷 / 考试创建、发布、答题到结果分析的一站式全流程解决方案,助力高效智能化管理测评工作。
考问通系统的核心模块:
- 用户管理模块:包含用户注册、登录以及用户权限控制。
- 问卷/考试管理模块:包含问卷/考试的创建、修改、发布。
- 题库管理模块:包含新建题库、查询、导入导出题库。
- 练习管理模块:包含查询练习、在线进行练习、错题记录。
- 模板管理模块:包含问卷/考试模板的创建、添加、发布。
- 系统设置模块:包含个人设置、界面设置、安全设置。
2.测试目的
1.功能验证
- 确保所有核心功能符合需求规格说明书要求。
- 验证用户注册/登录流程的完整性和正确性。
- 确定问卷/考试管理模块中问卷/考试的创建、修改、发布流程的完整性和可用性。
- 检查题库管理模块相关核心功能的完整性和可用性。
- 验证模板管理的问卷/考试模板的创建、添加、发布的完整性和可用性。
2.用户体验优化
- 通过测试评估页面布局的合理性和美观性。
- 测试不同错误操作下的错误提示是否完整清晰易懂。
- 检查设计风格是否统一(如按钮样式、字体大小、颜色搭配在全平台保持一致)。
- 测试新用户能否快速理解产品功能。
3.测试系统的稳定性
- 评估系统在高并发场景下的稳定性。
- 测试长时间运行时系统的性能表现。
- 测试超出预期用户量时的系统行为表现。
- 验证异常情况(网络中断、服务器错误)下的系统行为。
4.安全性测试
- 测试用户身份认证与授权机制。
- 检查敏感数据(如密码、支付信息)是否通过 HTTPS 等加密协议传输,避免明文泄露。
- 测试数据库中敏感数据是否加密存储,而非明文保存。
- 检查是否存在已知高危漏洞(如 Heartbleed、Log4j 漏洞)。
- 测试SQL注入、XSS等常见Web攻击防护。
5.兼容性验证
- 检查网页应用在不同浏览器及其不同版本上的显示效果、功能可用性。
- 测试软件在不同操作系统(Windows、macOS、Linux 等)及其不同版本上的兼容性。
- 测试产品在不同网络环境(如 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.个人设置页面
旧密码与新密码一致时没有提示和修改失败,反而修改成功
七、总结
问卷考试系统的基本功能正常运行,正常流程能够正确执行。
需优化“我的题库页面”中“导出”按钮异常问题。
需优化“模板广场页面”中“搜模板”按钮异常问题。
需优化“用户管理页面”中新建用户页里未勾选状态框也能新建成功的问题。
交互体验良好:所有按钮点击响应迅速,页面渲染正常,无错别字、遮挡或显示异常。