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

  • 🎥 个人主页: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();//访问urldriver.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.pngString 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.rhkb.cn/news/413493.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Web-gpt

AJAX AJAX&#xff08;Asynchronous JavaScript and XML&#xff0c;异步JavaScript和XML&#xff09;是一种用于创建动态网页应用的技术。它允许网页在不重新加载整个页面的情况下&#xff0c;异步地从服务器请求数据&#xff0c;并将这些数据更新到网页上。这提高了用户体验…

大语言模型-GLM-General Language Model Pretraining

一、背景信息&#xff1a; GLM是2020-2021年由智谱AI研究并发布的预训练语言模型。 GLM是一种基于自回归空白填充的通用预训练语言模型。 GLM 通过添加二维位置编码和允许任意顺序预测空白区域&#xff0c;改进了空白填充预训练&#xff0c;在NLU任务上超越了 BERT 和 T5。 GL…

12 对话模型微调2

1 P-Tuning P-Tuning 是在 Prompt-Tuning的基础上&#xff0c;通过新增 LSTM 或 MLP 编码模块来加速模型的收敛&#xff1b; 之前的实验也看到了使用prompt训练速度很慢&#xff0c;那么P-Tuning呢 参数占比&#xff1a; trainable params: 5,267,456 || all params: 1,308,37…

Llamaindex RAG实践

加入xtunert文档作为提示词 让大模型理解xtuner

Python 算法交易实验85 QTV200日常推进-钳制指标与交易量

说明 继续保持思考与尝试 最近挺有意思的&#xff0c;碰到很多技术上的问题&#xff0c;其解决方案都类似“阴阳两仪”的概念。 "阴阳两仪"是中国古代哲学中的一个重要概念&#xff0c;源自《易经》&#xff08;又称《周易》&#xff09;。它是对宇宙间最基本对立统一…

Java数据结构(七)——优先级队列与PriorityQueue

文章目录 优先级队列与PriorityQueue堆基本概念和性质建堆堆的插入堆的删除堆的应用 PriorityQueuePriorityQueue的构造方法PriorityQueue的常用方法PriorityQueue的模拟实现 经典TopK问题 优先级队列与PriorityQueue 优先级队列是一种特殊类型的队列&#xff0c;其中元素按照…

audiocraft - 免费文本转音乐、AI音乐生成、AI音乐创作工具,Facebook开源,本地一键整合包下载

AudioCraft 是一个由Facebook Research开发的PyTorch库&#xff0c;专注于深度学习在音频生成领域的研究。这个强大的工具包集成了两个最新的AI音频生成模型&#xff1a;AudioGen和MusicGen&#xff0c;能够产生高质量的声音和音乐。 今天的一键包也包含了 AudioGen 和 MusicG…

java一键生成数据库说明文档html格式

要验收项目了&#xff0c;要写数据库文档&#xff0c;一大堆表太费劲了&#xff0c;直接生成一个吧&#xff0c;本来想用个别人的轮子&#xff0c;网上看了几个&#xff0c;感觉效果不怎么好&#xff0c;自己动手写一个吧。抽空再把字典表补充进去就OK了 先看效果&#xff1a; …

如何使用Smart-Doc高效生成Java WebSocket接口文档

前言 Smart-Doc 是一款强大的文档生成工具&#xff0c;可以帮助开发者轻松地为Java 项目生成清晰、详细的 API 文档。随着WebSocket技术的普及&#xff0c;Smart-Doc 在3.0.7版本开始也增加了对 WebSocket 接口的支持。本文将详细介绍如何使用 Smart-Doc 生成 Java WebSocket …

最简单监控方案:域名、证书 SSL、服务器全搞定!发送钉钉告警消息

需求 有时候域名太多&#xff0c;时间一长&#xff0c;你会不记得快要续期了服务器太多&#xff0c;需要监控&#xff0c;这应该是刚需证书申请来申请去&#xff0c;自动续签鬼知道会不会出问题 痛点 监控还要安装各种东西&#xff0c;会出岔子&#xff0c;折腾够呛&#xf…

C++ 洛谷 哈希表(对应题库:哈希,hash)习题集及代码

马上就开学了&#xff0c;又一个卷季&#xff0c;不写点东西怎么行呢&#xff1f;辣么&#xff0c;我不准备写那些dalao们都懂得&#xff0c;熟练的&#xff0c;想来想去&#xff0c;最终还是写哈希表吧&#xff01;提供讲解&题目&代码解析哦&#xff01; 奉上题目链接…

软件测试——论坛系统测试用例

功能测试 其他测试 测试用例 用例编号 用例描述 优先级 预置条件 操作步骤 测试数据 预期结果 测试结果Bug ID软件版本测试员SNS_User_Register_001注册成功使用合法的数据成功注册一个新账号P11、已打开注册页面 2、准备一个未注册用户信息1、输入用户昵称 2、输入用户名 3、…

【前端开发必备小技巧】前端代码规范Vue篇

文章目录 &#x1f7e2; 前端代码规范&#x1f7e2; 一、前端代码规范Vue篇&#x1f449;1、Vue编码基础&#x1f449;1.1、组件规范&#x1f449;1.2、模板中使用简单的表达式&#x1f449;1.3、指令都使用缩写形式&#x1f449;1.4、 标签顺序保持一致&#x1f449;1.5、必须…

【IEEE独立出版 | 往届快至会后2个月检索】2024年第四届电子信息工程与计算机科学国际会议(EIECS 2024,9月27-29)

2024年第四届电子信息工程与计算机科学国际会议&#xff08;EIECS 2024&#xff09;将于2024年9月27日至29日在中国延吉举行。会议由长春理工大学主办&#xff0c;延边大学、长春理工大学电子信息工程学院、长春理工大学计算机学院、长春理工大学人工智能学院承办&#xff0c;多…

生产环境变态开启devtools(redux篇)

前沿 默认都安装了谷歌的redux-devtools插件哦 没有亮,说明关闭了生产环境的redux devtools工具, 接下来跟着博主一起变态启用它 如果看了我上一篇的小伙伴,应该会很熟练了,如果没有看上一篇的,也没关系,博主会手摸手的教你们打开它。 正常的解决方案(适用内部开发人员…

学院个人信息|基于SprinBoot+vue的学院个人信息管理系统(源码+数据库+文档)

学院个人信息管理系统基于SprinBootvue的学院个人信息管理系统 一、前言 二、系统设计 三、系统功能设计 系统功能实现 后台模块实现 管理员模块实现 学生模块实现 教师模块实现 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获…

浅谈常见的分布式ID生成方案

一、UUID UUID是通用唯一标识码的缩写&#xff0c;其目的是让分布式系统中的所有元素都有唯一的辨识信息&#xff0c;而不需要通过中央控制器来指定唯一标识。 优点&#xff1a; &#xff08;1&#xff09;降低全局节点的压力&#xff0c;使得主键生成速度更快&#xff1b; &…

青蛙跳台阶与汉诺塔问题

hello&#xff0c;各位小伙伴们上次我们复习了C语言小tip之函数递归&#xff0c;这次我们来使用函数递归来完成青蛙跳台阶和汉诺塔问题&#xff01; 青蛙跳台阶问题 青蛙跳台阶问题&#xff1a;一只青蛙跳n阶台阶&#xff0c;一次可以跳1阶或者两阶&#xff0c;问有多少种情况…

list类底层逻辑实现

list的底层逻辑是一个双向带头链表。那么list的底层其实就跟我们之前实现的带头双向链表相同&#xff0c;都是开辟一个一个单独的节点&#xff0c;最后再通过指针将各个单独的节点链接起来即可。 我们来类比之前编写的双向带头链表实现具体的内容。 创建一个list类的主体 就像我…

Bazel 快速入门与核心知识

Bazel 快速入门与核心知识 Bazel 简介 Bazel 是一款与 Make、Maven 和 Gradle 类似的开源构建和测试工具。 它使用人类可读的高级构建语言。Bazel 支持多种语言的项目 (C/C, Java, Python, …)&#xff0c;可为多个平台构建输出。Bazel 支持跨多个代码库和大量用户的大型代码…