目录
3.6.2 详情页显示的第一条博客是刚刚发布的博客信息(标题和时间)
3.7.1 点击修改博客跳转到该博客的写博客页面,可以进行编辑
一、项目介绍
该项目是由自我团队开发的一款博客网页项目,可以实现用户注册登录并且发布博客、删除博客、修改博客、注销等功能,可以实现博客的互相交流。
二、书写功能测试自动化用例
三、自动化测试用例
3.1 前言
(1)在进行写自动化测试之前,先确定需要进行自动化测试的功能,然后根据书写的测试用例图标来编写自动化测试。本自动化测试代码用webDriver这个开源的自动化测试框架来书写。
(2)所谓的webDriver,可以与不同的浏览器进行交互,模拟用户操作来进行测试。其工作原理是通过与浏览器驱动程序进行通信来控制浏览器。
均使用隐式智能等待,如果元素在指定时间内被找到,那么就不会继续死等,如果未在指定时间内找到元素,则抛出异常NoSuchElementException。
(3)在针对提示弹窗事件,使用Alert来获取弹窗,然后做点击确定或取消动作。
selenium提供了Alert的API专门获取Alert.使用方法:
Alert a = driver.switchTo().alert(); //此方法可以获取当前页面弹出的alert
a.getText(); //获取当前提示框的文本内容
a.accept(); //点击提示框中的确定按钮
a.dismiss(); //点击提示框中的取消按钮
3.2 UI自动化初始化和退出
把驱动创建和退出浏览器动作,放到一个父类中,然后让每一个测试用例都继承这两个方法。
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;
import java.util.concurrent.TimeUnit;
public class InitAndEnd {
static WebDriver webDriver;
@BeforeAll
//创建驱动
static void SetUp(){
webDriver = new ChromeDriver();
}
@AfterAll
//退出浏览器
static void TearDown(){
webDriver.quit();
}
}
在测试方法类中继承父类,保证每一个测试用例均可正常运行。
public class BlogCases extends InitAndEnd{
}
接下来开始写自动化测试用例
3.3 点击主页
在未登录该博客系统之前,可以在首页观看已经发布过的博客,仅仅只能查看全文。
代码如下:
/**
* 点击主页可以看见曾经发布的博客
*/
@Test
@Order(1)
void BlogLook() {
//打开博客登录界面,未登陆前可以看见主页的博客
webDriver.get("http://localhost:8080/login.html");
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//点击主页按键,进入主页,在未登录前看博客
webDriver.findElement(By.xpath("/html/body/div[1]/a[1]")).click();
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
}
在此方法中,可以实现自动检测未登录之前的博客系统页面中,查看全文功能是否正常。
测试图片:
3.4 编写登录功能自动化测试
3.4.1 输入正确的账号和错误的密码,登录失败
/**
* 输入正确的账号错误的密码,登录失败
*/
@Test
@Order(2)
void LoginFail1() {
//打开博客登录页面
webDriver.get("http://localhost:8080/login.html");
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//输入账号haojie
webDriver.findElement(By.cssSelector("#username")).sendKeys("haojie");
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//输入密码123456
webDriver.findElement(By.cssSelector("#password")).sendKeys("123456");
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//点击登录按钮
webDriver.findElement(By.cssSelector("#submit")).click();
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//获取当前页面的弹窗
Alert a = webDriver.switchTo().alert();
//点击弹窗确定按键
a.accept();
}
在此代码中,可以验证当账号正确,密码不正确时,系统的反馈。
测试图片:
3.4.2 输入错误的账号和正确的密码,登录失败
/**
* 输入错误的账号正确的密码,登录失败
*/
@Test
@Order(3)
void LoginFail2() {
//打开博客登录页面
webDriver.get("http://localhost:8080/login.html");
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//输入账号lisi
webDriver.findElement(By.cssSelector("#username")).sendKeys("lisi");
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//输入密码123
webDriver.findElement(By.cssSelector("#password")).sendKeys("123");
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//点击登录按钮
webDriver.findElement(By.cssSelector("#submit")).click();
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//获取当前页面的弹窗
Alert a = webDriver.switchTo().alert();
//点击弹窗确定按键
a.accept();
}
在此代码中,可以验证当账号不正确,密码正确时,系统的反馈。
测试图片:
3.4.3 输入错误的账户和错误的密码,登陆失败
/**
* 输入错误的账户错误的密码,登录失败
*/
@Test
@Order(4)
void LoginFail3() {
//打开博客登录页面
webDriver.get("http://localhost:8080/login.html");
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//输入账号lisi
webDriver.findElement(By.cssSelector("#username")).sendKeys("lisi");
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//输入密码123456
webDriver.findElement(By.cssSelector("#password")).sendKeys("123456");
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//点击登录按钮
webDriver.findElement(By.cssSelector("#submit")).click();
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//获取当前页面的弹窗
Alert a = webDriver.switchTo().alert();
//点击弹窗确定按键
a.accept();
}
在此代码中,可以验证当账号不正确,密码不正确时,系统的反馈。
测试图片:
3.4.4 输入正确的账号和正确的密码,登陆成功
为了后续方便更改登录的账号和密码更改,在resources下创建了LoginSuccess.csv文件,用来存放登录的账号和密码以及登录界面网址,方便后续修改。
/**
* 输入正确的账号密码登陆成功
*/
@ParameterizedTest
@CsvFileSource(resources = "LoginSuccess.csv")
@Order(5)
void LoginSuccess(String username,String password,String blog_list_url) {
//打开博客登录页面
webDriver.get("http://localhost:8080/login.html");
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//输入账号haojie
webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//输入密码123
webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//点击登录按钮
webDriver.findElement(By.cssSelector("#submit")).click();
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//跳转到博客列表页面
//获取当前页面的url
String cur_url = webDriver.getCurrentUrl();
Assertions.assertEquals(blog_list_url,cur_url);
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
}
在此代码中,可以验证当账号正确,密码正确时,系统的反馈。直接跳转到博客列表页面,可以 看到曾经发布的博客,并且进行操作。
测试图片:
3.5 查看全文
3.5.1 点击查看全文跳转到博客详情页面
点击博客列表第一个博客的查看全文,然后进入该博客的详情界面。
//点击第一个博客的查看全文跳转
webDriver.findElement(By.xpath("//*[@id=\"artlist\"]/div[1]/a[1]")).click();
3.5.2 博客标题和博客列表标题是一样的
同时获取博客列表的第一个博客的标题和点开的博客的标题,进行判定是否相同。
//获取点开的博客的标题
String blog_title = webDriver.findElement(By.cssSelector("#title")).getText();
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//对比两个获取的标题是否一样
Assertions.assertEquals(blog_list_title,blog_title);
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
3.5.3 显示的博客作者是用户本人
同时在博客详情页面获取作者的名字和用户名是否相同。若都相同,那么测试成功。
//显示的作者和用户名相同
//获取作者名字
String auto_name = webDriver.findElement(By.cssSelector("#author")).getText();
//比较
Assertions.assertEquals(blog_user_name,auto_name);
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
为了方便对博客标题和用户名是否相同做比较,
引入@ParameterizedTest和@MethodSource("Generator"),并且创建Generator方法,直接设置作为标准的博客标题和用户名。
public static Stream<Arguments> Generator() {
return Stream.of(Arguments.arguments("测试测试","haojie"));
}
/**
* 查看全文
*/
@Order(6)
@ParameterizedTest
@MethodSource("Generator")
void BlogList(String blog_list_title,String blog_user_name){
//点击第一个博客的查看全文跳转
webDriver.findElement(By.xpath("//*[@id=\"artlist\"]/div[1]/a[1]")).click();
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//获取点开的博客的标题
String blog_title = webDriver.findElement(By.cssSelector("#title")).getText();
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//对比两个获取的标题是否一样
Assertions.assertEquals(blog_list_title,blog_title);
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//显示的作者和用户名相同
//获取作者名字
String auto_name = webDriver.findElement(By.cssSelector("#author")).getText();
//比较
Assertions.assertEquals(blog_user_name,auto_name);
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
}
测试图片:
3.6 写博客发布博客
3.6.1 标题栏输入“这是一个测试博客”,点击发布按钮
在输入标题内容时,选择使用的是一个JS来对内容进行输入。
/**
* 写博客发布博客
*/
@Test
@Order(7)
void EditBlog(){
//找到写博客按钮,点击
webDriver.findElement(By.xpath("//*[@id=\"userElement\"]/a[1]")).click();
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//通过JS来对内容进行输入
((JavascriptExecutor)webDriver).executeScript("document.getElementById(\"title\").value=\"这是一个测试博客\"");
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//点击发布
webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//获取当前页面的弹窗
Alert a = webDriver.switchTo().alert();
//点击弹窗确定按键
a.dismiss();
//获取当前界面的url
String cur_url = webDriver.getCurrentUrl();
Assertions.assertEquals("http://localhost:8080/myblog_list.html",cur_url);
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
}
测试图片:
3.6.2 详情页显示的第一条博客是刚刚发布的博客信息(标题和时间)
标题相同,并且时间也相同,那么,测试通过。
/**
* 校验已发布的博客标题
* 校验已发布的博客时间
*/
@Test
@Order(8)
void BlogInfoChecked() {
webDriver.get("http://localhost:8080/myblog_list.html");
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//获取第一篇博客标题
String first_blog_title = webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > div.title")).getText();
//获取第一篇博客发布时间
String first_blog_time = webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > div.date")).getText();
//校验博客标题
Assertions.assertEquals("这是一个测试博客",first_blog_title);
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//校验博客时间
if(first_blog_time.contains("2023-10-08")){
System.out.println("测试通过");
}else{
System.out.println("当前时间:"+first_blog_time);
System.out.println("测试不通过");
}
}
测试图片:
3.7 修改博客
3.7.1 点击修改博客跳转到该博客的写博客页面,可以进行编辑
修改博客用到的输入方法同样是用JS输入。
//博客列表界面打开修改
webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > a:nth-child(5)")).click();
//通过JS来对内容进行修改输入
((JavascriptExecutor)webDriver).executeScript("document.getElementById(\"title\").value=\"这是在修改一个测试博客\"");
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//点击发布
webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
3.7.2 修改完成点击发布然后跳转到博客列表页面
//获取弹窗
Alert a = webDriver.switchTo().alert();
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//点击确定
a.accept();
//校验返回博客列表页面
String cur_url = webDriver.getCurrentUrl();
Assertions.assertEquals("http://localhost:8080/myblog_list.html",cur_url);
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
在修改完成后,需要获取弹窗然后确定修改成功,返回博客列表界面。
/**
* 修改博客
*/
@Test
@Order(9)
void ReviseBlog(){
//博客列表界面打开修改
webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > a:nth-child(5)")).click();
//通过JS来对内容进行修改输入
((JavascriptExecutor)webDriver).executeScript("document.getElementById(\"title\").value=\"这是在修改一个测试博客\"");
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//点击发布
webDriver.findElement(By.cssSelector("body > div.blog-edit-container > div.title > button")).click();
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//获取弹窗
Alert a = webDriver.switchTo().alert();
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//点击确定
a.accept();
//校验返回博客列表页面
String cur_url = webDriver.getCurrentUrl();
Assertions.assertEquals("http://localhost:8080/myblog_list.html",cur_url);
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
}
测试图片:
3.8删除博客
3.8.1 点击删除,确认删除后,显示博客列表页面
//点击删除按键
webDriver.findElement(By.xpath("//*[@id=\"artlist\"]/div[1]/a[3]")).click();
//获取弹窗
Alert a = webDriver.switchTo().alert();
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//点击确定
a.accept();
//删除成功弹窗点击确定
a.accept();
3.8.2 列表页标题不是刚刚写的博客标题
//验证此时第一篇博客标题不是“这是一个测试博客”
String first_blog_title = webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > div.title")).getText();
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
Assertions.assertNotEquals(first_blog_title,"这是一个测试博客");
/**
* 删除博客
*/
@Test
@Order(10)
void DeleteBlog(){
//点击删除按键
webDriver.findElement(By.xpath("//*[@id=\"artlist\"]/div[1]/a[3]")).click();
//获取弹窗
Alert a = webDriver.switchTo().alert();
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
//点击确定
a.accept();
//删除成功弹窗点击确定
a.accept();
//验证此时第一篇博客标题不是“这是一个测试博客”
String first_blog_title = webDriver.findElement(By.cssSelector("#artlist > div:nth-child(1) > div.title")).getText();
webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
Assertions.assertNotEquals(first_blog_title,"这是一个测试博客");
}
测试图片:
3.9 注销
3.9.1 注销后返回未登录前的博客列表页面
/**
* 注销
*/
@Test
@Order(11)
void Quit(){
//找到这个注销按键,点击
webDriver.findElement(By.xpath("/html/body/div[1]/a[3]")).click();
Alert a = webDriver.switchTo().alert();
a.accept();
//校验是否跳转到未登录前的博客列表
String cur_url = webDriver.getCurrentUrl();
Assertions.assertEquals("http://localhost:8080/blog_list.html",cur_url);
}
测试图片:
四、项目总结
自动化测试源码运行结果截图:测试通过
测试博客系统项目,经过对项目的设计需求分析,然后自己对项目的了解,针对项目进行设计相关的自动化测试用例,自动化测试是为了将部分关键并且重复性的测试工作进行自动化编写,并不能代表该项目的全部测试用例,还需要进行手工测试,才能算测试完毕。在这篇博客中,我对这个项目的自动化测试进行用例编写,然后代码书写,在此写下一篇总结,作为回顾和分析问题,同样也掌握了部分自动化测试功能。