软件测试 —— 自动化基础
目录
·前言
一、Web 自动化测试
1.什么是 Web 自动化测试
2.驱动
3.安装驱动管理
二、Selenium
1.简单 web 自动化测试示例
2.工作原理
三、元素定位
1.cssSelector
2.XPath
四、操作测试对象
1.点击/提交对象
2.模拟按键输入
3.清除文本内容
4.获取文本信息
5.获取当前页面标题
6.获取当前页面的 URL
·总结
·前言
自动化是指自动的代替人的行为完成操作,自动化在生活中可以说是随处可见,如:自动洒水机、自动洗手液等,这些生活中的自动案例有效的减少了我们人力的消耗,同时也提高了我们的生活质量,在我们软件中的自动化测试也是如此,通过自动化测试可以有效减少人力的消耗,同时提高测试的质量和效率,本篇文章将会介绍自动化测试的一些基础知识,和一些自动化测试中常用的函数,那么就开始本篇文章的内容介绍吧。
一、Web 自动化测试
自动化也分为接口自动化和 UI 自动化,其中,UI 自动化还可以分为 Web 自动化、移动端自动化等,在我们下面的内容介绍都是在介绍 Web 自动化测试。
1.什么是 Web 自动化测试
比如在我们使用 CSDN 进行搜索时,通常需要我们先输入 CSDN 的网址进入 CSDN 界面,然后找到搜索框,输入我们要搜索的信息来进行搜索,如下图所示:
Web 自动化就可以代替我们自动的执行以上的过程,Web 自动化测试就是模拟人在浏览器上的操作行为,自动的打开浏览器,访问 CSDN 首页,并进行一系列的搜索和验证等行为。
2.驱动
上面介绍了 Web 自动化测试的第一步是要打开浏览器,通过访问浏览器界面进行一系列的操作,对于我们手工测试来说,这一系列的操作需要我们手动的,一步一步的来执行,对于我们自动化程序来说,我们编写的自动化程序又要如何打开我们的浏览器并执行我们预期的操作流程呢?这就需要说到驱动了。
驱动这词应用比较广泛,比如汽车,就是有了驱动才能跑起来的,在我们计算机上也是这样,计算机有了驱动程序才能与设备(如:耳机、摄像头、麦克风、键盘、显示器、鼠标等)进行通信,我们要想使我们编写的自动化程序打开 Web 浏览器与浏览器进行通信,也就需要安装 Web 驱动程序(即:WebDriver),WebDriver 是以本地化的方式驱动浏览器的驱动程序。
3.安装驱动管理
介绍完什么是驱动,及 WebDriver 后,我们就来安装一下 Web 驱动程序吧,在 Java 中,有一个开源的库:WebDriverManager,它是以完全自动化的方式对 Selenium WebDriver 所需的驱动程序(如:Chromedriver、geckodriver等)进行管理(即:下载、设置、维护),既然 Java 中提供了这样开源的库,那么我们安装驱动管理就十分简单了,只需要创建一个项目,使用 Maven 来管理,添加依赖,把 WebDriverManager 引入即可,添加依赖代码如下:
<dependency><groupId>io.github.bonigarcia</groupId><artifactId>webdrivermanager</artifactId><version>5.8.0</version><scope>test</scope></dependency>
二、Selenium
进行完上述的工作后,接下来就是使用 Selenium 来编写 Web 自动化测试脚本了,Selenium 是一个 Web 自动化测试工具,Selenium 中提供了丰富的方法供给我们来进行 Web 自动化测试。
1.简单 web 自动化测试示例
在编写代码之前,我们要先安装 Selenium 库,这也是 Java 中一个开源的库,所以我们之间在 pom.xml 中添加依赖即可,添加依赖代码如下:
<dependency><groupId>org.seleniumhq.selenium</groupId><artifactId>selenium-java</artifactId><version>4.0.0</version></dependency>
下面我们就来利用 Selenium 编写一段简单的 Web 自动化测试的代码,这里我们要做的事情是:打开浏览器,使用百度搜索彭于晏,具体的代码及详细介绍如下所示:
public class Test {// 测试百度搜索关键词: 彭于晏void searchTest() throws InterruptedException {// 1. 创建驱动对象, 打开浏览器WebDriverManager.chromedriver().setup();// 2.增加浏览器配置, 创建驱动对象要强制指定允许访问所有链接ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");WebDriver webDriver = new ChromeDriver(options);// 3. 输入完整的网址: https:www.baidu.comwebDriver.get("https://www.baidu.com/");// 4. 找到输入框, 并输入关键词: 彭于晏webDriver.findElement(By.cssSelector("#kw")).sendKeys("彭于晏");// 休眠 3 秒,观察效果Thread.sleep(3000);// 5. 找到 "百度一下" 按钮, 并点击webDriver.findElement(By.cssSelector("#su")).click();// 休眠 3 秒,观察效果Thread.sleep(3000);// 6. 关闭浏览器webDriver.quit();}
}
我们使用 Test 类来编写测试方法,额外再创建一个 RunTest 类来运行我们的测试方法,代码及运行结果如下所示:
public class RunTest {public static void main(String[] args) throws InterruptedException {Test test = new Test();test.searchTest();}
}
上述执行过程中,我鼠标只进行点击运行的操作,剩下都是自动化程序自动帮我们做的事。
2.工作原理
实现 Web 自动化测试需要浏览器、浏览器驱动、Selenium 自动化脚本,这三者是如何交互最终实现 Web 的自动化测试的呢?如下图所示:
具体步骤如下:
- 通过 Selenium 编写的自动化脚本代码中在 ChromeDriverService 中创建一个服务;
- 通过创建好的服务打开 WebDriver,该服务地址为 Selenium 向 WebDriver 发送请求的服务地址;
- 向浏览器驱动程序发送 HTTP 请求,浏览器驱动程序解析请求,打开浏览器,并获得 sessionid,如果再次对浏览器操作需要携带此 id;
- 打开浏览器后,所有的 Selenium 的操作(如:访问地址、查找元素等)均通过创建好的服务连接到 WebDriver,然后使用 execute 发送请求;
- 驱动收到请求并对请求进行解析,转成浏览器能够解析的脚步并发送给浏览器,浏览器通过请求的内容执行对应动作;
- 浏览器再把执行的动作结果通过浏览器驱动程序返回给测试脚本。
在我们刚才执行的 Selenium 编写的自动化脚本代码中,我们可以在终端看见创建的驱动服务地址,如下图所示:
三、元素定位
我们在进行 Web 自动化测试的操作核心就是能够找到页面对应的元素,然后才能对元素进行具体的操作。常见的元素定位方式有很多,如:id、classname、tagname、XPath、cssSelector,其中常用的主要是 cssSelector 和 XPath。
1.cssSelector
选择器的功能是选中页面中指定的标签元素,选择器的种类分为基础选择器和复合选择器,常见的元素定位方式可以通过 id 选择器和子类选择器来进行定位,我们上面编写的自动化测试代码中是如何定位到搜索框与“百度一下”按钮的呢?定位的过程如下图所示:
Copy 之后,我们就可以定位到搜索框的位置了,如下图所示:
此时我们就可以在编写自动化测试代码中使用 “#kw” 来定位搜索框的元素,并对其进行相应的操作了。
2.XPath
介绍完 cssSelector 定位元素的方式后,其实 XPath 做的事情也是一样的,XPath 是 XML 路径语言,不仅可以在 XML 文件中查找信息,还可以在 HTML 中选取节点,XPath 使用路径表达式来选择 XML 文档中的节点,在 XPath 语法中, “//*” 是获取 HTML 页面所有的节点,如下图所示:
使用 //[指定节点] 来获取 HTML 页面指定的节点,如下图所示:
使用 / 来获取一个节点中的直接子节点,如下图所示:
使用 [@....] ,可以实现节点属性的匹配,如下图所示:
当然,XPath 也可以使用 cssSelector 中的方式来更便捷的生成,如下图所示:
手动复制的 selector / XPath 的表达式不一定满足唯一性的要求,即:复制的表达式会对应不同的多个元素,这时就需要我们进行手动修改表达式,使它可以唯一定位一个元素,这就需要用到我们前面介绍的内容了。
四、操作测试对象
获取到了页面的元素之后,我们就可以对元素进行操作了,这里我们常见的操作有:点击、提交、输入、清空、获取文本。
1.点击/提交对象
这里我们使用的函数是 click(),具体使用代码如下所示:
// 找到 "百度一下" 按钮, 并点击
driver.findElement(By.cssSelector("#su")).click();
2.模拟按键输入
这里我们使用的函数是 sendKeys(""),具体使用的代码如下所示:
// 找到输入框, 并输入关键词: 彭于晏
driver.findElement(By.cssSelector("#kw")).sendKeys("彭于晏");
3.清除文本内容
当我们搜索完一条信息后,想要再换一个关键词搜索,直接调用 sendKeys("") 函数可以吗?我们来编写代码运行一下观察结果,具体代码及运行结果如下所示:
public class Test {WebDriver driver;void createDriver() {// 1. 创建驱动对象, 打开浏览器WebDriverManager.chromedriver().setup();// 2. 增加浏览器配置, 创建驱动对象要强制指定允许访问所有链接ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");driver = new ChromeDriver(options);// 3. 输入完整的网址: https:www.baidu.comdriver.get("https://www.baidu.com/");}// 操作元素void test03() throws InterruptedException {createDriver();WebElement element = driver.findElement(By.cssSelector("#kw"));element.sendKeys("彭于晏");Thread.sleep(3000);element.sendKeys("古力娜扎");Thread.sleep(3000);driver.quit();}}
可以通过上面运行过程可以看出, 想换一个关键词进行搜索直接使用 sendKeys("") 函数的效果就是直接在原本的关键词后面拼接新关键词,这显然是不科学的,那么为了可以正确的切换搜索内容,我们就要使用到 clear() 函数,来清空我们先前搜索框的内容,再使用 sendKeys("") 来进行搜索,具体代码及运行结果如下:
void test03() throws InterruptedException {createDriver();WebElement element = driver.findElement(By.cssSelector("#kw"));element.sendKeys("彭于晏");Thread.sleep(3000);element.clear();element.sendKeys("古力娜扎");Thread.sleep(3000);driver.quit();}
4.获取文本信息
如何判断获取到的元素对应的文本是否符合预期呢?我们可以使用 getText() 函数来把获取元素对应的文本信息进行打印,来观察,具体使用代码及运行结果如下所示:
public class Test {WebDriver driver;void createDriver() {// 1. 创建驱动对象, 打开浏览器WebDriverManager.chromedriver().setup();// 2. 增加浏览器配置, 创建驱动对象要强制指定允许访问所有链接ChromeOptions options = new ChromeOptions();options.addArguments("--remote-allow-origins=*");driver = new ChromeDriver(options);// 3. 输入完整的网址: https:www.baidu.comdriver.get("https://www.baidu.com/");}// 获取文本信息void test04() {createDriver();WebElement element = driver.findElement(By.cssSelector("#hotsearch-content-wrapper > li:nth-child(4) > a > span.title-content-title"));System.out.println("元素文本信息为: " + element.getText());driver.quit();}
}
如上图所示,获取文本信息正确。
这里我们要注意一点,页面上展示的数据不全是文本数据,比如 “百度一下” 按钮上的文字,如下图所示: 此时使用 getText() 函数是无法获取到的,操作代码及运行结果如下所示:
void test04() throws InterruptedException {createDriver();WebElement element = driver.findElement(By.cssSelector("#su"));System.out.println("获取百度一下按钮的文本信息: " + element.getText());driver.quit();}
显然没有获取到信息,那么如何获取属性信息呢?这就需要使用 getAttribute("属性名称") 函数来获取了,具体代码及运行结果如下所示:
void test04() throws InterruptedException {createDriver();WebElement element = driver.findElement(By.cssSelector("#su"));System.out.println("获取百度一下按钮的 value 属性值: " + element.getAttribute("value"));driver.quit();}
5.获取当前页面标题
这里我们使用的函数是 getTitle(),具体使用代码如下所示:
// 获取当前页面标题
driver.getTitle();
6.获取当前页面的 URL
这里我们使用的函数是 getCurrentUrl(),具体使用代码如下所示:
// 获取当前页面的 URL
driver.getCurrentUrl();
关于函数 getTitle() 与 getCurrentUrl() 的具体使用代码及运行结果如下所示:
void test04() throws InterruptedException {createDriver();System.out.println(driver.getTitle());System.out.println(driver.getCurrentUrl());driver.quit();}
·总结
文章到这里就要结束了,本篇文章介绍了一下自动化测试的基本概念,与一些在 Selenium 中进行自动化测试脚本编写使用的常见函数,文章作为自动化测试的第一篇文章主要是想带大家认识一下自动化测试,并感受一下自动化测试的效果,如果对文章内容有所疑惑,欢迎在评论区进行留言,如果感觉本篇文章还不错希望能收到你的三连支持,那么我们下一篇文章再见吧~~~
相关文章:

软件测试 —— 自动化基础
目录 前言 一、Web 自动化测试 1.什么是 Web 自动化测试 2.驱动 3.安装驱动管理 二、Selenium 1.简单 web 自动化测试示例 2.工作原理 三、元素定位 1.cssSelector 2.XPath 四、操作测试对象 1.点击/提交对象 2.模拟按键输入 3.清除文本内容 4.获取文本信息 5.…...

深入解析 OpenHarmony 构建系统-4-OHOSLoader类
在OpenHarmony操作系统构建过程中,OHOSLoader类扮演着至关重要的角色。这个类负责加载和解析构建配置,生成必要的构建文件,并确保构建过程的顺利进行。本文将深入分析OHOSLoader类的实现细节,揭示其如何管理构建配置,并…...

【Android、IOS、Flutter、鸿蒙、ReactNative 】实现 MVP 架构
Android Studio 版本 Android Java MVP 模式 参考 模型层 model public class User {private String email;private String password;public User(String email, String password) {this.email = email;this.password = password;}public String getEmail() {return email;}…...

排序算法(基础)大全
一、排序算法的作用: 排序算法的主要作用是将一组数据按照特定的顺序进行排列,使得数据更加有序和有组织。 1. 查找效率:通过将数据进行排序,可以提高查找算法的效率。在有序的数据中,可以使用更加高效的查找算法&…...

Pytest从入门到精通
一、pytest单元测试框架 (1)什么是单元测试框架 单元测试是指在软件开发当中,针对软件的最小单位(函数,方法)进行正确性的检查测试。 (2)单元测试框架 java : junit和testng python : unittest和pytest (3)单元测试框架主要做什么? 1.测试发现:从多个文件里面去找到我们测试…...

《C++ 实现生成多个弹窗程序》
《C 实现生成多个弹窗程序》 在 C 编程中,我们可以利用特定的系统函数来创建弹窗,实现向用户展示信息等功能。当需要生成多个弹窗时,我们可以通过循环结构等方式来达成这一目的。 一、所需头文件及函数介绍 在 Windows 操作系统环境下&#…...

react 中 useRef Hook 作用
useRef是一个非常实用的钩子函数 一、访问和操作 DOM 元素 1. 获取 DOM 元素引用 1.1 基本原理 通过 useRef 我们可以直接操作 DOM 元素 1.2 代码示例 import React, { useRef, useEffect } from "react";const InputFocusComponent () > {const inputRef …...

Scala-键盘输入(StdIn)-用法详解
Scala 在 Scala 中,进行 键盘输入 主要通过 scala.io.StdIn 包来实现。 StdIn 提供了几个方法,用于从用户的键盘输入中读取不同类型的数据,如字符串、整数、浮点数等。 常用的输入方法有 readLine()、readInt()、readDouble()、readShort(…...

力扣(LeetCode)283. 移动零(Java)
White graces:个人主页 🙉专栏推荐:Java入门知识🙉 🐹今日诗词:雾失楼台,月迷津渡🐹 ⛳️点赞 ☀️收藏⭐️关注💬卑微小博主🙏 ⛳️点赞 ☀️收藏⭐️关注💬卑微小博主…...

ESP32C3单片机使用笔记---烧录MicroPython
使用MicroPython在ESP32C3单片机上编程,首先需要将MicroPython运行环境烧录到ESP32C3的Flash中去,步骤如下: 1.下载esptool烧录工具,下载地址: https://github.com/espressif/esptool 直接使用git clone git clone…...

Matter1.4重磅来袭,智能家居进入“互联”新纪元
近日,连接标准联盟(CSA)正式宣布推出最新的Matter1.4标准版本,并更新了一系列“史诗级”的增强功能,旨在提升现有智能家居之间的互操作性与兼容性,为智能家居用户带来更流畅的使用体验。 华普微,…...

tdengine学习笔记
官方文档:用 Docker 快速体验 TDengine | TDengine 文档 | 涛思数据 整体架构 TDENGINE是分布式,高可靠,支持水平扩展的架构设计 TDengine分布式架构的逻辑结构图如下 一个完整的 TDengine 系统是运行在一到多个物理节点上的,包含…...

机器学习-36-对ML的思考之机器学习研究的初衷及科学研究的期望
文章目录 1 机器学习最初的样子1.1 知识工程诞生(专家系统)1.2 知识工程高潮期1.3 专家系统的瓶颈(知识获取)1.4 机器学习研究的初衷2 科学研究对机器学习的期望2.1 面向科学研究的机器学习轮廓2.2 机器学习及其应用研讨会2.3 智能信息处理系列研讨会2.4 机器学习对科学研究的重…...

Linux 进程信号的产生
目录 0.前言 1. 通过终端按键产生信号 1.1 CtrlC:发送 SIGINT 信号 1.2 Ctrl\:发送 SIGQUIT 信号 1.3 CtrlZ:发送 SIGTSTP 信号 2.调用系统命令向进程发信号 3.使用函数产生信号 3.1 kill 函数 3.2 raise 函数 3.3 abort 函数 4.由软件条件产…...

CentOS8 在MySQL8.0 实现半同步复制
#原理 MySQL默认是异步的,不要求必须全部同步到从节点才返回成功结果; 同步复制: 用户发请求到代理, 代理收到请求后写/更新数据库写入到二进制日志bin_log, 然后必须等数据发到所有的从节点, 从节点全部收到数据后, 主节点才返回给客户端的成功结果。 弊端: 客…...

数据分析——Python绘制实时的动态折线图
最近在做视觉应用开发,有个需求需要实时获取当前识别到的位姿点位是否有突变,从而确认是否是视觉算法的问题,发现Python的Matplotlib进行绘制比较方便。 目录 1.数据绘制2.绘制实时的动态折线图3.保存实时数据到CSV文件中 import matplotlib.…...

【Redis】Redis的一些应用场景及使用策略
应用的场景 Redis 是一个高性能的内存数据库,广泛用于各种应用场景,以下是一些常见的应用场景: 缓存:Redis 的高读写性能使其非常适合作为缓存层,存储频繁访问的数据以减少数据库负载和加快响应时间。例如,…...

CentOS 8 安装 chronyd 服务
操作场景 目前原生 CentOS 8 不支持安装 ntp 服务,因此会发生时间不准的问题,需使用 chronyd 来调整时间服务。CentOS 8以及 TencentOS 3.1及以上版本的实例都使用 chronyd 服务实现时钟同步。本文介绍了如何在 CentOS 8 操作系统的腾讯云服务器上安装并…...

HarmonyOS ArkUI(基于ArkTS) 常用组件
一 Button 按钮 Button是按钮组件,通常用于响应用户的点击操作,可以加子组件 Button(我是button)Button(){Text(我是button)}type 按钮类型 Button有三种可选类型,分别为胶囊类型(Capsule)、圆形按钮(Circle…...

不用来回切换,一个界面管理多个微信
你是不是也有多个微信号需要管理? 是不是也觉得频繁切换账号很麻烦? 是不是也想提升多账号管理的效率? 在工作中,好的辅助工具,能让我们的效率加倍增长! 今天, 就给大家分享一个多微管理工具…...

MySQL系统优化
文章目录 MySQL系统优化第一章:引言第二章:MySQL服务架构优化1. 读写分离2. 水平分区与垂直分区3. 缓存策略 第三章:MySQL配置优化1. 内存分配优化Buffer Pool 的优化查询缓存与表缓存Key Buffer 2. 连接优化最大连接数会话超时连接池 3. 日志…...

若依笔记(八):芋道的Docker容器化部署
目录 增加环境变量 DockerFile与镜像制作 nginx配置 vue3前端工程 首先搞个ECS阿里主机,1核4g足够,最大程度保证是docker运行来减少主机资源占用,同时因为是公有云,端口策略安全很重要,每个对外服务的端口要通过安全组放开; mysql的docker使用8版本,启动时候给my.cn…...

前端隐藏元素的方式有哪些?HTML 和 CSS 中隐藏元素的多种方法
当面试官突然问你:“前端隐藏元素的方式有哪些?”你还是只知道 display: none 吗? 其实,在前端开发的世界里,隐藏元素的方法非常多。每种方法都有自己的小技巧和使用场景,了解它们不仅能让你应对自如&…...

sqli—labs靶场 5-8关 (每日4关练习)持续更新!!!
Less-5 上来先进行查看是否有注入点,判断闭合方式,查询数据列数,用union联合注入查看回显位,发现到这一步的时候,和前四道题不太一样了,竟然没有回显位??? 我们看一下源…...

【Java】异常处理实例解析
文章目录 Java异常处理实例解析Example01_2023yang:未处理的异常Example02_2023yang:捕获并处理异常Example03_2023yang:finally块的使用Example04_2023yang:自定义异常Example05_2023yang:忽略异常信息Example06_2023…...

flutter调试
上面的调试The following FormatException was thrown while handling a gesture: Invalid double -Infinity874When the exception was thrown, this was the stack: #0 double.parse (dart:core-patch/double_patch.dart:113:28) #1 _CalculatorScreenState._butt…...

使用Web Workers提升JavaScript的并行处理能力
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 使用Web Workers提升JavaScript的并行处理能力 使用Web Workers提升JavaScript的并行处理能力 使用Web Workers提升JavaScript的…...

【含开题报告+文档+PPT+源码】基于Spring Boot智能综合交通出行管理平台的设计与实现
开题报告 随着城市规模的不断扩大和交通拥堵问题的日益严重,综合交通出行管理平台的研究与实现显得尤为重要。现代城市居民对于出行的需求越来越多样化,对于交通信息的获取和处理能力也提出了更高的要求。传统的交通管理方式已经难以满足这些需求&#…...

STM32寄存器结构体详解
一、寄存器结构体详解 对于STM32而言,使用一个结构体将一个外设的所有寄存器都放到一起 二、修改驱动 1、添加清除bss段代码 2、添加寄存器结构体 在寄存器结构体中添加寄存器的时候一定要注意地址的连续性,如果地址不连续的话,要添加占位…...

如何建立devops?
要建立DevOps系统,可以遵循以下步骤: 一、明确目标与确立原则 明确目标:确定DevOps系统的总体目标,例如提高软件发布频率、缩短反馈时间、提升软件质量等。确立原则:确立DevOps的核心原则,包括持续集成&a…...