对个人博客系统进行web自动化测试(包含测试代码和测试的详细过程)(下)

简介: 对个人博客系统进行web自动化测试(包含测试代码和测试的详细过程)(下)

四、博客列表页测试

a0c859d458d545eda2e493e41b247836.png

首先对于博客列表页面来说,分为登录情况下的测试和未登录情况下的测试

登录情况下的测试

package webAutoTest.logined_tests;
import org.junit.jupiter.api.*;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import webAutoTest.common.AutotestUtils;
/**
 * 用户登录状态下的博客列表测试
 */
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) // 说明当前类中的测试方法要按一定的顺序来执行---和order配合使用
public class blogListTest extends AutotestUtils {
    private static ChromeDriver driver = new ChromeDriver();
    @Test
    @BeforeAll
    static void init() {
        driver.get("http://49.235.66.46:9000/blog_list.html");
    }
    /**
     * 测试总的博客列表页面的完整性
     */
    @Test
    @Order(1)
    void pageTest() { // 不能用private修饰该方法——》我们的selenium还要调用该方法
        // 看看是否能够获取到博客列表页面的翻页按钮(只有总的博客列表页有,个人主页也没有)
        driver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(1)"));
        // 查看页面的文本内容显示是否正确
        String expect = "Linux删除文件操作";
        String actual = driver.findElement(By.cssSelector("body > div.container > div > div:nth-child(2) > div.title")).getText();
        Assertions.assertEquals(expect, actual); // 断言
        // 查看是否有个人主页的超链接
        driver.findElement(By.cssSelector("#myblog")).click();
        String  expectURL = "http://49.235.66.46:9000/myblog_list.html";
        String actualURL = driver.getCurrentUrl();
        // 利用断言看:在登录成功的情况下,界面是否跳转到了个人主页
        Assertions.assertEquals(expectURL, actualURL);
    }
    @Test
    @AfterAll
    static void exit() {
        driver.quit();
    }
}

未登录情况下的测试

package webAutoTest.unlogined_tests;
import org.junit.jupiter.api.*;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
import webAutoTest.common.AutotestUtils;
/**
 * 用户未登录状态下的博客列表测试
 */
@TestMethodOrder(MethodOrderer.OrderAnnotation.class) // 说明当前类中的测试方法要按一定的顺序来执行---和order配合使用
public class blogListTest extends AutotestUtils {
    private static ChromeDriver driver = new ChromeDriver();
    @Test
    @BeforeAll
    static void init() {
        driver.get("http://49.235.66.46:9000/blog_list.html");
    }
    /**
     * 测试总的博客列表页面的完整性
     */
    @Test
    @Order(1)
    void pageTest() throws InterruptedException { // 不能用private修饰该方法——》我们的selenium还要调用该方法
        // 看看是否能够获取到博客列表页面的翻页按钮(只有总的博客列表页有,个人主页也没有)
        driver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(1)"));
        // 查看页面的文本内容显示是否正确
        String expect = "Linux删除文件操作";
        String actual = driver.findElement(By.cssSelector("body > div.container > div > div:nth-child(2) > div.title")).getText();
        Assertions.assertEquals(expect, actual); // 断言
        // 查看是否有个人主页的超链接
        driver.findElement(By.cssSelector("#myblog")).click();
        Thread.sleep(100); // 强制等待弹窗的出现(隐式等待无法处理弹窗/显示等待和隐式等待尽量不共存)
        // 在未登录的情况下,页面跳转到个人主页是否会出现弹窗(以及弹窗内容是否和我们预期的一致)
        Alert alert = driver.switchTo().alert();
        String expectAlert = "当前用户未登录,你即将跳转到登录页面";
        String actualAlert = alert.getText();
        Assertions.assertEquals(expectAlert, actualAlert);
        // 不要忘了关闭弹窗
        alert.accept();
    }
    @Test
    @AfterAll
    static void exit() {
        driver.quit();
    }
}

一些问题,在实际测试的时候,我发现当用private修饰测试方法时


0efac3480ac04d268f515299227bb072.png

这是因为private修改的方法只在当前类中可见,外部类不可见。

但是我们是借助selenium来进行自动化测试,那么这样一来,selenium就调用不了这个测试方法了————》当然也就执行不了测试用例了。


五、博客详情页测试



b22a72ad4951449da3beee33f983246c.png


用户已登录的情况下测试

package webAutoTest.logined_tests;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import webAutoTest.common.AutotestUtils;
/**
 * 用户已经登录的状态下,对博客详情页进行测试
 */
public class blogDetailTest extends AutotestUtils {
    // 这里我们不重新生成驱动,我们用的还是登录界面的驱动,因为我们要保留登录状态
    @Test
    @BeforeAll
    static void init() {
        driver.get("http://49.235.66.46:9000/blog_content.html?id=2");
    }
    @Test
    void pageTest() {
        // 测试左侧信息框中的用户名是否能正常显示
        driver.findElement(By.cssSelector("body > div.container > div.container-left > div > h3"));
        // 测试删除博客按钮是否存在(文本显示是否正确)
        String expect1 = "删除博客";
        String actual1 = driver.findElement(By.cssSelector("body > div.nav > a.del")).getText();
        Assertions.assertEquals(expect1, actual1);
        // 测试修改博客按钮是否存在(文本显示是否正确)
        String expect2 = "修改博客";
        String actual2 = driver.findElement(By.cssSelector("body > div.nav > a.update")).getText();
        Assertions.assertEquals(expect2, actual2);
    }
    @Test
    @AfterAll
    static void exit() {
        driver.quit();
    }
}


测试视频

我们通过测试套件可以同时执行多个类的测试用例

image.png

image.gif

用户未登录的情况下测试

package webAutoTest.unlogined_tests;
import org.checkerframework.checker.units.qual.A;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import org.openqa.selenium.chrome.ChromeDriver;
/**
 * 用户登录的状态下,对博客详情页进行测试
 */
public class blogDetailTest {
    static ChromeDriver driver = new ChromeDriver();
    @Test
    @BeforeAll
    static void init() {
        driver.get("http://49.235.66.46:9000/blog_content.html?id=2");
    }
    @Test
    void pageTest() throws InterruptedException {
        // 未登录状态下,可以访问博客详情页,但不可以进行删除博客、修改博客的操作
        driver.findElement(By.cssSelector("body > div.nav > a.update")).click();
        // 点击删除博客,应该会出现-----是否要删除该博客的弹窗,点击确定
        Thread.sleep(300);
        Alert alert1 = driver.switchTo().alert(); // 点击完——确定要删除该博客——》在未登录状态,会出现下一个弹窗
        String expect = "当前用户未登录,你即将跳转到登录页面";
        String actual = alert1.getText();
        alert1.accept();
        Assertions.assertEquals(expect,actual);
    }
    @Test
    @AfterAll
    static void quit() {
        driver.quit();
    }
}


image.png

六、个人主页测试

1f042ca073674f7991471636117928ca.png

package webAutoTest.logined_tests;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import webAutoTest.common.AutotestUtils;
public class myBlogListTest extends AutotestUtils {
    @Test
    @BeforeAll
    static void init() {
        driver.get("http://49.235.66.46:9000/myblog_list.html?uid=2");
    }
    @Test
    void pageTest() {
        // 测试是否存在博客列表页的超链接(以及该超链接所显示的文本是否正确,只有在个人主页该超链接的文本才是“首页”这两个字)
        String expect = "首页";
        String actual = driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)")).getText();
        Assertions.assertEquals(expect, actual);
        // 是否能找到个人信息栏
        driver.findElement(By.cssSelector("body > div.container > div.container-left > div > h3"));
    }
    @Test
    @AfterAll
    static void exit() {
        driver.quit();
    }
}

image.png


七、博客编辑页面测试

d42d1aea0ac74d7193e2d88f9b772652.png

package webAutoTest.logined_tests;
import org.checkerframework.checker.units.qual.A;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.Alert;
import org.openqa.selenium.By;
import webAutoTest.common.AutotestUtils;
import javax.swing.tree.TreeNode;
/**
 * 用户已经登录的情况下,对博客编辑页进行测试
 */
public class blogEditTest extends AutotestUtils {
    // 这里我们不重新生成驱动,我们用的还是登录界面的驱动,因为我们要保留登录状态
    @Test
    @BeforeAll
    static void init() {
        driver.get("http://49.235.66.46:9000/blog_edit.html");
    }
    @Test
    void pageTest() throws InterruptedException {
        // 测试是否能够找到博客编辑页的提示按钮
        driver.findElement(By.cssSelector("#submit"));
        // 测试是否能够找到对应页面的超链接
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)"));
        // 在博客标题中输入内容
        driver.findElement(By.cssSelector("#title")).sendKeys("测试开发实战");
        // 在博客内容中输入内容,因为我们这里使用了第三方的插件,所以我们不能直接通过sendkeys来输入内容(但我们可以通过click点击事件,往模块内容中插入横线等(本身插件提供的元素)
        driver.findElement(By.cssSelector("#editorDiv > div.editormd-toolbar > div > ul > li:nth-child(21) > a > i")).click();
        Thread.sleep(100);
        driver.findElement(By.cssSelector("#submit")).click(); // 点击提交
        // 如果发布成功,会出现一个弹窗——》提示发布成功
        Thread.sleep(100); // 等待弹窗出现
        Alert alert = driver.switchTo().alert();
        alert.accept();
        // 页面会跳到我们的总的博客列表页面,在博客列表页的最后一个元素看是否能够找到我们刚刚提交的数据
        // 1、到博客列表的末页
        driver.findElement(By.cssSelector("body > div.container > div > div.blog-pagnation-wrapper > button:nth-child(4)")).click();
        Thread.sleep(100);
        String expect = "测试开发实战";
        String actual = driver.findElement(By.xpath("/html/body/div[2]/div/div[last()]/div[1]")).getText(); // 获取该页中最后一个title标签,通过last()
        Assertions.assertEquals(expect, actual);
    }
    @Test
    @AfterAll
    static void exit() {
        driver.quit();
    }
}


其中在检测新增的博客是否添加成功的时候,因为新添加的博客自动就添加到了总的博客列表的末尾,因此:

1、通过博客列表的末页标签,跳转到博客列表的最后一页。

2、通过xpath的

/html/body/div[2]/div/div[last()]/div[1]


定位到当前页面的最后一个title标签,其中last()保障了当前界面有几个博客标题,我们获取到的都是最后一个标题(最新的那个,也就是刚刚我们发表的那个)

3、找到对应博客的标题元素后,看文本内容是否和我们编辑时候输入的文章标题一致


八、博客修改页面测试

15f724ea8987470aaa0fe14102d89a0a.png

package webAutoTest.logined_tests;
import org.junit.jupiter.api.AfterAll;
import org.junit.jupiter.api.BeforeAll;
import org.junit.jupiter.api.Test;
import org.openqa.selenium.By;
import webAutoTest.common.AutotestUtils;
/**
 * 用户登录状态下对博客修改页面进行测试
 */
public class blogUpdateTest extends AutotestUtils {
    @Test
    @BeforeAll
    static void init() {
        driver.get("http://49.235.66.46:9000/blog_content.html?id=17");
    }
    @Test
    void pageTest() {
        // 查看博客标题是否存在
        driver.findElement(By.cssSelector("body > div.container > div.container-right > div > h3"));
        // 查看修改博客和删除博客按钮是否存在
        driver.findElement(By.cssSelector("body > div.nav > a.del"));
        driver.findElement(By.cssSelector("body > div.nav > a.update"));
    }
    @Test
    @AfterAll
    static void exit() {
        driver.quit();
    }
}


image.png

九、总结


image.png

总测试视频



image.png

总代码

gitee:  博客系统的web自动化测试——完整代码

相关文章
|
25天前
|
安全 测试技术 网络安全
如何在Python Web开发中进行安全测试?
如何在Python Web开发中进行安全测试?
|
25天前
|
安全 关系型数据库 测试技术
学习Python Web开发的安全测试需要具备哪些知识?
学习Python Web开发的安全测试需要具备哪些知识?
32 4
|
6天前
|
Web App开发 IDE JavaScript
Selenium IDE:Web自动化测试的得力助手
Selenium IDE:Web自动化测试的利器。作为开源工具,Selenium IDE支持录制与回放用户操作,适用于Chrome、Firefox等多浏览器,简化了测试流程,提升了效率,降低了自动化测试的门槛。它还支持导出多种编程语言的脚本,便于测试集成与复用。
49 19
Selenium IDE:Web自动化测试的得力助手
|
8天前
|
Web App开发 IDE 测试技术
Selenium:强大的 Web 自动化测试工具
Selenium 是一款强大的 Web 自动化测试工具,包括 Selenium IDE、WebDriver 和 Grid 三大组件,支持多种编程语言和跨平台操作。它能有效提高测试效率,解决跨浏览器兼容性问题,进行性能测试和数据驱动测试,尽管存在学习曲线较陡、不稳定等缺点,但其优势明显,是自动化测试领域的首选工具。
75 17
Selenium:强大的 Web 自动化测试工具
|
14天前
|
人工智能 自然语言处理 JavaScript
Agent-E:基于 AutoGen 代理框架构建的 AI 浏览器自动化系统
Agent-E 是一个基于 AutoGen 代理框架构建的智能自动化系统,专注于浏览器内的自动化操作。它能够执行多种复杂任务,如填写表单、搜索和排序电商产品、定位网页内容等,从而提高在线效率,减少重复劳动。本文将详细介绍 Agent-E 的功能、技术原理以及如何运行该系统。
59 5
Agent-E:基于 AutoGen 代理框架构建的 AI 浏览器自动化系统
|
15天前
|
开发框架 .NET PHP
ASP.NET Web Pages - 添加 Razor 代码
ASP.NET Web Pages 使用 Razor 标记添加服务器端代码,支持 C# 和 Visual Basic。Razor 语法简洁易学,类似于 ASP 和 PHP。例如,在网页中加入 `@DateTime.Now` 可以实时显示当前时间。
|
19天前
|
存储 消息中间件 缓存
构建互联网高性能WEB系统经验总结
如何构建一个优秀的高性能、高可靠的应用系统对每一个开发者至关重要
23 2
|
22天前
|
开发框架 JavaScript 前端开发
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势
TypeScript 是一种静态类型的编程语言,它扩展了 JavaScript,为 Web 开发带来了强大的类型系统、组件化开发支持、与主流框架的无缝集成、大型项目管理能力和提升开发体验等多方面优势。通过明确的类型定义,TypeScript 能够在编码阶段发现潜在错误,提高代码质量;支持组件的清晰定义与复用,增强代码的可维护性;与 React、Vue 等框架结合,提供更佳的开发体验;适用于大型项目,优化代码结构和性能。随着 Web 技术的发展,TypeScript 的应用前景广阔,将继续引领 Web 开发的新趋势。
35 2
|
25天前
|
监控 安全 测试技术
如何在实际项目中应用Python Web开发的安全测试知识?
如何在实际项目中应用Python Web开发的安全测试知识?
28 4
|
1月前
|
运维 监控 网络协议
自动化运维的魔法——打造高效、可靠的系统
【10月更文挑战第32天】在数字化时代的浪潮下,运维不再是简单的硬件维护和故障排除。它已经演变成一场关乎效率、稳定性和创新的技术革命。自动化运维,作为这场革命的核心,正引领着企业走向更加智能和高效的未来。本文将带你探索自动化运维的世界,揭示其背后的原理和实践,让你领略到自动化带来的无限可能。
28 0