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

个人博客系统系统---测试报告

目录

1、测试项目的背景介绍

2、手动进行Web的基本功能测试

2.1 如何设计测试用例

2.2 设计个人博客系统测试用例的思维导图

2.3 登录页面 

2.4列表页面

2.5 博客详情页面测试(点击博客列表页的查看全文进入)

2.6博客编辑页面和发布页面

2.7删除博客

2.8 博客退出功能

3.使用Selenium进行Web自动化测试

3.1引入pom.xml依赖

3.2创建驱动和释放驱动以及屏幕截图

3.3登录页面自动化测试代码

3.4 博客列表页面自动化测试代码

3.5博客详情页自动化测试代码

3.6博客发布页自动化测试代码

4.测试总结


1、测试项目的背景介绍

        个人博客系统基于SSM框架的基础上实现的。博客系统的有登录页面、列表页面、博客详情页面、博客编辑页、博客发布页面这五个页面构成。为了验证博客功能是否完整,我将对博客系统进行手工测试和自动化测试。测试的内容的看这五个页面的呈现是否完整,功能是否能正常使用。例如登录功能,查看博客功能,发布博客功能,编辑博客功能。并且查看在不同的特殊情况下,博客系统的情况是否与预期结果一样。

2、手动进行Web的基本功能测试

2.1 如何设计测试用例

测试用例的设计一般从7个方面进行设计:

        功能测试、界面测试、性能测试、兼容性测试、易用性测试、安全测试、弱网测试。个人实现的博客系统是一个web网页,我主要对其核心的功能进行测试。

2.2 设计个人博客系统测试用例的思维导图

       基于个人博客系统功能测试设计出的思维导图如下:

        

2.3 登录页面 

        

        因为账号和密码都存储在数据库里,只要在对应的输入框里输入正确的账号和密码就可以了转跳到博客列表页里。

      a). 登录界面展示

       b). 在对应的输入框输入正常的账号和密码:(账号:zhangsan 密码:123456)

预期效果:转跳到对应博客列表页

实际效果展示:

c1). 输入正确的账号和错误的密码 :(账号:zhangsan 密码:12345)

预期结果:密码错误

实际结果展示:

c2). 输入错误的账号和正确的密码 :(账号 wangwu 密码:123456)

预期结果:用户不存在

实际结果展示:

c3). 输入错误的账号和错误的密码 (账号:wangwu 密码:12345)

预期结果:账号不存在

实际结果展示:

c4). 输入的账号和密码为空  : (不输入账号和密码)

预期结果:账号或密码不能为空

实际结果:

c5). 输入的账号为空,输入的密码不为空     (不输入账号,密码:123456)

预期结果:账号或密码不能为空

实际结果:

c6). 输入的账号不为空,输入的密码为空  (账号:zhangsan  不输入密码)

预期结果:账号或密码不能为空

实际结果展示:

2.4列表页面

        登录页面输入正确的账号和密码后,会转跳到博客列表页面,可以看到当前用户昵称和发布的文章数量以及分类,列表区可以看到已发布博客文章的信息(标题,时间,博客内容)等信息,菜单栏可以看到主页,写博客,注销。

        列表页展示

        

a). 从网址进入

2.5 博客详情页面测试(点击博客列表页的查看全文进入)

        博客详情页面里有当前登录用户的昵称和发布文章的数量以及分类的数量,可以看到发布的博客文章的标题,发布博客的时间和博客的内容,菜单栏有主页,写博客和注销。

        如果查看的是当前用户自己发布的文章,当前用户对这篇文章的权限是:读、写、修改、删除等,如果查看的文章是由其他用户发布的,那么当前用户对文章的权限是只读

       博客的详情页面

        预期效果:有用户信息、编辑删除按钮,博客标题和内容存在

                

2.6博客编辑页面和发布页面

在博客列表页面右上角点击“写博客”,即可进入博客编辑页面,此时可以进行新博客的写入操作

a) .用户登录成功后会转入博客列表页 ,点击写博客即可转跳到编辑页

预期效果:博客编辑页有发布文章按钮,文本工具区,文本标题框,内容输出区和内容展示区

      

b1). 发布博客失败

输入的内容或者标题不能为空,否则会发布失败,弹出弹窗提示

b2). 发布博客成功

 预期效果:跳转回博客列表区,博客文章数量+1

2.7删除博客

        在博客列表眼找到任意一篇博客,点击查看全文后跳转到该博客的博客详情页,在详情页点击里面的删除按钮就会再次跳转到博客列表页,此刻发现该博客被删除,博客数量-1

a). 在博客列表页点击查看全文,进入博客详情页

b). 跳转到详情页面后点击删除按钮

预期效果:当前博客文章被删除,且跳转到博客列表页,博客文章数量-1

实际效果:可以看到博客已经被删除了

2.8 博客退出功能

        在博客列表页、博客编辑页、博客详情页、博客发布页中点击退出按钮,会跳转到博客登录界面,界面的账号密码数据都被清空

a)点击右上角的退出按钮就可以退出博客

预期效果:退出到博客登录界面,并且输入框中的账号密码为空

实际效果:

3.使用Selenium进行Web自动化测试

        环境准备

        系统:windows11
        浏览器:Chrome141.0.7340.0、Edge127.0.2651.74
        测试工具:Selenium4.0.0 

        这里编写自动化测试脚本的语言为Java

     想要进行Web自动化测试需要安装两个工具

        1.selenium库:Selenium是一个Web自动化测试工具,它提供丰富的方法给使用者进行web自动化

        2.webdrivermanagerr驱动:通过手工安装驱动来启动浏览器可以,但是需要满足驱动版本与浏览器匹配,驱动的浏览器类型与浏览器匹配。每当浏览器更新之后,就得重新下载对应驱动,因此selenium提供了webdrivermanager,它是一个开源的命令行工具,使用驱动管理程序就无需手动安装驱动,而是自动下载和安装不同的浏览器的WebDriver,并且自动下载适合你浏览器版本的驱动,从而避免问题

        同时需要拥有对应的编译环境来编写自动化测试脚本------Idea

3.1引入pom.xml依赖

我们需要创建Maven项目引入如下依赖(selenium4、webdrivermanager等):

 <dependencies><!--        添加驱动管理程序依赖--><dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.8.0</version><scope>test</scope></dependency><!--        添加Selenium依赖--><dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.0.0</version></dependency><!--        添加屏幕截图的依赖--><dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId><version>2.15.1</version></dependency></dependencies>

3.2创建驱动和释放驱动以及屏幕截图

        这里我们创建了一个Util类,将所有常用的对象在此类中初始化并且设为静态方法并且每一个需要测试的页面都创建为一个类。它们全部继承于这个父类,将driver对象设置为静态对象,创建一次后就无需创建。将一些常用的对象在父类中初始化,并且设为静态,这样就无需反复创建。在构造方法中,当初次调用构造方法,自动创建驱动对象,转跳到对应的网址,并且还能初始化一些对象,例如WebDriverWait等。

        在初次调用创建驱动方法,会自动创建驱动并且初始化隐式等待。隐式等待作用于整个程序,但是无法处理弹窗或者非页面元素。

        并且创建屏幕截图方法,屏幕截图可以在自动化脚本出现错误的时候讲有问题的地方截下来,放在对应日期的文件夹里,搭配日志可以更快锁定问题。

此处为Util类的代码:

package common;import io.github.bonigarcia.wdm.WebDriverManager;
import org.apache.commons.io.FileUtils;
import org.bouncycastle.asn1.cmp.Challenge;
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;
import java.util.Random;public class Util {//public static WebDriver driver;public static String UseName="zhangsan";public static String Password="123456";public static String DeatilUrl="http://8.137.19.140:9090/blog_detail.html?blogId=155163";public static WebDriverWait wait;public static Random random;public Util(String Url){driver= createDriver();driver.get(Url);wait=new WebDriverWait(driver,Duration.ofSeconds(15));random=new Random(System.currentTimeMillis());}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 ScreenShoot(String str) throws IOException {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/java/images/"+dirTime+"/"+str+"_"+fileTime+".png";File imagefile= ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);FileUtils.copyFile(imagefile,new File(filename));}public void quitWebDriver(WebDriver driver){this.driver.quit();}
}

3.3登录页面自动化测试代码

①创建一个文件夹名为test,将每一个页面的自动化测试脚本放入其中。创建一个类为:loginPage.java,存放于test方法文件夹中,里面存在测试登录的方法(包括成功登录和异常登录),再继承Util类,获取Util静态方法

②引入名为Util的通用方法的java包

③在loginPage.java中创建构造函数,在类内初始化Url,并且将Url通过构造函数传递给父类,并且打开该网址

④重点注意清空输入框的内容后才能再次输入用户名及密码进行登录

⑤(测试内容):在这个自动化测试中主要是对页面是否正常打开,并且针对是否可以登录成功/登录失败进行测试。 

⑥创建一个类为:run_Aoto_Test.java,初始化该页面类,在里面注意函数调用的顺序,想要看到其他页面的正常效果必须先登录成功 

编写博客登录页自动化测试类---loginPage.java

package test;import common.Util;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;import java.io.IOException;
import java.time.Duration;public class loginPage extends Util {public static String Url="http://8.137.19.140:9090/blog_login.html";public loginPage(){super(Url);//登录界面}/*** 测试用例*正常登录*/public void cheakPageRight() throws IOException {//正确输入账号密码ScreenShoot("loginpage_initialize");driver.findElement(By.cssSelector("body > div.nav > img"));//图片是否加载assert  driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).getText().equals("主页");//检查文字是否加载出来assert  driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).getText().equals("写博客");//检查文字是否加载出来assert  driver.findElement(By.cssSelector("body > div.nav > span")).getText().equals("我的博客系统");//检查文字是否加载出来assert  driver.findElement(By.cssSelector("body > div.container-login > div > h3")).getText().equals("登陆");//检查文字是否加载出来assert  driver.findElement(By.cssSelector("body > div.container-login > div > div:nth-child(2) > span")).getText().equals("用户名");//检查文字是否加载出来assert  driver.findElement(By.cssSelector("body > div.container-login > div > div:nth-child(3) > span")).getText().equals("密码");//检查文字是否加载出来assert  driver.findElement(By.cssSelector("#submit")).getText().equals("提交");//检查文字是否加载出来driver.findElement(By.cssSelector("#username"));//检查输入框是否被加载driver.findElement(By.cssSelector("#password"));//检查输入框是否被加载assert  driver.findElement(By.cssSelector("#submit")).getText().equals("提交");//检查文字是否加载出来}public void loginSuc() throws InterruptedException, IOException {driver.get(loginPage.Url);driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");//检查输入框是否被加载,并且输入正确的账号driver.findElement(By.cssSelector("#password")).sendKeys("123456");//检查输入框是否被加载,并且输入正确的密码driver.findElement(By.cssSelector("#submit")).click();wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("body > div.nav > a:nth-child(4)")));ScreenShoot("login_sucess");}/*** 测登录失败的测试用例* 1.账号为空,密码不为空* 2.密码为空,账号不为空* 3.账号和密码都为空* 4.账号错误,密码正确* 5.账号正确,密码错误*/public void loginFail01(){//账号为空,密码不为空driver.get(loginPage.Url);driver.findElement(By.cssSelector("#password")).sendKeys("123456");//检查输入框是否被加载,并且输入正确的密码driver.findElement(By.cssSelector("#submit")).click();WebDriverWait wait=new WebDriverWait(driver,Duration.ofSeconds(2));wait.until(ExpectedConditions.alertIsPresent());Alert alert=driver.switchTo().alert();assert  alert.getText().equals("账号或密码不能为空");alert.accept();}public void loginFail02(){//账号不为空,密码为空driver.get(loginPage.Url);driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");//检查输入框是否被加载,并且输入正确的账号driver.findElement(By.cssSelector("#submit")).click();WebDriverWait wait=new WebDriverWait(driver,Duration.ofSeconds(2));wait.until(ExpectedConditions.alertIsPresent());Alert alert=driver.switchTo().alert();assert  alert.getText().equals("账号或密码不能为空");alert.accept();}public void loginFail03(){//账号和密码都为空driver.get(loginPage.Url);driver.findElement(By.cssSelector("#submit")).click();WebDriverWait wait=new WebDriverWait(driver,Duration.ofSeconds(2));wait.until(ExpectedConditions.alertIsPresent());Alert alert=driver.switchTo().alert();assert  alert.getText().equals("账号或密码不能为空");alert.accept();}public void loginFail04(){//账号错误,密码正确driver.get(loginPage.Url);driver.findElement(By.cssSelector("#username")).sendKeys("wangwu");//检查输入框是否被加载,并且输入错误的账号driver.findElement(By.cssSelector("#password")).sendKeys("123456");//检查输入框是否被加载,并且输入正确的密码driver.findElement(By.cssSelector("#submit")).click();WebDriverWait wait=new WebDriverWait(driver,Duration.ofSeconds(2));wait.until(ExpectedConditions.alertIsPresent());Alert alert=driver.switchTo().alert();assert  alert.getText().equals("用户不存在");alert.accept();}public void loginFail05(){//账号正确,密码错误driver.get(loginPage.Url);driver.findElement(By.cssSelector("#username")).sendKeys("zhangsan");//检查输入框是否被加载,并且输入正确的账号driver.findElement(By.cssSelector("#password")).sendKeys("123");//检查输入框是否被加载,并且输入错误的密码driver.findElement(By.cssSelector("#submit")).click();WebDriverWait wait=new WebDriverWait(driver,Duration.ofSeconds(2));wait.until(ExpectedConditions.alertIsPresent());Alert alert=driver.switchTo().alert();assert  alert.getText().equals("密码错误");alert.accept();}public void loginFail06(){//账号错误,密码错误driver.get(loginPage.Url);driver.findElement(By.cssSelector("#username")).sendKeys("王五");//检查输入框是否被加载,并且输入错误的账号driver.findElement(By.cssSelector("#password")).sendKeys("123");//检查输入框是否被加载,并且输入错误的密码driver.findElement(By.cssSelector("#submit")).click();WebDriverWait wait=new WebDriverWait(driver,Duration.ofSeconds(2));wait.until(ExpectedConditions.alertIsPresent());Alert alert=driver.switchTo().alert();assert  alert.getText().equals("用户不存在");alert.accept();}
}

在run_Aoto_Test.java中添加测试用例(7个测试用例)

public class run_Auto_Test {public static void main(String[] args) throws InterruptedException {loginPage  loginPage=new loginPage();//测试登录接口loginPage.cheakPageRight();//检查元素loginPage.loginFail01();//账号为空,密码不为空loginPage.loginFail02();//账号不为空,密码为空loginPage.loginFail03();//账号和密码都为空loginPage.loginFail04();//账号错误,密码正确loginPage.loginFail05();//账号正确,密码错误loginPage.loginFail06();//账号错误,密码错误loginPage.loginSuc();//成功登录}
}

查看一下运行后的测试结果

可以看出也是并未报错

在查看一下截图是否成功登录

可以看到确实出现了两张图片,再去文件夹看看图片是否正确

3.4 博客列表页面自动化测试代码

①创建一个文件夹名为test,将每一个页面的自动化测试脚本放入其中。创建一个类为:listPage.java,存放于test方法文件夹中,里面存在列表页面测试的方法(包括成功访问和异常访问),再继承Util类,获取Util静态方法

②引入名为Util的通用方法的java包

③在listPage.java中创建构造函数,在类内初始化Url,并且将Url通过构造函数传递给父类,并且打开该网址

④重点需要注意直接进入该网址和通过登录按钮进入该网页的效果完全不一样,直接进入会直接转跳到登录页面,通过登录按钮进入会正确跳转到列表页面

⑤(测试内容):在这个自动化测试中主要是对页面是否正常打开,针对不同的登录方法是否可以访问成功/访问失败进行测试并且页面元素是否能正确加载。 

⑥创建一个类为:run_Aoto_Test.java,初始化该页面类,在里面注意函数调用的顺序,想要看到其他页面的正常效果必须先登录成功 

编写博客列表页自动化测试类---listPage.java

package test;import common.Util;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;import java.io.IOException;
import java.time.Duration;public class listPage extends Util {public static String Url="http://8.137.19.140:9090/blog_list.html";public listPage() {super(Url);}public void cheakBlogList() throws IOException {//登录状态下,页面可以正常打开,检查页面元素ScreenShoot("listpage_initialize");//检查列表页元素//查看标题是否存在String titileTxt= driver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > div.title")).getText();//查看时间是否存在String timeTxt= driver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > div.date")).getText();//查看内容是否存在String contentText= driver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > div.desc")).getText();String curText=  driver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > a")).getText();String expectText="查看全文>>";assert  curText.equals(expectText);assert  !titileTxt.isEmpty();assert  !timeTxt.isEmpty();assert  !contentText.isEmpty();assert  !curText.isEmpty();//检查菜单driver.findElement(By.cssSelector("body > div.nav > img"));//图片是否加载assert  driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).getText().equals("主页");//检查文字是否加载出来assert  driver.findElement(By.cssSelector("body > div.nav > a:nth-child(5)")).getText().equals("写博客");//检查文字是否加载出来assert  driver.findElement(By.cssSelector("body > div.nav > span")).getText().equals("我的博客系统");//检查文字是否加载出来assert  driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).getText().equals("注销");//检查文字是否加载出来//检查个人信息driver.findElement(By.cssSelector("body > div.container > div.left > div > img"));//检查照片是否被加载出来assert  driver.findElement(By.cssSelector("body > div.container > div.left > div > h3")).getText().equals(Util.UseName);//检查名字driver.findElement(By.cssSelector("body > div.container > div.left > div > a"));assert  driver.findElement(By.cssSelector("body > div.container > div.left > div > div:nth-child(4) > span:nth-child(1)")).getText().equals("文章");assert  driver.findElement(By.cssSelector("body > div.container > div.left > div > div:nth-child(4) > span:nth-child(2)")).getText().equals("分类");driver.findElement(By.cssSelector("body > div.container > div.left > div > div:nth-child(5) > span:nth-child(1)"));driver.findElement(By.cssSelector("body > div.container > div.left > div > div:nth-child(5) > span:nth-child(2)"));driver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(21) > a")).click();Util.DeatilUrl= driver.getCurrentUrl();driver.navigate().back();;}public void unloginBloglist01() throws InterruptedException {//未登录状态下从主页进入博客列表页driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();//注销driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).click();//点击进入主页WebDriverWait wait=new WebDriverWait(driver, Duration.ofSeconds(2));wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#username")));assert driver.getCurrentUrl().equals(loginPage.Url);//判断跳转后的网址是否为登录页面的网址assert  driver.getTitle().equals("博客登陆页");//判断跳转后的网页标题是否为登录页面的标题}public void unloginBloglist02() throws IOException {//未登录状态下直接使用链接进入博客列表页driver.get(Url);WebDriverWait wait=new WebDriverWait(driver, Duration.ofSeconds(2));wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#username")));assert driver.getCurrentUrl().equals(loginPage.Url);//判断跳转后的网址是否为登录页面的网址assert  driver.getTitle().equals("博客登陆页");//判断跳转后的网页标题是否为登录页面的标题ScreenShoot("listpage_sucess");}}

        在run_Aoto_Test.java中添加测试用例(2个测试用例)

import test.detailPage;
import test.editPage;
import test.listPage;
import test.loginPage;import java.io.IOException;public class run_Auto_Test {public static void main(String[] args) throws InterruptedException, IOException {loginPage  loginPage=new loginPage();//测试登录接口loginPage.cheakPageRight();//检查元素loginPage.loginFail01();//账号为空,密码不为空loginPage.loginFail02();//账号不为空,密码为空loginPage.loginFail03();//账号和密码都为空loginPage.loginFail04();//账号错误,密码正确loginPage.loginFail05();//账号正确,密码错误loginPage.loginFail06();//账号错误,密码错误loginPage.loginSuc();//成功登录listPage listPage=new listPage();//测试列表页元素listPage.cheakBlogList();//检查博客列表页元素listPage.unloginBloglist01();//非法访问网址listPage.unloginBloglist02();//非法访问网址,此时应该到了博客登录页,正好可以测试非法链接查看帖子详情页}
}

查看一下运行后的测试结果

查看下屏幕截图,是否成功实现listPage.java的测试

可以看出截图方法成功实现

再看看文件夹内

此页面自动化测试结束是回到登录页面的,符合预期

3.5博客详情页自动化测试代码

①创建一个文件夹名为test,将每一个页面的自动化测试脚本放入其中。创建一个类为:deitailPage.java,存放于test方法文件夹中,里面存在博客详情页面测试的方法(包括成功访问和异常访问),再继承Util类,获取Util静态方法

②引入名为Util的通用方法的java包

③在detailPage.java中创建构造函数,在类内初始化Url,并且将Url通过构造函数传递给父类,并且打开该网址

④重点需要注意直接进入该网址和通过查看全文按钮进入该网页的效果完全不一样,直接进入会直接转跳到登录页面,通过查看全文按钮进入会正确跳转到详情页面

⑤(测试内容):在这个自动化测试中主要是对页面是否正常打开,针对不同的登录方法是否可以访问成功/访问失败进行测试并且页面元素是否能正确加载,以及详情页中的修改博客和删除博客功能能否实现。 

⑥创建一个类为:run_Aoto_Test.java,初始化该页面类,在里面注意函数调用的顺序,想要看到其他页面的正常效果必须先登录成功 

编写博客详情页自动化测试类---detailPage.java

package test;import common.Util;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;import java.io.IOException;
import java.time.Duration;public class detailPage extends Util {public static String url=DeatilUrl;public detailPage() {super(url);}public void cheakDetail() throws InterruptedException, IOException {//检查元素wait.until(ExpectedConditions.urlContains("blog_list"));driver.get(url);ScreenShoot("detailPage_Init");driver.findElement(By.cssSelector("body > div.container > div.right > div > div.title"));//标题driver.findElement(By.cssSelector("body > div.container > div.right > div > div.date"));//时间driver.findElement(By.xpath("//*[@id=\"detail\"]/h2"));//内容driver.findElement(By.cssSelector("body > div.container > div.right > div > div.operating > button:nth-child(1)"));//编辑按钮driver.findElement(By.cssSelector("body > div.container > div.right > div > div.operating > button:nth-child(2)"));//删除按钮assert  !driver.findElement(By.cssSelector("body > div.container > div.right > div > div.title")).getText().isEmpty();//标题不为空assert   !driver.findElement(By.xpath("//*[@id=\"detail\"]/h2")).getText().isEmpty();//内容不能为空}public void editDetail(){//编辑博客driver.findElement(By.cssSelector("body > div.container > div.right > div > div.operating > button:nth-child(1)")).click();//点击进入编辑页面String cururl=driver.getCurrentUrl();//检查当前urlString update =driver.findElement(By.cssSelector("#submit")).getAttribute("value");//检查是否有提交按钮assert cururl.contains("update");assert update.equals("更新文章");driver.findElement(By.cssSelector("#submit")).click();wait.until(ExpectedConditions.urlContains("blog_list"));}public void deleteDeatilfail(){//取消删除帖子driver.get(Util.DeatilUrl);driver.findElement(By.cssSelector("body > div.container > div.right > div > div.operating > button:nth-child(2)")).click();Alert alert=driver.switchTo().alert();String txt=alert.getText();assert  txt.equals("确定删除?");alert.dismiss();//取消弹窗}public void deleteDeatilsucess() throws IOException {//成功删除博客driver.get(Util.DeatilUrl);driver.findElement(By.cssSelector("body > div.container > div.right > div > div.operating > button:nth-child(2)")).click();Alert alert=driver.switchTo().alert();wait.until(ExpectedConditions.alertIsPresent());String txt=alert.getText();assert  txt.equals("确定删除?");alert.accept();//确认弹窗wait.until(ExpectedConditions.urlContains("blog_list"));ScreenShoot("detailPage_Del_Suc");}public void unloginDeatil(){//非法使用链接登录并且查看帖子driver.get(url);WebDriverWait wait=new WebDriverWait(driver, Duration.ofSeconds(2));wait.until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("#username")));assert driver.getCurrentUrl().equals(loginPage.Url);//判断跳转后的网址是否为登录页面的网址assert  driver.getTitle().equals("博客登陆页");//判断跳转后的网页标题是否为登录页面的标题}
}

       在run_Aoto_Test.java中添加测试用例(4个测试用例)

import test.detailPage;
import test.editPage;
import test.listPage;
import test.loginPage;import java.io.IOException;public class run_Auto_Test {public static void main(String[] args) throws InterruptedException, IOException {loginPage  loginPage=new loginPage();//测试登录接口loginPage.cheakPageRight();//检查元素loginPage.loginFail01();//账号为空,密码不为空loginPage.loginFail02();//账号不为空,密码为空loginPage.loginFail03();//账号和密码都为空loginPage.loginFail04();//账号错误,密码正确loginPage.loginFail05();//账号正确,密码错误loginPage.loginFail06();//账号错误,密码错误loginPage.loginSuc();//成功登录listPage listPage=new listPage();//测试列表页元素listPage.cheakBlogList();//检查博客列表页元素listPage.unloginBloglist01();//非法访问网址listPage.unloginBloglist02();//非法访问网址,此时应该到了博客登录页,正好可以测试非法链接查看帖子详情页detailPage detailPage=new detailPage();//测试博客详情页面detailPage.unloginDeatil();//非法使用链接登录并且查看帖子loginPage.loginSuc();//成功登录detailPage.cheakDetail();//检查元素detailPage.editDetail();//编辑页面detailPage.deleteDeatilfail();//删除取消页面detailPage.deleteDeatilsucess();//删除成功页面}
}

查看一下运行后的测试结果

查看下屏幕截图,是否成功实现detailPage.java的测试

可以看出截图方法成功实现

再看看文件夹内

此页面自动化测试结束是回到列表页面的,符合预期

3.6博客发布页自动化测试代码

①创建一个文件夹名为test,将每一个页面的自动化测试脚本放入其中。创建一个类为:editPage.java,存放于test方法文件夹中,里面存在博客发布页面测试的方法(包括成功访问和异常访问),再继承Util类,获取Util静态方法

②引入名为Util的通用方法的java包

③在editPage.java中创建构造函数,在类内初始化Url,并且将Url通过构造函数传递给父类,并且打开该网址

④重点需要注意直接进入该网址和通过写博客按钮进入该网页的效果一样,但是通过网站进入是无法发布博客,否则会直接转跳到登录页面,而在登录情况下从写博客按钮进入,即可以正常发布博客

⑤(测试内容):在这个自动化测试中主要是对页面是否正常打开,针对不同的登录方法是否可以访问成功/访问失败进行测试并且页面元素是否能正确加载,以及博客发布页博客可以是否被发布以及不同特殊情况下博客能否被发布

⑥创建一个类为:run_Aoto_Test.java,初始化该页面类,在里面注意函数调用的顺序,想要看到其他页面的正常效果必须先登录成功 

编写博客发布页自动化测试类---editPage.java

package test;import com.google.gson.annotations.Until;
import common.Util;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.Keys;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;import javax.swing.*;
import java.io.IOException;
import java.time.Duration;
import java.util.List;public class editPage  extends Util {public static String Url="http://8.137.19.140:9090/blog_edit.html";public editPage() {super(Url);}public void cheakEditPage() throws IOException {//检查博客编辑页的元素ScreenShoot("detailpage_initialize");String cururl=driver.getCurrentUrl();//检查当前urlString update =driver.findElement(By.cssSelector("#submit")).getAttribute("value");//检查是否有提交按钮assert cururl.contains("blog_edit");assert update.equals("发布文章");}/*** 测试用例* 不写标题,写内容进行发布* 写标题,不写内容进行发布* 标题,内容都不写进行发布**/public void postPageFail01(){//不写标题进行发布driver.findElement(By.cssSelector("#submit")).click();WebDriverWait wait=new WebDriverWait(driver, Duration.ofSeconds(2));wait.until(ExpectedConditions.alertIsPresent());Alert alert=driver.switchTo().alert();alert.accept();}public void postPageFail02() throws InterruptedException {//不写内容进行发布driver.findElement(By.cssSelector("#title")).sendKeys("自动化测试");WebElement ele=driver.findElement(By.cssSelector("#editor > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre"));Actions actions=new Actions(driver);Thread.sleep(500);actions.keyDown(Keys.ALT).sendKeys(ele,Keys.ARROW_RIGHT).keyUp(Keys.ALT).keyDown(Keys.SHIFT).sendKeys(Keys.ARROW_UP).keyUp(Keys.SHIFT).sendKeys(Keys.DELETE).perform();Thread.sleep(500);driver.findElement(By.cssSelector("#submit")).click();wait.until(ExpectedConditions.alertIsPresent());Alert alert=driver.switchTo().alert();driver.switchTo().alert();alert.accept();}public void postPageFail03() throws InterruptedException {//标题内容都不写进行发布WebElement ele=driver.findElement(By.cssSelector("#editor > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre"));Actions actions=new Actions(driver);Thread.sleep(100);actions.keyDown(Keys.ALT).sendKeys(ele,Keys.ARROW_RIGHT).keyUp(Keys.ALT).keyDown(Keys.SHIFT).sendKeys(Keys.ARROW_UP).keyUp(Keys.SHIFT).sendKeys(Keys.DELETE).perform();Thread.sleep(5009);driver.findElement(By.cssSelector("#submit")).click();wait.until(ExpectedConditions.alertIsPresent());Alert alert=driver.switchTo().alert();alert.accept();}public void postPagesuc() throws IOException {//成功发布文章int randomNumber=random.nextInt(100);driver.get(Url);String title="自动化测试"+randomNumber;driver.findElement(By.cssSelector("#title")).sendKeys(title);driver.findElement(By.cssSelector("#submit")).click();wait.until(ExpectedConditions.urlContains("blog_list"));List<WebElement> tittilenames=driver.findElements(By.xpath("/html/body/div[2]/div/div[1]"));String focus="/html/body/div[2]/div[2]/div["+((tittilenames.size()))+"]/div[1]";String acutitle=driver.findElement(By.xpath(focus)).getText();assert title.equals(acutitle);ScreenShoot("postBlog_sucess");}public void  exitBlog(){//成功退出博客,并且关闭浏览器quitWebDriver(driver);}}

   在run_Aoto_Test.java中添加测试用例(5个测试用例)

import test.detailPage;
import test.editPage;
import test.listPage;
import test.loginPage;import java.io.IOException;public class run_Auto_Test {public static void main(String[] args) throws InterruptedException, IOException {loginPage  loginPage=new loginPage();//测试登录接口loginPage.cheakPageRight();//检查元素loginPage.loginFail01();//账号为空,密码不为空loginPage.loginFail02();//账号不为空,密码为空loginPage.loginFail03();//账号和密码都为空loginPage.loginFail04();//账号错误,密码正确loginPage.loginFail05();//账号正确,密码错误loginPage.loginFail06();//账号错误,密码错误loginPage.loginSuc();//成功登录listPage listPage=new listPage();//测试列表页元素listPage.cheakBlogList();//检查博客列表页元素listPage.unloginBloglist01();//非法访问网址listPage.unloginBloglist02();//非法访问网址,此时应该到了博客登录页,正好可以测试非法链接查看帖子详情页detailPage detailPage=new detailPage();//测试博客详情页面detailPage.unloginDeatil();//非法使用链接登录并且查看帖子loginPage.loginSuc();//成功登录detailPage.cheakDetail();//检查元素detailPage.editDetail();//编辑页面detailPage.deleteDeatilfail();//删除取消页面detailPage.deleteDeatilsucess();//删除成功页面editPage editPage=new editPage();editPage.cheakEditPage() ;//检查元素editPage.postPageFail01();//没有标题editPage.postPageFail02();//没有内容editPage.postPageFail03();//没有标题和内容的情况下发布文章editPage.postPagesuc();//成功发布文章editPage.exitBlog();//清除驱动,关闭浏览器}
}

查看一下运行后的测试结果

查看下屏幕截图,是否成功实现detailPage.java的测试

可以看出截图方法成功实现

再看看文件夹内

此页面自动化测试结束是回到列表页面的,符合预期

4.测试总结

本次测试对登录,注册,编辑,发布等核心功能进行测试并用selenium编写自动化测试脚本。页面需要新增通过关键词搜索博客,以及新增注册功能,完善列表页的各模块分类,以便用户浏览,提高用户的使用体验。

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

相关文章:

  • HarmonyOS布局实战:用声明式UI构建自适应电商卡片
  • 【源码分析】@vue/runtime-dom/src/apiCustomElement.ts 解析
  • 重磅升级,Pixso 2.0赋能HarmonyOS应用设计与开发
  • 安卓11 12系统修改定制化_____如何修改固件 实现给指定内置的应用无障碍权限
  • Sybase 安装与备份
  • 【c++】超好玩游戏
  • 一、CSS3 新增选择器(非 “属性”,但为核心基础)
  • day082-初识ElasticStack
  • 路由基础(二):路由表和FIB表
  • Ansible文件管理与Jinja2模板
  • Linux查看SFTP登录不上的问题以及解决
  • 【Simulink专题】Simulink模型:MIL单元测试
  • 宝塔发布ktg-mes
  • vue cli 没使用的图片会被打包吗
  • 2025年08月27日Github流行趋势
  • 怎么更新 cargo.exe ?(Rust 工具链)
  • etcd-基本工作原理及部署
  • react + G2(v4) 应用
  • 【C++游记】模板升级
  • 飞腾 D2000 八核处理器板卡深度解析:全国产化硬件方案与丰富扩展能力
  • Linux中创建SFTP账号
  • Netty:现代网络应用的利器
  • 软件定义汽车(SDV)调试——如何做到 适配软件定义汽车(SDV)?(中)
  • 造作AI-你的人工智能创作助手
  • 某中医院信息化能力提升:智能组网设备助力网络架构优化
  • 【日常学习】2025-8-27 测开框架设计模式探索04
  • Element整体操作样式
  • 数据分析编程第五步:数据准备与整理
  • DDD之事件机制(9)
  • 沃丰科技出海客服系统对接沃尔玛全球电商平台,赋能中企出海