12. 自动化项目实战

目录

1. 登录测试

2. 测试首页的帖子列表数不为0

3. 帖子详情页校验

4. 发布帖子

5. 退出登录


自动化项目实施的基本流程如下图所示:

手工测试用例、自动化测试用例。

1. 登录测试

校验登录后主页显示的用户名称和登录时输入的用户名是否相等。

public class ForumCases extends InitAndEnd{
    /**
     * 登录测试
     */
    @Test
    void login(){
        // 打开要进行登录的页面
        webDriver.get("http://150.158.82.121:58080/sign-in.html");
        // 输入用户名
        webDriver.findElement(By.cssSelector("#username")).sendKeys("明玉");
        // 输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys("123");
        // 点击登录
        webDriver.findElement(By.cssSelector("#submit")).click();
        // 校验用户是否登录成功,即当前用户是否为登录的用户,如果是则测试通过,否则测试不通过
        String user_name = webDriver.findElement(By.cssSelector("#username")).getAttribute("value");
        // 断言相等
        Assertions.assertEquals("明玉",user_name);
    }
}

测试成功: 

我们还可以通过参数化对于以上代码进行优化:

public class ForumCases extends InitAndEnd{
    /**
     * 登录测试
     */
    @ParameterizedTest
    @CsvSource(value = "明玉,123")
    void login(String username,String password){
        // 打开要进行登录的页面
        webDriver.get("http://150.158.82.121:58080/sign-in.html");
        // 输入用户名
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        // 输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        // 点击登录
        webDriver.findElement(By.cssSelector("#submit")).click();
        // 校验用户是否登录成功,即当前用户是否为登录的用户,如果是则测试通过,否则测试不通过
        String user_name = webDriver.findElement(By.cssSelector("#username")).getAttribute("value");
        // 断言相等
        Assertions.assertEquals(username,user_name);
    }
}

 测试成功:

2. 测试首页的帖子列表数不为0

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ForumCases extends InitAndEnd{
    /**
     * 登录测试
     * 账号正确,密码正确,登录成功
     */
    @Order(1)
    @ParameterizedTest
    @CsvSource(value = "明玉,123")
    void login(String username,String password){
        // 打开要进行登录的页面
        webDriver.get("http://150.158.82.121:58080/sign-in.html");
        // 输入用户名
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        // 输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        // 点击登录
        webDriver.findElement(By.cssSelector("#submit")).click();
        // 校验用户是否登录成功,即当前用户是否为登录的用户,如果是则测试通过,否则测试不通过
        String user_name = webDriver.findElement(By.cssSelector("#username")).getAttribute("value");
        // 断言相等
        Assertions.assertEquals(username,user_name);
    }
    /**
     * 帖子列表
     */
    @Order(2)
    @Test
    void articleList(){
        webDriver.get("http://150.158.82.121:58080/index.html");
        // 智能等待3秒
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 统计首页的帖子数目
        int article_num = webDriver.findElements(By.cssSelector("#nav_board_index > a")).size();
        // 断言帖子数目不为0
        Assertions.assertNotEquals(0,article_num);
    }
}

测试成功:

3. 帖子详情页校验

首先,我们点击帖子标题查看详情时,帖子的详情页中帖子标题不能为空

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ForumCases extends InitAndEnd{
    /**
     * 登录测试
     * 账号正确,密码正确,登录成功
     */
    @Order(1)
    @ParameterizedTest
    @CsvSource(value = "明玉,123")
    void login(String username,String password){
        // 打开要进行登录的页面
        webDriver.get("http://150.158.82.121:58080/sign-in.html");
        // 输入用户名
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        // 输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        // 点击登录
        webDriver.findElement(By.cssSelector("#submit")).click();
        // 校验用户是否登录成功,即当前用户是否为登录的用户,如果是则测试通过,否则测试不通过
        String user_name = webDriver.findElement(By.cssSelector("#username")).getAttribute("value");
        // 断言相等
        Assertions.assertEquals(username,user_name);
    }
    /**
     * 帖子列表
     */
    @Order(2)
    @Test
    void articleList(){
        webDriver.get("http://150.158.82.121:58080/index.html");
        // 智能等待3秒
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 统计首页的帖子数目
        int article_num = webDriver.findElements(By.cssSelector("#nav_board_index > a")).size();
        // 断言帖子数目不为0
        Assertions.assertNotEquals(0,article_num);
    }
    /**
     * 帖子详情页检验
     * 校验帖子的标题不为空
     */
    @Order(3)
    @Test
    void articleDetail(){
        // 打开列表页
        webDriver.get("http://150.158.82.121:58080/index.html");
        // 找到需要查看的帖子标题并点击
        webDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).click();
        // 获取博客的标题
        String article_title = webDriver.findElement(By.cssSelector("#details_article_content_title")).getText();
        // 断言标题不为空
        Assertions.assertNotNull(article_title);
    }
}

测试成功:

其次,我们点击帖子标题查看详情时,帖子的详情页中帖子内容不能为空

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ForumCases extends InitAndEnd{
    /**
     * 登录测试
     * 账号正确,密码正确,登录成功
     */
    @Order(1)
    @ParameterizedTest
    @CsvSource(value = "明玉,123")
    void login(String username,String password){
        // 打开要进行登录的页面
        webDriver.get("http://150.158.82.121:58080/sign-in.html");
        // 输入用户名
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        // 输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        // 点击登录
        webDriver.findElement(By.cssSelector("#submit")).click();
        // 校验用户是否登录成功,即当前用户是否为登录的用户,如果是则测试通过,否则测试不通过
        String user_name = webDriver.findElement(By.cssSelector("#username")).getAttribute("value");
        // 断言相等
        Assertions.assertEquals(username,user_name);
    }
    /**
     * 帖子列表
     */
    @Order(2)
    @Test
    void articleList(){
        webDriver.get("http://150.158.82.121:58080/index.html");
        // 智能等待3秒
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 统计首页的帖子数目
        int article_num = webDriver.findElements(By.cssSelector("#nav_board_index > a")).size();
        // 断言帖子数目不为0
        Assertions.assertNotEquals(0,article_num);
    }
    /**
     * 帖子详情页检验
     * 校验帖子的标题不为空
     * 校验帖子的内容不为空
     */
    @Order(3)
    @Test
    void articleDetail(){
        // 打开列表页
        webDriver.get("http://150.158.82.121:58080/index.html");
        // 找到需要查看的帖子标题并点击
        webDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).click();
        // 获取帖子的标题
        String article_title = webDriver.findElement(By.cssSelector("#details_article_content_title")).getText();
        // 断言帖子的标题不为空
        Assertions.assertNotNull(article_title);
        // 获取帖子的内容
        String article_content = webDriver.findElement(By.cssSelector("#details_article_content > p")).getText();
        // 断言帖子的内容不为空
        Assertions.assertNotNull(article_content);
    }
}

测试成功:

4. 发布帖子

我们可以直接在控制台上进行输入:

我们可以直接复制以上的 JS 脚本:document.querySelector("#article_post_title").value="测试"

5. 退出登录

package forumTest;

import net.bytebuddy.build.ToStringPlugin;
import org.junit.jupiter.api.*;
import org.junit.jupiter.params.ParameterizedTest;
import org.junit.jupiter.params.provider.CsvSource;
import org.junit.jupiter.params.provider.ValueSource;
import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;

import java.util.concurrent.TimeUnit;

import static java.lang.Thread.sleep;

@TestMethodOrder(MethodOrderer.OrderAnnotation.class)
public class ForumCases extends InitAndEnd{
    /**
     * 登录测试
     * 账号正确,密码正确,登录成功
     */
    @Order(1)
    @ParameterizedTest
    @CsvSource(value = "明玉,123")
    void login(String username,String password){
        // 打开要进行登录的页面
        webDriver.get("http://150.158.82.121:58080/sign-in.html");
        // 输入用户名
        webDriver.findElement(By.cssSelector("#username")).sendKeys(username);
        // 输入密码
        webDriver.findElement(By.cssSelector("#password")).sendKeys(password);
        // 智能等待5秒
        webDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        // 点击登录
        webDriver.findElement(By.cssSelector("#submit")).click();
        // 校验用户是否登录成功,即当前用户是否为登录的用户,如果是则测试通过,否则测试不通过
        String user_name = webDriver.findElement(By.cssSelector("#username")).getAttribute("value");
        // 断言相等
        Assertions.assertEquals(username,user_name);
    }
    /**
     * 帖子列表
     */
    @Order(2)
    @Test
    void articleList(){
        webDriver.get("http://150.158.82.121:58080/index.html");
        // 智能等待3秒
        webDriver.manage().timeouts().implicitlyWait(3, TimeUnit.SECONDS);
        // 统计首页的帖子数目
        int article_num = webDriver.findElements(By.cssSelector("#nav_board_index > a")).size();
        // 断言帖子数目不为0
        Assertions.assertNotEquals(0,article_num);
    }
    /**
     * 帖子详情页检验
     * 校验帖子的标题不为空
     * 校验帖子的内容不为空
     */
//    @Order(3)
//    @Test
//    void articleDetail(){
//        // 打开列表页
//        webDriver.get("http://150.158.82.121:58080/index.html");
//        // 找到需要查看的帖子标题并点击
//        webDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).click();
//        // 获取帖子的标题
//        String article_title = webDriver.findElement(By.cssSelector("#details_article_content_title")).getText();
//        // 断言帖子的标题不为空
//        Assertions.assertNotNull(article_title);
//        // 获取帖子的内容
//        String article_content = webDriver.findElement(By.cssSelector("#details_article_content > p")).getText();
//        // 断言帖子的内容不为空
//        Assertions.assertNotNull(article_content);
//    }
    /**
     * 发布帖子
     */
//    @Order(4)
//    @Test
//    void publish_article() throws InterruptedException {
//        // 找到发布帖子的按钮
//        webDriver.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();
//        sleep(2000);
//        // 执行 js(选中标题输入框,输入标题)
//        ((JavascriptExecutor)webDriver).executeScript("document.querySelector(\"#article_post_title\").value=\"测试\"");
//        // 智能等待5秒
//        webDriver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
//        // 执行 js(选中内容输入框,输入内容)
//        ((JavascriptExecutor)webDriver).executeScript("document.querySelector(\"#edit-article > div.CodeMirror.cm-s-default.CodeMirror-wrap > div.CodeMirror-scroll > div.CodeMirror-sizer > div > div > div > div.CodeMirror-code > div > pre > span > span\").innerText=\"自动化测试\"");
//        sleep(5000);
//        // 点击发布按钮
        webDriver.findElement(By.cssSelector("#article_post_submit")).click();
//
//        WebElement element = webDriver.findElement(By.cssSelector("#article_post_submit"));
//        ((JavascriptExecutor) webDriver).executeScript("arguments[0].click();", element);
//        // 校验页面跳转到首页
//        String currentUrl = webDriver.getCurrentUrl();
//        Assertions.assertEquals("http://150.158.82.121:58080/index.html",currentUrl);
//        // 校验第一条帖子的标题是不是我们刚才发布的标题
//        String firstTitle = webDriver.findElement(By.cssSelector("#artical-items-body > div:nth-child(1) > div > div.col > div.text-truncate > a > strong")).getText();
//        Assertions.assertEquals("测试",firstTitle);
//    }


    /**
     * 退出登录校验
     */
    @Order(5)
    @Test
    void logOut() throws InterruptedException {
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        // 找到退出按钮并点击
        webDriver.findElement(By.cssSelector("#index_nav_avatar")).click();
        sleep(3000);
        webDriver.findElement(By.cssSelector("#index_user_logout")).click();
        sleep(3000);
        webDriver.manage().timeouts().implicitlyWait(10,TimeUnit.SECONDS);
        // 校验是否退回登录页
        String currentUrl = webDriver.getCurrentUrl();
        webDriver.manage().timeouts().implicitlyWait(3,TimeUnit.SECONDS);
        Assertions.assertEquals("http://150.158.82.121:58080/sign-in.html",currentUrl);
    }
}

测试成功:

先进行基础功能的自动化测试~

其他详细的测试将不断在本篇文章中进行迭代。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/102319.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习——手写数字识别

0、:前言 这篇文章能够帮助你从数据到模型的整个过程实现不过至于安装第三方库等基础问题,本文不涉及,因为确实不难,搜一搜一大把本此实验运行环境为jupyter,当然通过pycharm也是可行的 1、数据: 手写数字…

JVM 判定对象是否死亡的两种方式

引用计数法:(脑门刻字法)和 可达性分析 引用计数算法 引用计数器的算法是这样的:在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一;当引用失效时,计数器值就减一…

volatile 关键字 与 CPU cache line 的效率问题

分析&回答 Cache Line可以简单的理解为CPU Cache中的最小缓存单位。目前主流的CPU Cache的Cache Line大小都是64Bytes。假设我们有一个512字节的一级缓存,那么按照64B的缓存单位大小来算,这个一级缓存所能存放的缓存个数就是512/64 8个。具体参见下…

Java面试八股文必备闯关秘籍:第一章-Java基础篇

目录 第一章-Java基础篇 1、你是怎样理解OOP面向对象 难度系数:⭐ 2、重载与重写区别 难度系数:⭐ 3、接口与抽象类的区别 难度系数:⭐ 4、深拷贝与浅拷贝的理解 难度系数:⭐ 5、sleep和wait区别 难度系数&a…

Python 类和对象

类的创建 Python语言中,使用class关键字来创建类,其创建方式如下: class ClassName(bases):# class documentation string 类文档字符串,对类进行解释说明class_suiteclass是关键字,bases是要继承的父类,…

算法工程题(非递减顺序 排列)

* 题意说明: * 给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n , * 分别表示 nums1 和 nums2 中的元素数目。 * 请你 合并 nums2 到 nums1 中,使合并后的数组同样按 非递减顺序 排列。…

Mybatis中 list.size() = 1 但显示 All elements are null

一、Bug展示 二、原因分析 2.1.情形一&#xff1a;Mybatis的XML中返回类型映射错误 <select id"selectByDesc" parameterType"com.task.bean.OrderInfo"resultType"com.task.bean.OrderInfo">select MER_ID,SETTLE_DATE,ICE_NAME,ORDER_S…

总线:特性、分类、性能指标、系统总线的结构、总线仲裁、总线定时、总线标准

总线&#xff08;Bus&#xff09;&#xff0c;是一组为各功能部件之间进行信息传送的公共线路。 总线的特性&#xff1a; 机械特性&#xff08;物理特性&#xff09;&#xff1a;尺寸、形状、引脚数、排列顺序。电气特性&#xff1a;每根信号线上的信号传输方向、表示信号有效…

iOS swift5 扫描二维码

文章目录 1.生成二维码图片2.扫描二维码&#xff08;含上下扫描动画&#xff09;2.1 记得在info.plist中添加相机权限描述 1.生成二维码图片 import UIKit import CoreImagefunc generateQRCode(from string: String) -> UIImage? {let data string.data(using: String.En…

内存管理方式

内存管理 一、C/C内存分布1、内存空间的介绍2、示例题目3、示例题目图解 二、C语言动态内存管理方式1、代码2、介绍 三、C内存管理方式1、概念2、代码3、代码所代表的意义 四、new和delete操作自定义类型1、代码2、运行结果3、特点 五、operator new与operator delete函数1、概…

java 批量下载将多个文件(minio中存储)压缩成一个zip包

我的需求是将minio中存储的文件按照查询条件查询出来统一压成一个zip包然后下载下来。 思路&#xff1a;针对这个需求&#xff0c;其实可以有多个思路&#xff0c;不过也大同小异&#xff0c;一般都是后端返回流文件前端再处理下载&#xff0c;也有少数是压缩成zip包之后直接给…

【Go 基础篇】深入探索:Go语言中的切片遍历与注意事项

嗨&#xff0c;Go语言学习者&#xff01;在我们的编程旅程中&#xff0c;切片&#xff08;Slice&#xff09;是一个极其重要的工具。它可以帮助我们处理各种类型的数据&#xff0c;从而让我们的代码更加灵活和高效。本文将围绕Go语言中切片的遍历方法以及在遍历时需要注意的事项…

SWAT-MODFLOW地表水与地下水耦合

耦合模型被应用到很多科学和工程领域来改善模型的性能、效率和结果&#xff0c;SWAT作为一个地表水模型可以较好的模拟主要的水文过程&#xff0c;包括地表径流、降水、蒸发、风速、温度、渗流、侧向径流等&#xff0c;但是对于地下水部分的模拟相对粗糙&#xff0c;考虑到SWAT…

跳出Lambda表达式forEach()循环解决思路

背景 在一次需求开发时&#xff0c;发现使用Lambda的forEach()跳不出循环。如下示例代码&#xff0c;想在遍历满足条件时跳出循环。 public static void main(String[] args) {List<Integer> list Arrays.asList(1, 4, 5, 7, 9, 11);list.forEach(e -> {if (e % 2 …

Oracle数据库安装,在自己的windows电脑上面。

第一步&#xff1a;找到数据库和数据库图形用户界面安装包。 直接用迅雷下载&#xff1a;数据库分为服务器端和客户端。 服务器端 操作系统&#xff1a;Windows Server 2008 企业版64位 Oracle软件:Oracle 11g 64位 客户端 操作系统&#xff1a;Windows7 64位 图形界面工…

IM即时聊天项目

目录 IM即时聊天项目WebSocket 原理搭建环境设置代理创建环境配置驱动&#xff08;搭建环境需要的驱动&#xff09;conf&#xff08;配置信息&#xff09;cache&#xff08;redis&#xff09;model&#xff08;数据库连接&#xff09; 用户注册serializermodelserviceapirouter…

15、监测数据采集物联网应用开发步骤(11)

源码将于最后一遍文章给出下载 监测数据采集物联网应用开发步骤(10) 程序自动更新开发 前面章节写了部分功能模块开发&#xff1a; 日志或文本文件读写开发;Sqlite3数据库读写操作开发;定时器插件化开发;串口(COM)通讯开发;TCP/IP Client开发;TCP/IP Server 开发;modbus协议…

c语言开篇---跟着视频学C语言

标识符 标识符必须声明定义&#xff0c;可以是变量、函数或其他实体。 Int是标识符吗&#xff1f; 不是&#xff0c;int是c语言关键词&#xff0c;不是随意命名的 C语言关键词如下&#xff1a; 常量 不需要被声明&#xff0c;不能赋值更改。 printf函数 printf是由print打印…

CLIP:连接文本-图像

Contrastive Language-Image Pre-Training CLIP的主要目标是通过对比学习&#xff0c;学习匹配图像和文本。CLIP最主要的作用&#xff1a;可以将文本和图像表征映射到同一个表示空间 这是通过训练模型来预测哪个图像属于给定的文本&#xff0c;反之亦然。在训练过程中&#…

《Go 语言第一课》课程学习笔记(十二)

函数 Go 函数与函数声明 在 Go 语言中&#xff0c;函数是唯一一种基于特定输入&#xff0c;实现特定任务并可返回任务执行结果的代码块&#xff08;Go 语言中的方法本质上也是函数&#xff09;。在 Go 中&#xff0c;我们定义一个函数的最常用方式就是使用函数声明。 第一部…