12. 自动化项目实战

news2025/1/21 2:51:27

目录

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);
    }
}

测试成功:

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

牛客小白月赛77 D-小Why的密码锁 双哈希做法

这道题没卡自然溢出的哈希&#xff0c;但mod为1e9的哈希被卡了。 双哈希只需把单哈希做法中的lst和ans转换成 <PII&#xff0c; int>类型的即可。 #include<bits/stdc.h> #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0); #define endl \nusing nam…

使用Docker安装和部署kkFileView

&#x1f388;1 参考文档 kkFileView官方文档 &#x1f680;2 安装kkFileView 拉取Redis镜像。 docker pull keking/kkfileview启动docker容器。 docker run -it -d -p 8012:8012 keking/kkfileview --restart always解释&#xff1a; docker run redis # 从kkfileview镜像运行…

ArcGIS Pro实践技术应用、制图、空间分析、影像分析、三维建模、空间统计分析与建模、python融合

GIS是利用电子计算机及其外部设备&#xff0c;采集、存储、分析和描述整个或部分地球表面与空间信息系统。简单地讲&#xff0c;它是在一定的地域内&#xff0c;将地理空间信息和 一些与该地域地理信息相关的属性信息结合起来&#xff0c;达到对地理和属性信息的综合管理。GIS的…

c语言每日一练(13)

前言&#xff1a;每日一练系列&#xff0c;每一期都包含5道选择题&#xff0c;2道编程题&#xff0c;博主会尽可能详细地进行讲解&#xff0c;令初学者也能听的清晰。每日一练系列会持续更新&#xff0c;上学期间将看学业情况更新。 五道选择题&#xff1a; 1、程序运行的结果…

理解 std::thread::join

C多线程并发编程入门&#xff08;目录&#xff09; 本文用最简单易懂的实际案例&#xff0c;讲清楚了 join 的实际内涵&#xff0c;保证你过目不忘。 Hello join 示例 join 函数是我们接触C多线程 thread 遇到的第一个函数。 比如&#xff1a; int main() {thread t(f);t.…

苹果Mac系统如何优化流畅的运行?提高运行速度

Mac系统的稳定性和流畅性一直备受大家称赞&#xff0c;这也是大多数人选择Mac的原因&#xff0c;尽管如此&#xff0c;我们仍不时地对Mac进行优化、调整&#xff0c;以使其比以前更快、更流畅地运行。以下是小编分享给各位的Mac优化方法&#xff0c;记得保存哦~ 一、释放被过度…

linux深入理解多进程间通信(未完)

1.进程间通信 1.1 进程间通信目的 数据传输&#xff1a;一个进程需要将它的数据发送给另一个进程资源共享&#xff1a;多个进程之间共享同样的资源。通知事件&#xff1a;一个进程需要向另一个或一组进程发送消息&#xff0c;通知它&#xff08;它们&#xff09;发生了某种事件…

MySQL总复习

目录 登录 显示数据库 创建数据库 删除数据库 使用数据库 创建表 添加数据表数据 查询表 添加数据表多条数据 查询表中某数据 增insert 删delete 改update 查select ​ where like ​编辑 范围查找 order by 聚合函数 count max min sum avg g…

创建2个线程并执行(STL/Windows/Linux)

C并发编程入门 目录 STL 写法 #include <thread> #include <iostream> using namespace std;void thread_fun1(void) {cout << "one STL thread 1!" << endl; }void thread_fun2(void) {cout << "one STL thread 2!" <…

ip地址、LINUX、与虚拟机

子网掩码&#xff0c;是用来固定网络号的&#xff0c;例如255&#xff0c;255,255,0&#xff0c;表明前面三段必须为网络号&#xff0c;后面必须是主机号&#xff0c;那么怎么实现网络复用呢&#xff0c;例如使用c类地址&#xff0c;但是正常子网掩码是255&#xff0c;255,255,…

抽象轻松的C语言

#include <stdio.h> /* 预处理指令*/ /* 函数 */ int main() {int log 3.14;printf("hello word * %d\n easy", log);getchar();/* 获取键盘输入的字母&#xff0c;在这个程序中的作用是防止程序瞬间关闭 */return 0; } 上一篇说过&#xff0c;C程序是C语言的…

linux系统中串口驱动框架基本分析(经典)

第一&#xff1a;区分不同的终端类型 串行端口终端&#xff08;/dev/ttySn&#xff09; 串行端口终端&#xff08;Serial Port Terminal&#xff09;是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。 有段时间这些串行端口设备通常被称为终…

CXL寄存器介绍(2)- CXL DVSEC

&#x1f525;点击查看精选 CXL 系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#xff0c…

4.0 Spring与Dubbo整合原理与源码分析

#Dubbo# 文章介绍 Dubbo中propertie文件解析以及处理原理Dubbo中@Service注解解析以及处理原理Dubbo中@Reference注解解析以及处理原理1.0 整体架构和流程 应用启动类与配置 public class Application {public static void main(String[] args) throws Exception {Annotation…

Idea中 css 、js 压缩插件会自动生成xxx.min.css、xxx.min.js文件

第一步&#xff1a;下载yuicompressor-2.4.8.jar 下载路径&#xff1a;打开搜索 YUI compressor Maven Repository: Search/Browse/Explore (mvnrepository.com)https://mvnrepository.com/ 找到点击下载即用&#xff08;如下图&#xff09; 创建文件夹&#xff0c;放入idea文…

进制转换(二进制、八进制、十六进制、十进制)

一、进制表示 二进制&#xff1a;每一位只有两种符号表示 -> 0,1 例如 (101011)₂&#xff0c;也可写作101011B&#xff0c;其中B是Binary英文的缩写。八进制&#xff1a; 每一位有8种符号表示(0~7)&#xff0c;例如(1652)₈&#xff0c;也可写作1652O&#xff0c;其中O是O…

如何查看Windows下软件使用的端口号和PID

文章目录 解决方法 解决方法 打开资源管理器&#xff1a;按下Win R&#xff0c;输入"resmon"&#xff0c;然后按Enter键 在资源监视器窗口中&#xff0c;切换到"网络"选项卡。 在"侦听端口"部分&#xff0c;你可以看到正在使用的端口号和PID…

Android——基本控件(下)(二十一)

1. 数据存储 1.1 知识点 &#xff08;1&#xff09;掌握Android数据存储的分类&#xff1b; &#xff08;2&#xff09;可以使用SharedPreferences存储数据。 1.2 具体内容 对于我们数据的存储而言&#xff0c;Android一共提供了5个数据存储的方式&#xff1a;SharedPrefe…

JS算法与树(二)

前言 二叉搜索树&#xff08;BST&#xff09;存在一个问题&#xff1a;当你添加的节点数够多的时候&#xff0c;树的一边可能会非常的深。而其他的分支却只有几层。 AVL树 为了解决上面的问题&#xff0c;我们提出一种自平衡二叉搜索树。意思是任何一个节点左右两侧子树的高度之…

NTT功能与实现

NTT的基础功用与拓展功能: 1.evaluate和interpolate evaluate的本质是选择n个点(假设f(x)的度为n)&#xff0c;计算得到其值&#xff0c;因此根据定义可以直接进行代入计算。为了加快计算的过程选取 w n w_n wn​的幂次(DFT问题即离散傅里叶变换)&#xff0c;使用FFT算法来加…