目录
一. 简介
论坛是采用前后端分离的方式实现的 该系统旨在为用户提供一个基于 Web 的文章发布和讨论平台。用户可以进行注册登录、查看和修改个人信息,以及进行帖子的增删改查等基础操作。此外,系统还提供了评论、站内信等交流功能,用户可以对帖子进行点赞,并在帖子详情页上查看点赞数和阅读量等信息。
二. 测试环境
硬件:Dell G15 2021 (i7-11800H/16GB/3050Ti)
操作系统:windows10;
浏览器:Chrome 版本 129.0.6668.59(正式版本) (64 位)
测试工具:黑盒测试,Selenium
自动化脚本运行环境: IntelliJ IDEA 2022.1.4
三. 测试执行概况及功能测试
1. 手工测试
1.1. 手动编写测试用例
功能测试用例:
非功能测试用例:
1.2. 手动执行的部分测试用例
对注册页面进行的测试
场景1:在输入部分注册信息时,由于信息不全,点击注册按钮后系统应该给出相应的提示。
预期结果:页面提示部分信息不能为空。
实际结果:系统确实给出了相应的提示,要求补全所有必填项,与预期一致。
场景2:输入一个已经存在的用户名,并确保密码和确认密码一致,然后点击注册按钮。
预期结果:系统应该提示用户该用户名已经存在。
实际结果:系统确实给出了提示,提示用户该用户名已经存在,与预期结果一致。
场景3:输入一个不存在的用户名,并且输入密码与确认密码不一致,然后点击注册按钮。
预期结果:系统应该提示用户检查确认密码是否输入一致。
实际结果:系统确实给出了相应的提示,指示用户检查确认密码,与预期结果一致
场景4:输入一个不存在的用户名,同时确保密码和确认密码一致,然后点击注册按钮。
预期结果:系统应该显示注册成功,并跳转回登录界面。
实际结果:系统确实显示了注册成功,并且跳转回了登录界面,符合预期。
对登录页面进行的测试
场景1:输入一个已经存在的用户名,并确保密码输入正确,然后点击登录按钮。
预期结果:系统应该显示登录成功,并跳转到论坛首页。
实际结果:系统确实显示了登录成功,并且跳转到了论坛首页,与预期结果一致
场景2:输入一个已经存在的用户名,并且输入错误的密码,然后点击登录按钮。
预期结果:系统应该显示登录失败,并给出相应的错误提示。
实际结果:系统确实显示了登录失败,并给出了错误提示,符合预期。
场景3:输入一个不存在的用户名,然后点击登录按钮。
预期结果:系统应该显示登录失败,并给出相应的错误提示。
实际结果:系统确实显示了登录失败,并给出了错误提示,符合预期。
对首页进行的测试
场景1:在未登录或登录过期的状态下,点击首页链接或手动输入首页地址。
预期结果:系统应该自动跳转回登录界面,要求用户重新登录。
实际结果:系统确实执行了跳转回登录界面的操作,与预期一致。
场景2:在未登录状态下录或登录过期的状态下,点击首页中的任意一条帖子内容。
预期结果:系统应该自动跳转回登录界面,要求用户重新登录。
实际结果:系统确实执行了跳转回登录界面的操作,与预期一致。
场景3:登录状态下,点击“首页”按钮。
预期结果:应该显示导航栏中的所有版块名称,下方应显示所有帖子列表,并且右上方应该显示登录用户的信息。
实际结果:系统确实展示了导航栏中的所有版块名称,下方显示了所有帖子列表,并且右上方显示了登录用户的信息,与预期一致。
场景4:登录状态下,点击导航栏中的版块名“Java”。
预期结果:系统应该展示 Java 版块的名称,该版块下的帖子数量,以及该版块下的所有帖子列表,并且右上方应该显示登录用户的信息。
实际结果:系统确实展示了 Java 版块的名称和帖子数量,同时显示了该版块下的所有帖子列表,并且右上方也显示了登录用户的信息,与预期一致。
场景5:登录状态下,在搜索框中输入关键字“测试”进行搜索。
预期结果:系统应该显示下方所有帖子正文中包含关键字“多线程”的帖子。
实际结果:由于项目目前未实现搜索功能,实际结果是刷新回到首页界面,与预期不符。
场景6:登录状态下,点击“月亮”按钮。
预期结果:系统应该进入夜间模式的切换。
实际结果:系统确实执行了夜间模式的切换操作,与预期一致。
场景7:登录状态下,点击“发布帖子”按钮。
预期结果:系统应该进入帖子编辑页面,且版块名默认选择 Java。
实际结果:系统确实进入了帖子编辑页面,并且版块名默认选择了 Java,符合预期。
对编辑页面进行的测试
场景1:未登录状态下(登录过期),尝试进入编辑页面。
预期结果:系统应该自动跳转回登录界面,要求用户重新登录。
实际结果:系统确实执行了跳转回登录界面的操作,与预期一致。
场景2:在登录状态下,发布帖子时不输入帖子标题,只输入帖子内容,然后点击发布按钮。
预期结果:系统应该给出提示,要求用户输入帖子标题。
实际结果:系统确实给出了提示,要求用户输入帖子标题,与预期一致。
场景3:登录状态下,输入了帖子标题但没有输入帖子内容,然后点击发布按钮。
预期结果:系统应该给出提示,要求用户输入帖子内容。
实际结果:系统确实给出了提示,要求用户输入帖子内容,与预期一致。
场景4:登录状态下,输入了帖子标题和帖子内容,然后点击发布按钮。
预期结果:系统应该成功编辑帖子,并跳转回首页,最上方应该显示刚发布的帖子信息。
实际结果:系统确实执行了编辑成功的操作,跳转回了首页,并在最上方显示了刚发布的帖子信息,与预期一致。
对帖子详情页面进行的测试
场景1:未登录或者登录过期的状态下,点击首页中的任意一条帖子内容。
预期结果:系统应该自动跳转回登录界面,要求用户重新登录。
实际结果:系统确实执行了跳转回登录界面的操作,与预期一致。
场景2:登录状态下,点击首页中的一条帖子内容,例如“第一篇帖子”。
预期结果:系统应该跳转到该帖子的详情页面。
实际结果:系统确实跳转到了该帖子的详情页面,与预期一致。
场景3:登录状态下,点击首页中的一条帖子内容,“第一篇帖子”(帖子作者“乾”,当前登录作者“hz”)。
预期结果:系统应该跳转到该帖子的详情页面,最上方应该显示该帖子的信息,左侧应该显示帖子作者的信息,下方应该显示该帖子的内容,而下方应该只显示点赞按钮。
实际结果:系统确实展示了预期的内容,包括帖子信息、作者信息、帖子内容以及点赞按钮,与预期一致。
场景4:登录状态下,点击帖子详情页面上的点赞按钮。
预期结果:应该看到上方显示的点赞数加1。
实际结果:系统确实执行了点赞操作,上方显示的点赞数加1,与预期一致。
场景5:登录状态下,点击首页中的一条帖子内容,“123”(帖子作者“梧桐”,当前登录作者“梧桐”)。
预期结果:系统应该跳转到该帖子的详情页面,最上方应该显示该帖子的信息,左侧应该显示帖子作者的信息,下方应该显示该帖子的内容,而下方应该显示点赞按钮、删除按钮和编辑按钮。
实际结果:系统确实展示了预期的内容,包括帖子信息、作者信息、帖子内容以及点赞按钮、删除按钮和编辑按钮,与预期一致。
。
1.3. 上述手工测试发现的bug
- 在给帖子进行评论时,尽管评论可以成功发布,但是评论输入框中的内容并没有自动清空。
- 个人中心的发帖数量更新不及时,即使在登录状态下发布新帖子或者删除旧帖子,个人中心页面刷新几次后仍然显示相同的帖子数量,需要退出登录并重新登录才能正常更新显示。
- 在编辑界面中,编辑器有时加载不完全,导致无法进行编辑操作,需要手动刷新页面才能解决该问题。
2. 自动化测试
2.1. 封装常用的方法
这部分代码是为了在测试过程中初始化和关闭浏览器驱动,并提供了截图功能来记录测试执行的结果。
提供了以下功能:
- 在测试开始前,通过 Selenium WebDriver 初始化浏览器驱动(ChromeDriver)。
- 获取屏幕截图并保存的方法(getScreenShot),根据时间戳生成文件名并将截图保存到指定路径。
void createDriver (String url){
WebDriverManager.chromedriver().setup();
ChromeOptions options = new ChromeOptions();
options.addArguments("--remote-allow-origins=*");
driver = new ChromeDriver(options);
driver.get(url);
}
void getScreenshot(String str) throws IOException {
//初级版本截图
// File file = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
// FileUtils.copyFile(file,new File("mytest.png"));
//高级截图,图片分组
// ./src/test/image/
// /2024-07-12/
// /test01-12253062.png
// /test01-12253082.png
// /2024-07-19/
// /test01-12253062.png
//设置时间格式
SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");
SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");
//获取时间
String dirTime = sim1.format(System.currentTimeMillis());
String fileTime = sim2.format(System.currentTimeMillis());
//创建存储路径
String filename = "./src/test/image/"+dirTime+"/"+str+"-"+fileTime+".png";
System.out.println("filename:"+filename);
//截图
File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
//放到文件夹中
FileUtils.copyFile(srcFile,new File(filename));
}
2.2. 注册页面测试
2.2.1. 验证注册成功的情况
场景1:注册用户名在数据库中不存在,昵称正常输入,两次密码输入一致,执行注册操作后,预期注册成功并跳转回登录页面。
具体流程如下:
使用 WebDriver 打开登录页面。
点击页面中的注册按钮,跳转到注册页面。
输入不存在于数据库中的用户名 “haha17”、昵称 “haha”,并输入两次相同的密码 “123”。
勾选同意协议复选框。
点击注册按钮进行注册。
等待页面跳转,然后获取当前页面的 URL。
判断页面跳转后的 URL 是否是预期的登录页面的 URL。
如果跳转成功,断言注册成功。
void regSuccess() throws IOException, InterruptedException {
//创建驱动对象,并打开登陆页面
createDriver("http://127.0.0.1:9580/sign-in.html");
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
//点击注册按钮跳转
driver.findElement(By.cssSelector("body > div.page.page-center >" +
" div > div > div:nth-child(1) > div" +
" > div.text-center.text-muted.mt-3 > a")).click();
//输入用户名
driver.findElement(By.cssSelector("#username")).sendKeys("haha17");
//输入昵称
driver.findElement(By.cssSelector("#nickname")).sendKeys("haha");
//输入密码
driver.findElement(By.cssSelector("#password")).sendKeys("123");
//输入确认密码
driver.findElement(By.cssSelector("#passwordRepeat")).sendKeys("123");
//点击同意许可
driver.findElement(By.cssSelector("#policy")).click();
//点击注册按钮
driver.findElement(By.cssSelector("#submit")).click();
System.out.println(driver.findElement(By.cssSelector("#submit")).getText());
Thread.sleep(2000);
//注册成功后会跳转到登录页面
String loginHtmlUrl = "http://127.0.0.1:9580/sign-in.html";
//获取当前页面的URL
String nowUrl = driver.getCurrentUrl();
//截图记录
getScreenshot(getClass().getName());
//断言
assert nowUrl.equals(loginHtmlUrl);
}
2.2.2. 验证注册失败的情况
场景2:用户名已存在于数据库中,但昵称和两次输入的密码仍然符合要求,执行注册操作后,预期注册失败并停留在注册页面。
具体流程如下:
使用 WebDriver 打开登录页面。
点击页面中的注册按钮,跳转到注册页面。
输入已存在于数据库中的用户名 “wangzian”、昵称 “hz”,并输入两次相同的密码 “123”。
勾选同意协议复选框。
点击注册按钮进行注册。
等待页面响应,获取当前页面的 URL。
判断页面是否停留在注册页面,即当前页面的 URL 是否是预期的注册页面的 URL。
如果停留在注册页面,断言注册失败。
void regAbnomal() throws IOException, InterruptedException {
//创建驱动对象,并打开登陆页面
createDriver("http://127.0.0.1:9580/sign-in.html");
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
//点击注册按钮跳转
driver.findElement(By.cssSelector("body > div.page.page-center >" +
" div > div > div:nth-child(1) > div" +
" > div.text-center.text-muted.mt-3 > a")).click();
//输入用户名
driver.findElement(By.cssSelector("#username")).sendKeys("wangzian");
//输入昵称
driver.findElement(By.cssSelector("#nickname")).sendKeys("hz");
//输入密码
driver.findElement(By.cssSelector("#password")).sendKeys("123");
//输入确认密码
driver.findElement(By.cssSelector("#passwordRepeat")).sendKeys("123");
//点击同意许可
driver.findElement(By.cssSelector("#policy")).click();
//点击注册按钮
driver.findElement(By.cssSelector(" #submit")).click();
Thread.sleep(2000);
//注册失败后不会跳转
String regHtmlUrl = "http://127.0.0.1:9580/sign-up.html";
//获取当前页面的URL
String nowUrl = driver.getCurrentUrl();
//截图记录
getScreenshot(getClass().getName());
//断言
assert nowUrl.equals(regHtmlUrl);
}
2.3. 登录界面测试
2.3.1. 登录失败测试
场景1:用户名正确但密码错误,执行登录操作后,预期登录失败并出现警告提示。
具体流程如下:
使用 WebDriver 打开论坛的登录页面。
输入正确的用户名 “admin” 和错误的密码 “123”。
点击登录按钮进行登录操作。
等待页面响应并获取警告提示的文本内容。
验证警告提示内容是否与预期一致。
截图保存测试结果。
断言警告提示内容与预期是否一致
void loginAbnormal() throws IOException, InterruptedException {
// 使用 WebDriver 打开论坛的登录页面。
createDriver("http://127.0.0.1:9580/sign-in.html");
// 输入正确的用户名 “wangzian” 和错误的密码 “1234”。
driver.findElement(By.cssSelector("#username")).sendKeys("wangzian");
driver.findElement(By.cssSelector("#password")).sendKeys("1234");
// 点击登录按钮进行登录操作。
driver.findElement(By.cssSelector("#submit")).click();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
// 等待页面响应并获取警告提示的文本内容。
String str = driver.findElement(By.cssSelector("body > div.jq-toast-wrap.bottom-right > div > h2")).getText();
// 验证警告提示内容是否与预期一致。
getScreenshot(getClass().getName());
// 截图保存测试结果。
assert str.equals("警告");
}
2.3.2. 登录成功测试
场景2:用户名和密码都正确,执行登录操作后,预期登录成功并跳转到系统主页。
具体流程如下:
使用 WebDriver 打开论坛的登录页面。
用户名和密码数据,例如 “wutong, 123456”。
输入正确的用户名和密码。
点击登录按钮进行登录操作。
等待页面响应并获取当前首页元素。
确保登录成功后跳转到系统主页。
void loglinSuccess() throws IOException {
createDriver("http://127.0.0.1:9580/sign-in.html");
// 输入正确的用户名 “wangzian” 和正确的密码 “1234”。
driver.findElement(By.cssSelector("#username")).sendKeys("wangzian");
driver.findElement(By.cssSelector("#password")).sendKeys("123");
// 点击登录按钮进行登录操作。
driver.findElement(By.cssSelector("#submit")).click();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
// 等待页面响应进入首页,检查页面是否有首页标题
driver.findElement(By.cssSelector("#article_list_board_title"));
getScreenshot(getClass().getName());
// 截图保存测试结果。
}
2.4. 显示帖子列表测试
2.4.1. 未登录状态下测试
场景1:未登录状态下,直接通过 URL 访问主页帖子列表,预期返回登录页面。
具体流程如下:
使用 WebDriver 直接访问论坛的主页列表页面。
获取当前页面的 URL。
验证当前页面的 URL 是否是预期的登录页面的 URL。
截图保存测试结果。
断言当前页面的 URL 是否与预期的登录页面的 URL 一致,确保未登录状态下访问主页列表会被重定向到登录页面。
void BlogList1() throws InterruptedException, IOException {
//打开列表页
createDriver("http://127.0.0.1:9580/index.html");
String loginUrl = "http://127.0.0.1:9580/sign-in.html";
Thread.sleep(2000);
//获取当前页面的URl
String nowUrl = driver.getCurrentUrl();
//截图记录
getScreenshot(getClass().getName());
//断言
assert nowUrl.equals(loginUrl);
}
2.4.2. 登录状态下测试
场景2:登录状态下,进入论坛首页,验证页面是否正确显示帖子相关的控件信息。
具体流程如下:
使用 WebDriver 进行登录操作,输入用户名和密码并点击登录按钮。
等待页面响应,并验证页面的导航栏是否显示了 “首页” 文本。
截图保存测试结果。
断言导航栏中是否包含 “首页” 文本,确保页面正确显示了导航栏信息。
查看是否有发布帖子的按钮,并点击该按钮。
等待页面响应,查看是否跳转到了帖子编辑页面,并验证页面是否包含 “发新贴” 文本。
截图保存测试结果。
断言页面是否包含 “发新贴” 文本,确保跳转到了帖子编辑页面。
void BlogList2() throws InterruptedException, IOException {
//打开登录页
createDriver("http://127.0.0.1:9580/sign-in.html");
// 输入正确的用户名 “wangzian” 和正确的密码 “1234”。
driver.findElement(By.cssSelector("#username")).sendKeys("wangzian");
driver.findElement(By.cssSelector("#password")).sendKeys("123");
// 点击登录按钮进行登录操作。
driver.findElement(By.cssSelector("#submit")).click();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(3));
// 等待页面响应进入首页,检查页面是否有首页标题
driver.findElement(By.cssSelector("#article_list_board_title"));
// 定位发帖子按钮并点击
driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none >" +
" div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")).click();
// 定位发新帖标签
String text = driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div > h2")).getText();
// 截图
getScreenshot(getClass().getName());
assert text.equals("发新贴");
}
2.5. 发布帖子测试
2.5.1. 登录后测试标题和内容其中一个为空
场景1:登录后,点击发布帖子,进入编辑页分别 输入帖子标题但不输入帖子内容 和 不输入帖子标题但输入帖子内容,分别点击发布按钮,测试这两种情况能否成功发布。
具体流程如下:
场景1):登录状态下,测试标题和内容其中一个为空时,发布帖子失败并出现相应提示。
打开登录页面,输入用户名和密码进行登录。
点击发布帖子按钮,进入帖子编辑页面。
第一个场景中,只输入标题而不输入内容,点击发布按钮。
验证发布失败后页面出现的提示信息是否为 “请输入帖子内容”。
截图保存测试结果并断言提示信息是否符合预期。
场景2):不输入标题,只输入内容时,发布帖子失败并出现相应提示。
清空标题输入框内容。
编辑帖子内容,因为使用了第三方md插件,不能直接通过sendkeys输入内容,通过模拟点击事件插入内容。
点击发布按钮。
验证发布失败后页面出现的提示信息是否为 “请输入帖子标题”。
截图保存测试结果并断言提示信息是否符合预期。
void writeBlog1() throws IOException, InterruptedException {
//打开登录页
createDriver("http://127.0.0.1:9580/sign-in.html");
// 输入正确的用户名 “wangzian” 和正确的密码 “1234”。
driver.findElement(By.cssSelector("#username")).sendKeys("wangzian");
driver.findElement(By.cssSelector("#password")).sendKeys("123");
// 点击登录按钮进行登录操作。
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(2000);
// 等待页面响应进入首页,检查页面是否有首页标题
driver.findElement(By.cssSelector("#article_list_board_title"));
// 定位发帖子按钮并点击
driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none >" +
" div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")).click();
// 定位发新帖标签
String text = driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div > h2")).getText();
// 截图
getScreenshot(getClass().getName());
//确认进入发贴页
assert text.equals("发新贴");
//输入标题
driver.findElement(By.cssSelector("#article_post_title")).sendKeys("自动化测试");
Thread.sleep(2000);
//点击发布#article_post_submit
// 使用 Actions 类可以模拟鼠标操作
WebElement element = driver.findElement(By.cssSelector("#article_post_submit"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().perform();
//查看提示
text = driver.findElement(By.cssSelector("body > div.jq-toast-wrap.bottom-right > div > h2")).getText();
getScreenshot(getClass().getName());
assert text.equals("提示");
//清空标题,输入内容
driver.findElement(By.cssSelector("#article_post_title")).clear();
//内容区域不支持sendKeys输入,但是可以点击
driver.findElement(By.cssSelector("#edit-article > div.editormd-toolbar > div > ul > li:nth-child(20) > a > i")).click();
//点击发布
driver.findElement(By.cssSelector("#article_post_submit")).click();
text = driver.findElement(By.cssSelector("body > div.jq-toast-wrap.bottom-right > div > h2")).getText();
getScreenshot(getClass().getName());
assert text.equals("提示");
}
2.5.2. 登录后测试标题和内容都不为空
场景:登录后,点击发布帖子,进入编辑页输入帖子标题帖子内容,预期能够成功发布。
具体流程如下:
打开登录页面,输入用户名和密码进行登录。
点击发布帖子按钮,进入帖子编辑页面。
输入标题和内容,这里测试输入的标题为 “测试发布”。
点击发布按钮。
等待页面响应,验证发布成功后是否跳转到首页,并查看首页的帖子列表中是否包含刚发布的标题 “测试发布”。
截图保存测试结果并断言首页帖子列表中是否包含期望的标题。
void writeBlog2() throws InterruptedException, IOException {
//打开登录页
createDriver("http://127.0.0.1:9580/sign-in.html");
// 输入正确的用户名 “wangzian” 和正确的密码 “1234”。
driver.findElement(By.cssSelector("#username")).sendKeys("wangzian");
driver.findElement(By.cssSelector("#password")).sendKeys("123");
// 点击登录按钮进行登录操作。
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(2000);
// 等待页面响应进入首页,检查页面是否有首页标题
driver.findElement(By.cssSelector("#article_list_board_title"));
// 定位发帖子按钮并点击
driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none >" +
" div > div > div.col-auto.ms-auto.d-print-none > div > a.btn.btn-primary.d-none.d-sm-inline-block.article_post")).click();
// 定位发新帖标签
String text = driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none > div > div > div > h2")).getText();
// 截图
getScreenshot(getClass().getName());
//确认进入发贴页
assert text.equals("发新贴");
//输入标题
driver.findElement(By.cssSelector("#article_post_title")).sendKeys("自动化测试");
//点击的方式加入内容
driver.findElement(By.cssSelector("#edit-article > div.editormd-toolbar > div > ul > li:nth-child(20) > a > i")).click();
Thread.sleep(2000);
//点击发布#article_post_submit
// 使用 Actions 类可以模拟鼠标操作
WebElement element = driver.findElement(By.cssSelector("#article_post_submit"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().perform();
Thread.sleep(2000);
//检查首页标签,判断是否发布成功
text = driver.findElement(By.cssSelector("#article_list_board_title")).getText();
//截图记录
getScreenshot(getClass().getName());
assert text.equals("首页");
}
2.6. 查询帖子内容测试
场景1:登录后,查看帖子内容,分别查看 帖子作者和当前登录用户一致 和 不一致 的帖子,是否正确显示对应帖子的信息。
具体流程如下:
点击帖子标题为“测试”的帖子,验证帖子标题是否正确,是否有点赞按钮,并截图保存测试结果。
点击帖子标题为“自动化测试”的帖子,验证帖子标题是否正确,是否有点赞按钮、编辑按钮和删除按钮,并截图保存测试结果。
void showBlog() throws InterruptedException, IOException {
//查看别人的贴子,有点赞按钮,没有删除按钮
createDriver("http://127.0.0.1:9580/sign-in.html");
// 输入正确的用户名 “wangzian” 和正确的密码 “1234”。
driver.findElement(By.cssSelector("#username")).sendKeys("wangzian");
driver.findElement(By.cssSelector("#password")).sendKeys("123");
// 点击登录按钮进行登录操作。
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(2000);
//点击页面第一个帖子的标题
driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) " +
"> div > div.col > div.text-truncate > a > strong")).click();
//定位发布时间,浏览,点赞,评论标签
driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none " +
"> div > div.col-auto.d-none.d-md-inline > ul"));
//定位点赞按钮
String text = driver.findElement(By.cssSelector("#details_btn_like_count")).getText();
//截图
getScreenshot(getClass().getName());
assert text.equals("点赞");
}
void showBlog2() throws InterruptedException, IOException {
//查看自己的贴子,有点赞按钮,有删除按钮
createDriver("http://127.0.0.1:9580/sign-in.html");
// 输入正确的用户名 “wangzian” 和正确的密码 “1234”。
driver.findElement(By.cssSelector("#username")).sendKeys("wangzian");
driver.findElement(By.cssSelector("#password")).sendKeys("123");
// 点击登录按钮进行登录操作。
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(2000);
//点击页面第一个帖子的标题
driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) " +
"> div > div.col > div.text-truncate > a > strong")).click();
Thread.sleep(2000);
//定位发布时间,浏览,点赞,评论标签
driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none " +
"> div > div.col-auto.d-none.d-md-inline > ul"));
//定位点赞按钮
driver.findElement(By.cssSelector("#details_btn_like_count"));
//获取删除按钮的文字
String text = driver.findElement(By.cssSelector("#bit-forum-content > div.page-body " +
"> div > div > div:nth-child(1) > div.col-9.card.card-lg > div.card-footer.bg-transparent.mt-auto.justify-content-end " +
"> div > div:nth-child(3) > div")).getText();
System.out.println(text);
//截图
getScreenshot(getClass().getName());
assert text.equals("删除");
}
2.7. 编辑修改帖子测试
场景1:登录状态下,修改登录用户自己的帖子,修改标题和内容,重新发布,重新查看帖子内容看是否更新。
具体流程如下:
登录并点击帖子标题为“与风行”的帖子,进入帖子详情页。
点击编辑按钮,跳转到编辑页面。
清空原标题,更新标题为“自动化修改标题”,同时添加样式表示修改。
点击提交按钮,保存修改并跳转到主页。
验证帖子列表中相应帖子的标题是否已更新为“自动化修改标题”。
void updataBlog() throws InterruptedException, IOException {
//查看自己的贴子,有点赞按钮,有删除按钮
createDriver("http://127.0.0.1:9580/sign-in.html");
// 输入正确的用户名 “wangzian” 和正确的密码 “1234”。
driver.findElement(By.cssSelector("#username")).sendKeys("wangzian");
driver.findElement(By.cssSelector("#password")).sendKeys("123");
// 点击登录按钮进行登录操作。
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(2000);
getScreenshot(getClass().getName());
//点击页面第一个帖子的标题
driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) " +
"> div > div.col > div.text-truncate > a > strong")).click();
Thread.sleep(2000);
//定位编辑按钮,并点击
driver.findElement(By.cssSelector("#details_artile_edit > span")).click();
Thread.sleep(2000);
//定位标题输入框,并清除之前的内容
driver.findElement(By.cssSelector("#edit_article_title")).clear();
//重新输入
driver.findElement(By.cssSelector("#edit_article_title")).sendKeys("自动化修改标题!");
//点击页面下方提交按钮
// 使用 Actions 类可以模拟鼠标操作
WebElement element = driver.findElement(By.cssSelector("#edit_article_submit > span"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().perform();
Thread.sleep(2000);
String text = driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) " +
"> div > div.col > div.text-truncate > a > strong")).getText();
//截图记录
getScreenshot(getClass().getName());
assert text.equals("自动化修改标题!");
}
2.8. 删除帖子测试
场景1:登录状态下,进入帖子详情页,点击删除按钮,删除帖子成功,成功跳转回帖子列表页面。
具体流程如下:
登录并点击第一个帖子标题为“测试发布”的帖子,进入帖子详情页。
在帖子详情页点击删除按钮,弹出删除确认弹窗。
点击确定按钮,确认删除帖子。
验证帖子列表中第一条帖子标题是否已更新为其他值(比如"1111")
void deleteBlog() throws InterruptedException, IOException {
//删除自己写的帖子
createDriver("http://127.0.0.1:9580/sign-in.html");
// 输入正确的用户名 “wangzian” 和正确的密码 “1234”。
driver.findElement(By.cssSelector("#username")).sendKeys("wangzian");
driver.findElement(By.cssSelector("#password")).sendKeys("123");
// 点击登录按钮进行登录操作。
driver.findElement(By.cssSelector("#submit")).click();
Thread.sleep(1000);
//点击进入第一个贴子,并记录第二个帖子标题
String text = driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(2) " +
"> div > div.col > div.text-truncate > a > strong")).getText();
driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) " +
"> div > div.col > div.text-truncate > a > strong")).click();
Thread.sleep(1000);
//定位删除按钮,并点击
driver.findElement(By.cssSelector("#bit-forum-content > div.page-body > div > div " +
"> div:nth-child(1) > div.col-9.card.card-lg > div.card-footer.bg-transparent.mt-auto.justify-content-end " +
"> div > div:nth-child(3) > div > a > span")).click();
Thread.sleep(1000);
//定位提示弹窗,并点击删除按钮
driver.findElement(By.cssSelector("#details_artile_delete")).click();
Thread.sleep(1000);
//跳转到首页,获取的一个帖子的标题,用于对比
String newtext = driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) " +
"> div > div.col > div.text-truncate > a > strong")).getText();
getScreenshot(getClass().getName());
assert newtext.equals(text);
}
2.9. 我的帖子查询测试
场景1:登录状态下,进入主页,点击我的帖子,跳转到个人中心页面,显示用户昵称等信息。
具体流程如下:
- 登录并点击头像,进入个人中心查看选项。
- 点击我的帖子。
- 验证我的帖子详情页面中注册账号时间。
void myBlog() throws InterruptedException, IOException {
createDriver("http://127.0.0.1:9580/sign-in.html");
// 输入正确的用户名 “wangzian” 和正确的密码 “1234”。
driver.findElement(By.cssSelector("#username")).sendKeys("wangzian");
driver.findElement(By.cssSelector("#password")).sendKeys("123");
// 点击登录按钮进行登录操作。
driver.findElement(By.cssSelector("#submit")).click();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
//Thread.sleep(1000);
//点击头像
driver.findElement(By.cssSelector("#index_nav_avatar")).click();
//点击我的帖子
driver.findElement(By.cssSelector("#index_user_profile")).click();
//进入个人主页可以看到账号注册时间,查看元素
driver.findElement(By.cssSelector("#bit-forum-content > div.page-header.d-print-none " +
"> div > div > div.col > div > div:nth-child(3)"));
getScreenshot(getClass().getName());
}
2.10. 点赞测试
场景1:登录状态下,进入帖子详情页,点击点赞按钮,验证点赞数是否相应增加。
具体流程如下:
- 登录并进入帖子详情页。
- 获取点赞前的点赞数。
- 点击点赞按钮。
- 获取点赞后的点赞数。
- 验证点赞后的点赞数是否等于点赞前的点赞数加一
void showLike() throws IOException, InterruptedException {
createDriver("http://127.0.0.1:9580/sign-in.html");
// 输入正确的用户名 “wangzian” 和正确的密码 “1234”。
driver.findElement(By.cssSelector("#username")).sendKeys("wangzian");
driver.findElement(By.cssSelector("#password")).sendKeys("123");
// 点击登录按钮进行登录操作。
driver.findElement(By.cssSelector("#submit")).click();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
//Thread.sleep(1000);
//点击一个帖子
driver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div " +
"> div.col > div.text-truncate > a > strong")).click();
Thread.sleep(1000);
//查看帖子的点赞数
String cur = driver.findElement(By.cssSelector("#details_article_likeCount")).getText();
//点击点赞按钮
driver.findElement(By.cssSelector("#details_btn_like_count")).click();
Thread.sleep(1000);
String now = driver.findElement(By.cssSelector("#details_article_likeCount")).getText();
getScreenshot(getClass().getName());
int num = Integer.parseInt(now)-Integer.parseInt(cur);
assert num==1;
}
2.11. 退出测试
场景1:登录后,点击用户头像下的退出按钮,跳转回登录界面,退出成功。
具体流程如下:
登录并进入个人中心页面。
点击头像,再点击退出。
验证退出后是否跳转到登录页面
void Exit() throws IOException {
createDriver("http://127.0.0.1:9580/sign-in.html");
// 输入正确的用户名 “wangzian” 和正确的密码 “1234”。
driver.findElement(By.cssSelector("#username")).sendKeys("wangzian");
driver.findElement(By.cssSelector("#password")).sendKeys("123");
// 点击登录按钮进行登录操作。
driver.findElement(By.cssSelector("#submit")).click();
driver.manage().timeouts().implicitlyWait(Duration.ofSeconds(5));
//Thread.sleep(1000);
//点击头像
driver.findElement(By.cssSelector("#index_nav_avatar")).click();
//点击退出
driver.findElement(By.cssSelector("#index_user_logout > span")).click();
getScreenshot(getClass().getName());
//获取当前URL
String url = driver.getCurrentUrl();
assert url.equals("http://127.0.0.1:9580/sign-in.html");
}