Web自动化测试实战--博客系统

news2024/11/26 21:18:47

  • 🎥 个人主页:Dikz12
  • 🔥个人专栏:测试
  • 📕格言:吾愚多不敏,而愿加学
  • 欢迎大家👍点赞✍评论⭐收藏 

目录

1.项目效果展示

2.编写web测试用例

3.自动化测试脚本开发 

3.1创建空项目 引入pom文件 ​

3.2 项目设计

3.4公共部分  

3.3 登录页面测试

3.4 博客列表页测试

3.4博客编辑页测试

3.5博客详情页 


1.项目效果展示

登录页面

博客列表页

博客详情页

博客编辑页

2.编写web测试用例

 

3.自动化测试脚本开发 

3.1创建空项目 引入pom文件 

    <dependencies>
        <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>5.8.0</version>
            <scope>test</scope>
        </dependency>

        <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.6</version>
        </dependency>
    </dependencies>

3.2 项目设计

 像创建驱动对象、屏幕截屏、等待,每一个测试类都是要用到的,把这些公共部分抽取出来放到common包下。登录页面、列表页面、编辑页面、详情页面所需要的测试用例放到tests包下。image 包存放屏幕截屏。

3.4公共部分  

public class Utils {
    protected static WebDriver driver;

    private 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(2));
        }
        return driver;
    }
    public Utils(String url) {
        //调用浏览器对象
        driver = createDriver();

        //访问url
        driver.get(url);
    }

    //屏幕截图
    public void getScreenShot(String str) throws IOException {

        //     ./src/test/image/
        //                     /2024-07-17/
        //                                /test01-17453010.png
        //                                /test02-17453020.png
        //                     /2024-07-18/
        //                                /test01-17453030.png
        //                                /test02-17453034.png
        //屏幕截图
        SimpleDateFormat sim1 = new SimpleDateFormat("yyyy-MM-dd");
        SimpleDateFormat sim2 = new SimpleDateFormat("HHmmssSS");

        String dirTime = sim1.format(System.currentTimeMillis());
        String fileTime = sim2.format(System.currentTimeMillis());

        //./src/test/image/2024-07-17/test01-17453020.png
        String filename ="./src/test/image/"+ dirTime +"/" + str + "-" + fileTime+".png";
        File srcFile = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE);
        //srcFile放到指定位置
        FileUtils.copyFile(srcFile,new File(filename));
    }
}

3.3 登录页面测试

1.检查页面是否可以正常打开

    /**
     * 检查页面是否可以正常打开
     */
    public void loginPageRight() {
        //通过查看页面元素是否存在来检查页面加载成功与否
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(4)"));

        //检查是否有登录按钮
        driver.findElement(By.cssSelector("#submit"));
    }

 2.检查登录功能--成功登录

    public void loginSuc() throws InterruptedException {
        //账号
        driver.findElement(By.cssSelector("#username")).sendKeys("pyuyan");
        //密码
        driver.findElement(By.cssSelector("#password")).sendKeys("123456");
        //点击提交
        driver.findElement(By.cssSelector("#submit")).click();

        //检查点击提交之后是否登录成功
        driver.findElement(By.cssSelector("body > div.container > div.left > div > h3"));
        String title = driver.getTitle();
//        System.out.println(title);
        //断言操作: 需要开启idea的断言功能
        assert title.equals("博客列表页");

        driver.navigate().back();
    }

iide断言功能需要手动打开 

-ea -Dfile.encoding=UTF-8

3.检查登录功能--登录失败

    /**
     * 检查登录功能--登录失败
     */
    public void loginFail() throws IOException, InterruptedException {
        //方法一:通过clear保证输入框没有文本
        driver.findElement(By.cssSelector("#username")).clear();
        driver.findElement(By.cssSelector("#password")).clear();

        //方法二: 通过浏览器刷新
//        driver.navigate().refresh();
        driver.findElement(By.cssSelector("#username")).sendKeys("admin111");
        driver.findElement(By.cssSelector("#password")).sendKeys("123");
        driver.findElement(By.cssSelector("#submit")).click();

//        getScreenShot(getClass().getName());
        Thread.sleep(1000);
        //失败会出现 警告弹窗
        Alert alert = driver.switchTo().alert();
        alert.accept();
    }

 4.运行结果

3.4 博客列表页测试

1.登录状态下访问列表页 

    /**
     * 登录状态下
     */
    public void listByLogin() {
        //检查页面标题是否在博客列表页
        String title = driver.getTitle();
//        System.out.println(title);
        //断言操作: 需要开启idea的断言功能
        assert title.equals("博客列表页");
    }

2.未登录状态下--访问 

    /**
     * 未登录的状态下 访问列表页
     */
    public void listNoLogin() throws IOException {
        //这里后端代码加了拦截器 未登录 就会直接跳转到登录页面
        //检查是否在登录页面
        //需要注意的是前面登录状态下,已经把登录状态给保存下来了
        //解决: 点击注销 => 保证未登录状态
        driver.findElement(By.cssSelector("body > div.nav > a:nth-child(6)")).click();
        Alert alert = driver.switchTo().alert();
        alert.accept();

        String title = driver.getTitle();

        //通过截屏查看断言失败的原因
//        getScreenShot(getClass().getName());

        assert title.equals("博客登陆页");
    }

整个运行效果:

 这里可以进行小优化,比如:博客列表页、博客编辑页、博客详情页都有未登录状态下。就可以写到一个了类中。

3.4博客编辑页测试

1.登录状态下--正常填写博客

 需要注意的是:这里代理实现博客内容,是使用的第三方插件markdown。元素可以定位到,也可以进行点击,但是不能使用sendKey 编辑文本内容,不然就会报ElementNoInteractableException异常.

 两个解决办法

  1. 博客内容本身就有默认内容,不需要手动实现
  2. 通过鼠标操作来实现

    public void editByLoginSuc() throws InterruptedException {
        //填写博客标题
        String blogTitle = "怎么使用递归算法?";
        driver.findElement(By.cssSelector("#title")).sendKeys(blogTitle);
        //无法输入博客内容---怎么办?
        //两个解决办法:
        //1)博客内容本身就有默认内容,我们不需要手动实现
        //2)通过鼠标操作来实现
//        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"));
//        ele.sendKeys("比特就业课Java110&111班级");//出现错误

        //第二种方法实现
//        1.鼠标先挪动到博客内容区域
//        2.双击鼠标将内容删掉:鼠标双击内容+键盘DELETE
//        3.输入内容
//        Thread.sleep(5000);
//        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);
//        //perform作用:为了在页面看到效果
//        actions.doubleClick(ele).perform();
//        actions.keyDown(Keys.DELETE).perform();
//        Thread.sleep(2000);
        actions.keyDown(ele, Keys.DELETE).perform();
//        Thread.sleep(2000);
//        actions.moveToElement(ele).sendKeys("1.递归概述").perform();
//        driver.findElement(By.cssSelector("#submit")).click();

        //方法一
        driver.findElement(By.cssSelector("#submit")).click();
        //检查一下博客发布之后是否成功
        String title = driver.findElement(By.cssSelector("body > div.container > div.right > div:nth-child(1) > div.title")).getText();

        assert title.equals(blogTitle);

   
    }

运行效果:

3.5博客详情页 

1.登录状态下--查看博客详情 

    public void detailSuc() {

        //检查是否在详情页
        String title = driver.getTitle();
        assert title.equals("博客详情页");

    }

 整体运行效果:

 

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

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

相关文章

构建大师:深入理解Linux下的Make和Makefile

引言 在软件开发的世界里&#xff0c;构建过程是一项繁琐而重要的任务。无论是简单的脚本还是复杂的软件项目&#xff0c;都需要一种方式来自动化编译、链接以及测试等过程。在Linux环境下&#xff0c;Make工具和它的配置文件——Makefile&#xff0c;成为了许多开发者构建项目…

计算机硬件的组成

目录 前言 计算机系统组成 计算机硬件的组成 1、控制器 2、运算器 3、主存储器 4、辅助存储器 5、输入设备 6、输出设备 最后 前言 计算机已成为不可或缺的工具。无论是个人电脑还是服务器集群&#xff0c;其背后都是由一系列硬件组件协同工作的结果。 本文讲介绍计…

ssrf攻击本地fastcgi漏洞复现

目录 环境&#xff1a;UbuntuNginxphp 代码 开始测试 查看 环境搭建 环境&#xff1a;UbuntuNginxphp 代码 <?php highlight_file(__FILE__); $url $_GET[url]; $curl curl_init($url);curl_setopt($ch,CURLOPT_URL,$url); curl_setopt($curl, CURLOPT_HEADER, 0…

滚雪球学MyBatis-Plus(02):环境准备

环境准备 本地开发环境参考如下&#xff1a; 开发工具&#xff1a;IntelliJ IDEA 2021.3.2JDK版本&#xff1a; JDK 1.8Spring Boot版本&#xff1a;2.3.1.RELEASEMaven版本&#xff1a;Apache Maven 3.8.2MySQL&#xff1a;5.6 前言 在上期内容中&#xff0c;我们系统地介绍了…

【多线程】设计模式之单例模式

&#x1f490;个人主页&#xff1a;初晴~ &#x1f4da;相关专栏&#xff1a;多线程 / javaEE初阶 一、什么是设计模式 设计模式好⽐象棋中的 "棋谱". 红⽅当头炮, ⿊⽅⻢来跳. 针对红⽅的⼀些⾛法, ⿊⽅应招的时候有⼀些固定的套路. 按照套路来⾛局势就不会吃亏. …

【微服务】接口的幂等性怎么设计?

一、什么是幂等&#xff1f; 幂等性&#xff1a;短时间内&#xff0c;对于相同输入的请求&#xff0c;无论进行多少次重复操作&#xff0c;都应该和单次调用的结果一致。 二、幂等问题产生的原因是什么&#xff1f;(或者说为什么需要实现幂等性?) 1、前端重复提交 在用户注…

高频Postman接口测试面试题

一、Postman在工作中使用流程是什么样的&#xff1f; 新建集合管理根据接口所属的模块&#xff0c;在集合中不同模块下编写接口测试用例处理接口之间的数据关联操作添加环境变量在tests tab下中增加断言调试接口&#xff0c;确保接口能被正常调用批量运行用例或者导出通过Newm…

STM32H750VBT6烧录源码无反应的问题

当烧录后出现这种情况下&#xff0c;点击魔术棒里面 Linker,勾选第一个方框后再次烧录即可。

【机器学习】聚类算法的基本概念和实例代码以及局部度量学习的概念和实例代码

引言 聚类算法在许多领域都有广泛的应用&#xff0c;例如数据挖掘、生物信息学、图像处理等。 文章目录 引言一、聚类算法1.1 K-Means算法1.2 DBSCAN算法1.3 层次聚类&#xff08;Hierarchical Clustering&#xff09;算法1.4 高斯混合模型&#xff08;Gaussian Mixture Model&…

Python系统教程02

Python 中基本运算符的使用变量基本运算符和变量编写简单的 Python 程序 一、Python 中的加法、减法、乘法、除法、 1.1 Python 中的""运算符 "" 可以用来计算两个数的和 "" 可以用来拼接 运算符可以用来计算两个数的和运算符可以连接多个字符…

Leetcode面试经典150题-36-有效数独升级版-37.解数独

解法都在代码里&#xff0c;不懂就留言或者私信&#xff0c;比第一题稍微难点 public static void solveSudoku(char[][] board) {/**定义三个二维数组分别代表行、列、桶&#xff08;每9个格子&#xff09;*/boolean[][] rowExists new boolean[9][10];boolean[][] colExist…

不用U盘重装win10/11

创建适用于 Windows 的安装介质 Windows 10 Windows 8.1 Windows 7 Microsoft 365 免费试用版正在等待你使用 立即解锁 你可以使用安装介质&#xff08;U 盘或 DVD&#xff09;来安装 Windows 的新副本、执行全新安装或重新安装 Windows。 要创建安装介质&#xff0c;请转到…

街机 CAPCOM CPS2 中英文名字与驱动对照表

Part.I 简介 本文列举了街机 CPS2 中游戏的中英文名字与其驱动的对照&#xff0c;以帮助诸位更快地找到自己想玩的游戏。 注意&#xff1a;汉化版的街机模拟器 Kawaks 中游戏的中文名字是根据英文直译的&#xff0c;并不是习惯性的中文叫法。比如『三国志』英文名为『Warriors…

安全入门day.03

一、知识点 1、抓包技术应用意义 在渗透安全方面&#xff0c;通过抓包分析&#xff0c;安全人员可以模拟黑客的攻击行为&#xff0c;对系统进行渗透测试。这种测试有助于发现系统中存在的安全漏洞和弱点。一旦发现漏洞&#xff0c;可以立即采取措施进行修复&#xff0c;从而增…

Selenium实战技巧-多页面和Windows控件处理

01 多页面处理 做UI自动化的时候常常会遇到浏览器弹出新的Tab页&#xff0c;或者需要在多个网页服务之间来回取数据的情况。 比如在首页点击文章“Jmeter使用&#xff1f;”的链接&#xff0c;浏览器会弹出一个新的页面显示“Jmeter使用&#xff1f;”这篇文章的详情。此时如…

SpringBoot教程(二十七) | SpringBoot集成AOP实现异常处理

SpringBoot教程&#xff08;二十七&#xff09; | SpringBoot集成AOP实现异常处理 前言第一步&#xff1a;统一接口返回结果1. 统一封装结果包含如下参数2. 创建 枚举HttpStatusEnum&#xff08;返回结果代码&#xff09;3. 创建 ResponseResult &#xff08;返回实体类&#x…

如何使用vcftools提取特定的染色体

起源是由于bam文件没有过滤完全&#xff0c;导致calling出来的vcf文件还有线粒体中的染色体存在&#xff0c;因为在金标准文件中只有1-22号和X染色体&#xff0c;不包含线粒体和Y染色体&#xff0c;因为我使用的金标准文件是来自NA12878&#xff0c;是一位白种人女性。因此&…

VBA代码解决方案第十七讲:如何选择一个工作表,选择多个工作表

《VBA代码解决方案》(版权10028096)这套教程是我最早推出的教程&#xff0c;目前已经是第三版修订了。这套教程定位于入门后的提高&#xff0c;在学习这套教程过程中&#xff0c;侧重点是要理解及掌握我的“积木编程”思想。要灵活运用教程中的实例像搭积木一样把自己喜欢的代码…

基于小程序的学习交流论坛的设计与实现(代码+教程)

我们将制作一个具备帖子分类、发帖、搜索、点赞回复、学习小组组建以及用户登录等功能的小程序。下面将详细阐述每个功能的实现方法&#xff0c;并提供一些关键代码片段作为参考。 需求 帖子分类&#xff1a;对用户发布的帖子分类到对应的专区&#xff08;寻人寻物&#xff0…

算法-最长连续序列

leetcode的题目链接 这道题的思路主要是要求在O&#xff08;n)的时间复杂度下&#xff0c;所以你暴力解决肯定不行&#xff0c;暴力至少两层for循环&#xff0c;所以要在O&#xff08;n)的时间复杂度下&#xff0c;你可以使用HashSet来存储数组&#xff0c;对于每个数字&#…